ConcurrentHashMap部分源码简析
ConcurrentHashMap部分源码简析本文参考:java-并发-ConcurrentHashMap高并发机制-jdk1.8_阿里Darker-CSDN博客
核心属性或方法table123456/** * The array of bins. Lazily initialized upon first insertion. * Size is always a power of two. Accessed directly by iterators. *///盛装Node元素的数组 它的大小是2的整数次幂transient volatile Node<K,V>[] table;
sizeCtl123456789101112/** * Table initialization and resizing control. When negative, the * table is being initialized or resized: -1 for initialization, * else -(1 + the number of act ...
ArrayList部分源码简析
ArrayList部分源码简析有参构造ArrayList12345678910111213141516171819/** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */public ArrayList(int initialCapacity) { //如果初始容量大于0 if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; //等于0 } else if (initialCapacity == 0) { thi ...
HashMap部分源码简析
HashMap部分源码简析有参构造HashMap1234567891011121314151617181920212223/** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and load factor. * * @param initialCapacity the initial capacity * @param loadFactor the load factor * @throws IllegalArgumentException if the initial capacity is negative * or the load factor is nonpositive *///容量、负载因子public HashMap(int initialCapacity, float loadFactor) { if (initialCapac ...
力扣LRU缓存题解
力扣LRU缓存题解题目链接:146. LRU 缓存机制 - 力扣(LeetCode) (leetcode-cn.com)
思路:题目要求尽量用O(1)的时间复杂度,查找用hash表,插入删除用链表
解法1利用LinkedHashMap
12345678910111213141516171819202122232425262728293031class LRUCache { LinkedHashMap<Integer, Integer> linkedHashMap=null; public LRUCache(int capacity) { //capacity:容量 //0.75f:负载因子 //true:将get后的数据删除,然后重新放到链表头部 linkedHashMap = new LinkedHashMap<>(capacity,0.75f,true){ //当链表长度超过容量时,删除尾部的元素 @Override ...
工厂模式
工厂模式本文参考于:工厂模式 | 菜鸟教程 (runoob.com),设计模式篇——工厂模式详解 - 知乎 (zhihu.com)
工厂方法创建接口Human123456public interface Human { /** * 打印肤色 */ void printColor();}
编写实体类BlackHuman123456public class BlackHuman implements Human{ @Override public void printColor() { System.out.println("黑种人"); }}
WhiteHuman123456public class WhiteHuman implements Human{ @Override public void printColor() { System.out.println("白种人"); ...
流式计算
流式计算流的基本方法:java1.8新特性之stream流式算法 - 王者之巅 - 博客园 (cnblogs.com)
举例题目要求123456789/** * 题目:请按照给出数据,找出同时满足以下条件的用户 * 也即以下条件: * 1、全部满足偶数ID * 2、年龄大于24 * 3、用户名转为大写 * 4、用户名字母倒排序 * 5、只输出一个用户名字 **/
实体类123456789@Data@AllArgsConstructor@NoArgsConstructor@Accessors(chain = true)class User { private int id; private String userName; private int age;}
构造测试数据123456User u1 = new User(11, "a", 23);User u2 = new User(12, "b", 24);User u3 = new User(13, "c", 22);User u4 ...
方法重写
方法重写普通方法可以重写1234567891011121314151617181920212223class Animal{ public void eat(){ System.out.println("animal eat"); }}class Cat extends Animal{ @Override public void eat() { System.out.println("cat eat"); }}@Testpublic void test2(){ Animal animal = new Cat(); animal.eat(); animal=new Animal(); animal.eat();}//运行结果://cat eat//animal eat
静态方法不能重写1234567891011121314151617181920212223class ...
面向对象的基本特征及原则
面向对象的基本特征及原则面向对象的基本特征
抽象
封装
继承
多态
抽象抽象就是指忽略一些我们目标所需之外的东西
封装是对象和类概念的主要特性。封装是把过程和数据包围起来,只提供一个接口供用户使用,这样提高了代码的安全性,以及使用的简便性
继承子类可以使用父类的所有功能,并在无需重新编写父类的情况下对这些功能进行扩展。
多态多态是指允许不同类对象对同一消息做出反应,同一消息被不同的对象响应可以造成不同的结果
1234567891011//多态的三个必要条件//继承//重写//父类引用指向子类对象:Parent p = new Child();class Animalclass Cat extends Animal //编译看左边,运行看右边Animal animal = new Cat(); // 向上转型 animal.eat(); // 调用的是 Cat 的 eatCat c = (Cat)animal; // 向下转型 c.work(); // 调用的是 Cat 的 work
重载:在一个类里面,方法名字 ...
死锁
死锁死锁的四个必要条件
互斥:在一段时间内某资源仅为一进程所占用
请求与保持:当进程因请求资源而阻塞时,对已获得的资源保持不放
不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放
循环等待:在发生死锁时,必然存在一个进程–资源的环形链
预防和破坏死锁
资源一次性分配:如果某进程所需的资源能够一次分配完则分配,否则不分配
申请新资源,必须先释放所拥有的的其他资源,若还需要此资源,需向系统重新申请
申请新资源失败,释放所拥有的的所有资源
对资源进行编号,申请编号小的资源必须先释放所拥有的编号大的资源
当产生死锁时,强制结束一些进程
避免死锁银行家算法
手写一个死锁1234567891011121314151617181920212223242526272829303132333435363738394041public static final String s1 = "s1"; public static final String s2 = "s2"; public static void main(Str ...
单例模式
单例模式枚举能够防止单例被反射破坏,其他的不能
饿汉模式1234567public static class Hungry{ private Hungry(){} private final static Hungry hungry = new Hungry(); public static Hungry getInstance(){ return hungry; } }
普通的懒汉模式12345678910public static class Lazy{ private Lazy(){} private static Lazy lazy; public static Lazy getInstance(){ if (lazy==null){ lazy=new Lazy(); & ...