1 集合分类,
collection和map两大类,Iterator接口是提供遍历任何Collection的接口,不是map
2 集合类的底层实现
hashset基于hashmap实现(只不过HashSet里面的HashMap所有的value都是同一个Object而已)
treeset由红黑树实现
hashmap由数组+链表+红黑树实现
其他集合类基本都是由数组,或链表实现
3 arraylist 每次都是10的1.5倍扩容,会造成内存的浪费,可以考虑优化
hashmap 是2的幂次方扩容
对于hashmap或hashset最好定义key类是不可变的,这样key对应的hashCode() 值可以被缓存起 来,性能更好,这也是为什么String,Integer特别适合作为HashMap的key
他们都是重写过hashcode和equal方法的,且这些包装类都是final修饰的:
public final class Integer extends Number
为什么要重写hashcode和equals
默认:hashcode是对地址的散列值 和equals是对地址的比较
对象比较先比较hashcode,相同再去比较equals,
所以 如果重写了equals将地址的比较改为内部某个属性值的比较
那么还是先比较的是hashcode,即基于地址的散列值,所以要同步重写
hashcode也变为基于某个属性值的散列值的比较才行。
4 线程安全
ConcurrentHashMap 是线程安全的,实现JDK1.8底层是synchronized+CAS+链表/红黑树, JDK1.7底层是ReentrantLock+Segment+HashEntry
但线程安全的都不支持key为null
Iterator接口方便遍历。删除,修改,要用它,不然会ConcurrentModificationException,当然你 也可以倒序遍历等等
使用线程不安全的集合要加同步锁,不然也会报ConcurrentModificationException错误
掌握这些,应该就够了。