面向对象的四大特性

封装

封装的本质是,将数据和操作数据的方法绑定在一起,并通过访问控制符隐藏内部实现细节,只对外提供访问接口

继承

继承的本质是,通过子类继承父类,可以实现父类的所有方法和属性(finally修饰的除外),并在此基础上实现自己的方法与属性,减少代码冗余。注:java只允许单继承

多态

多态的核心是,同一行为在不同的对象上,有不同的表现形式。编译时看左边类型,运行时看右边对象。是动态绑定的一种应用

抽象

通过abstract关键字或接口,只定义方法签名而不实现具体逻辑,将实现细节推迟到子类和实现类

Hashmap的底层原理

底层数据结构

数组+链表+红黑树
链表长度大于8或数组长度大于等于64时,会自动变为红黑树

PUT和GET流程

put流程:

  1. 对key进行hash
  2. 计算槽位:(n-1)& hash
  3. 如果槽位为空,直接放入
  4. 如果槽位不为空,遍历链表和红黑树,key相同则覆盖,否则尾插法插入
  5. 检查是否需要转换为红黑树或扩容

get流程

  1. 计算key的哈希和槽位
  2. 如果槽位第一个节点命中,则直接返回
  3. 如果没有命中,则判断是否是红黑树,遍历查找
  4. 找不到返回null

扩容机制

如果hashmap现有数量大于容量于阈值的乘积,则扩大2倍
阈值默认0.75 初始容量16

java8的优化

  1. 引入了尾插法,解决了多线程情况下扩容导致的死循环问题
  2. 引入红黑树,减少哈希冲突导致的性能下降

Jvm的内存区域,哪些是线程共享的,哪些是线程私有的?

jvm内存区域为

  1. 本地方法栈
  2. 虚拟机栈
  3. 元空间
  4. 程序计数器
    只有堆和元空间是线程共享的,其它都是线程私有的