ArrayList: 底层数组,可重复,有序,可存多个null,查快。快速随机访问标志--实现RandomAccess接口,序列化,克隆,初始空数组,容量10,grow方法 每次1.5倍。
浅拷贝:基本数据类型值传递;引用类型,只存地址,在改动原始对象时会同时改变克隆对象的值 需要实现 Cloneable
接口,并覆写 clone()
方法。
深拷贝:基本数据类型值传递;引用类型,创建新对象,并把内容复制过去。
LinkedList:底层双向链表,可重复,有序,可存多个null,插入,删除。
HashMap:实现Map接口, 1.8之前数组+链表。1.8后数组+链表+红黑树,当链表长度阙值达到8时,将转化为红黑树,(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组 扩容,而不是转换为红黑树),红黑树降低时间复杂度到logN
key只可以有一个null,value多个null。put时可以put多个key为null的,不报错,以最后一个为准,存value。
扩容:初始16;扩容为原来的2倍;如果给定初始容量,会扩容到2的幂次方大小
使用Key计算hashcode
多线程时,会造成数据丢失。
ConcurrentHashMap: 线程安全,底层实现:
1.7之前采用分段segment数组+HashEntry数组+链表实现, 分段锁每一段一个锁,一段下包含一个Segment数组,一个segment包含一个HashEntry数组。每个HashEntry是一个链表结构的元素。将要对HashEntry数组修改时,必须首先获得对应的Segment的锁。
1.8开始 node数组+链表/红黑树。取消了分段锁,采用CAS算法和synchronized来保证并发安全。
synchronized只锁定当前链表或红黑树的首节点。
HashTable:线程安全(synchronized修饰的方法),效率低,
扩容:初始11,扩容2n+1;如果给定初始容量,会按照初始容量。
不能有 NULLKey NULL VALUE,会报java.lang.NullPointerException。
TreeMap:红黑树,有序。要实现Comparator接口。
Vector:list古老实现类,线程安全, 底层数组
HashSet:实现Set接口,底层是HashMap实现,add()添加元素,使用对象计算hashcode。不可重复。
在添加对象时,先用hashcode比较,如果存在相同用equals()比较。
两个对象可能hashcode相同,但是也不一定相等。
只可以存一个NULL,不可重复。add相同的也会只存一个。
LinkedHashSet:是HashSet的子类,可以按照添加顺序遍历。通过LinkedHashMap实现。
TreeSet:底层也是红黑树,可以按照添加顺序遍历,并可以自然排序和定制排序。有序,唯一。重写new Comparator(){ public int compare(Object o1,Object o2){ return o1.compareTo(o2); }} 进行排序。