面向对象的四大特性
封装
封装的本质是,将数据和操作数据的方法绑定在一起,并通过访问控制符隐藏内部实现细节,只对外提供访问接口
继承
继承的本质是,通过子类继承父类,可以实现父类的所有方法和属性(finally修饰的除外),并在此基础上实现自己的方法与属性,减少代码冗余。注:java只允许单继承
多态
多态的核心是,同一行为在不同的对象上,有不同的表现形式。编译时看左边类型,运行时看右边对象。是动态绑定的一种应用
抽象
通过abstract关键字或接口,只定义方法签名而不实现具体逻辑,将实现细节推迟到子类和实现类
Hashmap的底层原理
底层数据结构
数组+链表+红黑树
链表长度大于8或数组长度大于等于64时,会自动变为红黑树
PUT和GET流程
put流程:
- 对key进行hash
- 计算槽位:(n-1)& hash
- 如果槽位为空,直接放入
- 如果槽位不为空,遍历链表和红黑树,key相同则覆盖,否则尾插法插入
- 检查是否需要转换为红黑树或扩容
get流程
- 计算key的哈希和槽位
- 如果槽位第一个节点命中,则直接返回
- 如果没有命中,则判断是否是红黑树,遍历查找
- 找不到返回null
扩容机制
如果hashmap现有数量大于容量于阈值的乘积,则扩大2倍
阈值默认0.75 初始容量16
java8的优化
- 引入了尾插法,解决了多线程情况下扩容导致的死循环问题
- 引入红黑树,减少哈希冲突导致的性能下降
Jvm的内存区域,哪些是线程共享的,哪些是线程私有的?
jvm内存区域为
- 本地方法栈
- 虚拟机栈
- 堆
- 元空间
- 程序计数器
只有堆和元空间是线程共享的,其它都是线程私有的
原创
Java基础学习一
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法