List
ArrayList(具体情况需要进行具体分析,不能死记理论)
1、可指定容量,如果不指定则默认10. 扩容策略为:(oldLength*3/2)+1,可调用ensureCapacity()进行手动扩容。
劣势:在进行删除、添加的时候(不包括不需要扩容的情况:数组没满的情况下的添加和最后一位元素的删除操作),需要对操作位置后面的数组进行数据移位(添加的时候都需要进行复制,删除的时候只对操作位置后面的进行复制,调用System.arraycopy()),当数据量较大,操作位置靠前的时候,这是效率会变低
优势:当进行get(index)或者set(index,obj)的时候比较迅速
LinkList
1、环链进行数据存储
2、当根据index获取元素的时候会根据index < (size >> 1)的大小来决定由前到后还是由后到前来进行遍历搜索。
3、indexOf(obj)从head to end 进行遍历搜索;lastIndexOf(Object o) 由后到前返回第一个查找到的数据。
4、peek()和element()都是返回第一个元素,只是当没有元素时,peek返回null,而element将会报异常NoSuchElementException。
5、LinkedList可以通过Iterator进行指定位置以后的元素迭代输出。
优势:在首尾进行元素插入或者删除时较快,但是如果指定位置时,由于需要循环链表进行查找,所以此时也会有些延迟。总体来说,在进行数据插入和删除的时候,效率是高于ArrayList的。
劣势:LinkedList占用内存较多,其次,在进行元素获取的时候,get(index)的效率由于需要进行循环则较落后于ArrayList,不过在进行getIndexOf(obj)的时候和数组的效率相同,都是由前到后进行依次查找。
Map
HashMap(结构模型见附件)
1、底层用数组实现 table = new Entry[capacity];
2、允许key值为null,存放在table[0]的链表中。
优势:对于查询操作来说,直接获取hashCode计算index,然后从table数组中取值,具有数组的快速获取优势;在进行插入和删除操作时,由于hash冲突的解决方式是通过链表,所以又具有链表的快速插入和删除的优势。
劣势:占用内存,遍历的时候使用Iterator进行遍历。
LinkedHashMap(结构模型见附件)
1、继承自HashMap,存储容器依旧是数组和链表。
2、自定义了自己的Entry实体,添加了before和after两个属性,此另个属性用来实现linked的性质。
3、具体模型,主要结构模型和HashMap一样,不同的是,LinkedHashMap 根据数据插入顺序,通过before和after把所有的实体串联成了一个链表。此链表是横跨table[i]的,不同于解决hash冲突的链表(纵向的)。
4、模型:画出模型,注意。head的位置在外面
TreeMap
红黑树存储。预留,主要还是二叉树。可以参考平衡二叉树:http://www.cnblogs.com/PerkinsZhu/p/5824015.html
HashTable
1、不能存储key或者value为null的数据
2、扩容策略是 int newCapacity = oldCapacity * 2 + 1
3、线程安全的,所有的public方法都添加有synchronized关键字;
4、存储模型和hashMap相同
Set
HashSet
1、和HashMap相同,只是仅仅使用HashMaop的key进行数据存储。
2、注意friendly HashSet()的方法是预留给子类LinkedHashSet使用的。
LinkedHashSet
1、继承HashSet,数据存储是使用LinkedHashMap,因此保留着插入顺序。只使用key值进行存储数据。
TreeSet
1、实现单元素排序的数据结构,通过TreeMap实现的。
附件:
HashMap结构模型
LinkedHashMap结构模型