List:
ArrayList:允许null,初始容量为10,底层使用数组实现,非线程安全,可扩容并且一次扩容1.5倍,可指定出事容量。
优点:查找快(因为ArrayList底层使用数组实现,数组的特点就是可以随机取值)。
缺点:增删慢(数组中的数据必须是连续的,如果被删除的数据在数组的中间,那么被删除的数据后边的元素必须依次向前移动,这很显然是浪费时间的;当添加数据的时候,如果当前数组的容量够用那还好说,但是如果数组的容量不够就会触发扩容,由于数组的大小是不变的,因此扩容必须重新定义一个数组,然后将旧的数组中的元素依次复制到新数组当中,这显然浪费时间)。
LinkedList:允许null,无初始容量,底层采用双向链表,非线程安全,无需扩容且大小动态变化。
优点:增删快(链表固有的特性,删除的时候无需重新定义,只是将被删除的元素移除然后将前后元素的引用连接即可)。
缺点:查找慢(不能随机取值,需要根据链表依次扫描)。
Vector:允许null,初始容量为10,底层使用数组实现,线程安全,可扩容并且一次扩容1.5倍,可指定出事容量。
优缺点:类似ArrayList。
Stack:继承Vector,为栈,符合栈的特性,底层使用数组,可自动扩容。
Set:
HashSet:
LinkedHashSet:
TreeSet:
Map:
HashMap:底层采用数组,数组每一个元素形成链表,key可有一个为null,value可有多个null,非线程安全。
注意: hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象
才可以真正定位到键值对应的Entry.
c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
HashTable:底层采用数组,数组每一个元素形成链表,key和value都不能为null,线程安全。
注意:
1、用作key的对象必须实现hashCode和equals方法。
2、不能保证其中的键值对的顺序
3、尽量不要使用可变对象作为它们的key值。
TreeMap:底层采用 ,利用红黑树实现排序,排序依赖于hashcode和equals,
注意:由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
a. Comparator可以在创建TreeMap时指定
b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.
LinkedHashMap:使用双向链表保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。