HashMap:线程不安全。底层jdk1.7之前是初始是16的entry数组,二叉树链表(解决hash冲突)。jdk1.8之后是node,红黑树(当节点数大于8时)https://my.oschina.net/hosee/blog/618953
key值对象
@Override
public boolean equals(Object obj) {
return this.id == ((MyClass) obj).id;
}
/**重写hashcode可以
@Override
public int hashCode() {
return id;
}
***/
红黑树:http://www.jianshu.com/p/23b84ba9a498
为什么初始是16?
很多位运算保证了初始容量一定为2的幂
HashMap中的数据结构是数组+单链表的组合,希望是元素存放的更均匀,最理想的效果是,Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较K,而且空间利用率最大
HashTable:线程安全(synchronization)。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点;而在迭代访问时反而更快,因为它使用链表维护内部次序。
TreeMap:基于红黑树的实现。查看“键”或“键值树”时,它们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
ConcurrentHashMap (架构图上和hashmap并列 继承AbstractMap):1.7:锁分段技术,由多个Segment组成(Segment下包含很多Node,也就是键值对),每个Segment都有把锁来实现线程安全,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。1.8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全,底层依然采用数组+链表+红黑树的存储结构。内存占用率和hashmap差不多,get方法不会加锁,所以速度不会慢,put方法支持并发,有加锁操作,速度多少会比hashmap慢一点。可以并发更新http://blog.csdn.net/u010412719/article/details/52145145 http://www.jianshu.com/p/c0642afe03e0
arraylist:底层为数组,查询快,有顺序,可重复collections.synchronizedxxx是全部加了同步
linkedList:双向链表,修改快。
vector:同步synchronized
hashset:不可重复,无顺序。
treetSet:Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序),如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口,不同步