一.List和Set、Map的区别
List和Set都实现了Collection接口,都可以使用forEach进行迭代,Map则需要通过entrySet()方法来转换成Set集合迭代
List是有序,可重复的集合;Set是无序,不可重复集合;Map是无序集合,由键值对组成,键无序不可重复,值无序可重复。
List中可以存null;Set中可以存null(TreeSet不允许存null)因为要确保不重复性,所以只能有一个null;Map中根据不同的Map情况不同,HashMap允许null键(只允许有一个null),null值,TreeMap不允许null键(确保可排序性),但允许null值,Hashtable不允许null键,null值。
List可以通过下标索引查找,迭代顺序一定;Set无序,迭代顺序不一定。
二.ArraysList、LinkedList和Vector区别
三种集合都实现了List接口都是有序,可重复的,可通过下标索引查找,都可以存null。
ArrayList和LinkedList是不同步的是非线程安全的,Vector是同步的是线程安全的。
ArrayList的底层实现是数组;LinkedList底层实现是双链表,同时也实现了Deque接口可以从两端进行操作元素; Vector底层实现也是数组。
在进行元素随机访问时,ArrayList的效率更高;在进行元素插入和删除操作时,LinkedList效率更高。
ArrayList和Vector的底层实现是数组,在内存中储存是连续的;LinkedList底层实现是链表,在储存是不连续的。
三.HashMap和Hashtable的区别
HashMap是非同步的,是非线程安全的;Hashtable是同步的,线程安全的。
HashMap允许null键,null值(只允许有一个null键,键不重复);Hashtable不允许null键,null值。
HashMap的默认容量是16,扩容的方式是2n;Hashtable的默认容量是11,扩容方式是2n+1;
HashMap采用数组+链表/红黑树的方式存储元素(当数组长度大于64,并且链表结点大于8时转换为数组+红黑树存储;当红黑树节点小于6时,继续转为数组+链表存储);Hashtable采用数组+链表的方式存储元素。
四.LinkedHashMap总结
LinkedHashMap继承自HashMap,可以保持元素的插入顺序,LinkedHashMap在HashMap的基础上增加了一个双向链表,用来维护元素的插入顺序。
LinkedHashMap可以在创建的时候对集合的排序模式进行设置LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
插入顺序(accessOrder = false):新插入的元素会在末尾,迭代是在最后出现。
访问顺序(accessOrder = true):每次访问元素(获取、更新、删除等),都会将该元素移动到链表的末尾。