Collection:(存放单一元素的容器)
List(可重复,有序)
ArrayList
底层是使用了动态数组的数据结构存储,默认初始大小为10,扩容为原始数组的1.5倍,当添加元素后的集合大小大于目前数组的长度,就创建一个新的数组,把旧的元素和新元素存储到扩容后的新数组。
Vector
底层是使用了动态数组的数据结构存储,默认的初始大小为10,扩容为原始数组的2倍,原理是当添加元素后的集合大小大于目前数组的长度,就创建一个新的数组,把旧的元素和新元素存储到扩容后的新数组。单个操作集合的方法是synchronized修饰的,单个操作集合的方法是线程安全的。如果出现同时增加或者删除元素的方法,不保证线程安全。
LinkedList
底层使用了双向链表的数据结构存储,初始化时不指定大小,默认为0,不存在扩容机制,新增多少加多少。
arrayList和LinkedList性能比较
arrayList底层是动态数组,他的性能优点是通过索引寻址快,缺点是数组内元素重排和触发扩容的时候需要对元素进行复制移位,更新索引比较耗时。
linkedList底层是双向链表,他的性能优点是添加删除元素时,只需要实例化Node对象,更新相邻两个元素的指针。缺点是寻址慢,需要遍历。
头插:arrayList需要对数组内其他元素作复制移位操作,很耗时,linkedList找到头节点的时间复杂度是O(1),然后更新指针即可,所以linkedList更快。
尾插:在尾节点寻址上,arrayList和linkedList的时间复杂度都是O(1),但是linkedList需要实例化Node对象,所以在没有触发arrayList的扩容机制的时候,arrayList的效率更高。
中间插入:中间插入要具体看离头尾节点有多远,这会影响到LinkedList的寻址速度和arrayList复制移位元素的个数,以及是否触发arrayList的扩容机制,要综合来看。
Set(不可重复)
HashSet
底层存储上是使用HashMap,在HashSet类中,所有方法基本都是调用的HashMap的方法,比如说add()方法,实际上调用的是HashMap的put()方法,HashSet声明了一个present对象,它是一个static final的空Object对象,每次调用HashSet的add()方法时候,把要add的值作为KEY,present对象作为value,put进HashMap中。然后HashSet遍历的方法iterator()实际上是调用这个HashMap的KeySet()方法拿到所有的Key然后遍历所有的key。
TreeSet
底层存储上是使用TreeMap,在TreeSet类中,首先声明了一个NavigableMap类型的变量,然后实际上使用TreeMap作为实现的。同HashSet一样,TreeSet的所有方法基本都是调用的TreeMap的方法实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。