Java基础

HashMap
- jdk1.7版本,底层是数组+链表,元素的插入使用头插法,可能形成数据丢失或环形链表。
- jdk1.8版本,底层是数组+链表+红黑树,元素的插入使用尾插法,数据覆盖的情况。
- 扩容机制:LoadFactory默认0.75,创建空数组重新Hash。
- resize线程不安全:多线程之间put操作的覆盖;形成环形链表,get时陷入死循环。
- hash方法混合高低位(16位异或),降低冲突概率。
- 2的幂次:1.7判断n-1&hash进行计算位置,2的幂次减少Hash碰撞,1.8判断新增位计算位置;此外,元素能够均匀分布在数组上。
- 重写equals必须重写HashCode。
- Tips:结扩危哈幂。
ConcurrentHashMap
- 安全失败:迭代器在拷贝的集合遍历,对原集合的修改不会抛出异常。
- jdk1.7版本,底层是数组+链表,使用Segment分段锁,继承了可重入锁ReentrantLock,尝试获取锁时存在竞争,自旋,阻塞。get方法没有用锁,但是高效且同步,元素和节点指针用volatile修饰。HashEntry封装键/值对。
- jdk1.8版本,底层是数组+链表+红黑树,使用CAS和synchronized同步,CAS->自旋->sync。Node封装键/值对。
- Tips:结安锁得元。
LinkedHashMap
- 继承HashMap。
- 重写put的子方法addEntry,提供了双向链表的实现。
- 重写get方法,当accessOrder为true时,最新访问的元素添加到表头。
- 提供removeEldestEntry方法,默认false,不移除元素。
ArrayList
- 底层是数组,查找访问速度快,增删效率低,线程不安全。
LinkedList
- 底层是双向链表,增删效率高,查找访问速度慢,线程不安全。
lambda表达式
- 传递行为:匿名内部类->lambda表达式。
- 原理
- 类编译的时候,会生成一个私有类方法+内部类。
- 内部类中实现了函数式接口,实现接口的方法中,调用了编译器生成的静态方法。
- 通过传递内部类实例,调用函数式接口方法。
- 函数式编程:写pure function,减少side effect,保证函数传递相同参数时结果相同。
- 函数式接口:有且只有一个抽象方法。
CGLib和JDK动态代理
- JDK动态代理
- 利用反射机制生成一个实现代理接口的匿名类。
- 在调用具体方法前调用InvokeHandler来处理。
- CGLib动态代理
- 修改指定类的字节码生成一个子类。
- 覆盖其中的方法。
打破循环
- break+标签实现goto功能。
设计模式六大设计原则
-
单一职责原则:一个类只负责一项职责。
-
开闭原则:对扩展开放,对修改关闭。
-
里氏替换原则:引用基类的地方能透明的使用子类的对象。
-
迪米特法则:一个对象应该对其他对象保持最少的了解。
-
接口隔离原则:类的依赖关系应建立在最小的接口上。
-
依赖倒置原则:高层模块不依赖底层模块,两者依赖于抽象;细节依赖抽象。
哲学家问题
- 哲学家围成一圈吃饭,左右手都拿到筷子才能吃饭。
你知道的越多,你不知道的越多。

一些基础知识的整理。
浙公网安备 33010602011771号