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功能。

设计模式六大设计原则

  • 单一职责原则:一个类只负责一项职责。

  • 开闭原则:对扩展开放,对修改关闭。

  • 里氏替换原则:引用基类的地方能透明的使用子类的对象。

  • 迪米特法则:一个对象应该对其他对象保持最少的了解。

  • 接口隔离原则:类的依赖关系应建立在最小的接口上。

  • 依赖倒置原则:高层模块不依赖底层模块,两者依赖于抽象;细节依赖抽象。

哲学家问题

  • 哲学家围成一圈吃饭,左右手都拿到筷子才能吃饭。
posted @ 2020-08-09 09:02  樱空废宅  阅读(127)  评论(0)    收藏  举报