- jdk1.7hashmap底层的数据结构是数组+链表;1.8之后是数组+链表+红黑树。
- 默认初始化容量为16,默认加载因子是0.75,代表当数组填满了75%的节点,就会触发数组扩容,每次扩容容量变为原容量的两倍。
- 当链表长度超过8;同时数组长度超过64,链表就会转变成红黑树,否则先扩容数组。当链表长度小于6,红黑树就变回链表。
- 一个类,如果其对象将会被放到hashmap中,那么该类应该重写hashcode和equals方法。因为hashmap是通过hashcode和equals来判断两个对象是否相同。首先对比两个对象的内存地址,一样就相等,否则接着对比hashcode的值,如果不一样就直接返回false,否则通过equals方法进行最后判断,相等就返回true,否则返回false。
- 在使用的时候,可以通过预估大小设置默认容量来减少扩容次数来提高效率。设置的初始容量最好是2的倍数,即使不是2的倍数,构造函数内部也有操作将默认扩容设置为大于等于当前容量的最小的2的n次方值。为什么要这么设计?为了让hash表尽量散列。计算对象存放的数组下标是通过对象的hashcode和对象容量-1的结果(刚好是低位全1)进行按位与,这样就可以最大化散列。
- hashmap不是线程安全的,在多线程情况下,可能会出现不安全的情况。
说说hashmap有哪些不安全的例子?arraylist有哪些不安全例子?
|