集合
Iterator
线程安全,遍历集合元素时集合元素被修改,抛出ConcurrentModificationException?
HashMap
put
先调用hashCode,如果有entry然后再调用equals确认entry是否存在,然后覆盖value;没有entry会新建entry,默认容量是32,负荷系数0.75,扩容总是x2
get
先调用hashCode然后调用equals找到真正的entry,取出value
key的最佳实践
1.key对象应该不可变,hashCode被缓存起来性能更好
2.key需要重写equals和hashCode
和HashTable区别
1.HashTable线程安全
2.HashTable不允许key和value为空,HashMap允许一个null key
ArrayList
和Vector区别
1.Vector线程安全
和LinkedList区别
LinkedList每个节点都存储了前后节点的使用,更消耗内存
扩容机制
1.无参构造函数创建一个长度为0的数组
2.确认最小扩充容量,首次调用add时,取size和DEFAULT_CAPACITY = 10的最大值,所以第一次会直接扩容到10
3.如果数组长度小于最小扩容量,直接扩容
4.扩容使用位运算,容量为原来的1.5倍
5.Arrays.copyOf复制数组元素
6.如果计算出的新长度大于Integer.MAX_VALUE - 8,新长度取
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
7.add大量数据之前可以调用ensureCapacity减少重新分配次数
拷贝
浅拷贝
遍历循环复制、addAll方法、构造方法传入原集合、System.arrayCopy方法都属于浅拷贝,新数据改变会影响原属组
深拷贝
序列化
实现Cloneable接口,重写clone方法,return一个新的对象
Set
Set如何保证唯一性
先比较hashCode,如果有值,使用equals确认,相同则过滤,不同新增