HashMap
JDK 8以后 HashMap采用 数据,链表,红黑树实现。
哈希冲突时,拉链法解决。
链表长度大于阈值8 时,采用链表转红黑树。
哈希查找时间复杂度:o(1)
哈希冲突时,链表时间复杂度O(n)
红黑树时,时间复杂度O(log n)
TreeMap
基于红黑树的有序Map
默认key的自然顺序排序,也可使用comparator自定义排序
时间复杂度:O(log n)
寻址算法
插入和查找时,根据key得到相应的hash值,再根据值得到下标位置。
1。哈希值和数据长度&运算,得到下标位置。
(n-1)&hash
2.解决hash冲突
hashcode右移16位,再与原来的hashcode值做异或运算^
3.大小为2的n次方
原因:不为2的n次方时,与hash值进行与运算,会导致某些index取不到值。
比如长度为32
0000 0000 0000 0000 0000 0000 0001 1111
与运算可得到 0-31的下标。
默认加载因子
占用比例超过0.75后会扩容(泊松分布规律)
负载因子过大,空间使用充分,但会增加哈希冲突。查找效率低
负载因子过小,空间浪费。
String
是Immutable类的实现,final class,除hash外其它属性都是finnal
不可变性,所以在字符串拼接时,会产生无用对象,效率低下,浪费空间
StringBuilder
append方法将字符串拼接到已有序列指定位置
可变byte数据,线程不安全
StringBuffer
线程安全,所有修改方法使用synchronized
字符串常量池
直接赋值情况才回检查常量池是否含有改字符串对象
当使用new对象时,直接在堆空间新增对象,是不会检查常量池的
引用
强引用
垃圾回收器永远不会回收被引用的对象。只有当赋值为null的时候,JVM才会回收。
软引用
JVM会在内存不足时,进行回收。
弱引用
JVM开始垃圾回收时,就会被回收。 如threadLocal
虚引用
随时会被回收。
Object类
所有类的父类
hashCode()
默认的code为内存地址转换为hash值
同一对象多次调用该方达时,必须一致返回相同的结果
equals()
判断内存地址是否一致
wait()
释放CPU资源,释放他对锁的拥有权,等待其他线程通知