List、Set是实现了Collection接口的子接口;而Map是另一个集合接口。
1. 三者之间的区别如下:
1) 元素重复性:
① List允许有重复的元素。任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中;
② Set集合不允许元素重复。Set以及所有实现了Set接口的类都不允许重复值的插入,若多次插入同一个元素时,在该集合中只显示一个;
③ Map以键值对的形式对元素进行存储。Map不允许有重复键,但允许有不同键对应的重复的值;
2) 元素的有序性:
① List及其所有实现类保持了每个元素的插入顺序;
② Set中的元素都是无序的;但是某些Set的实现类以某种殊形式对其中的元素进行排序,如:LinkedHashSet按照元素的插入顺序进行排序;
③ Map跟Set一样对元素进行无序存储,但其某些实现类对元素进行了排序。如:TreeMap根据键对其中的元素进行升序排序;
3) 元素是否为空值:
① List允许任意数量的空值;
② Set最多允许一个空值的出现;[ 当向Set集合中添加多个null值时,在该Set集合中只会显示一个null元素]
③ Map只允许出现一个空键,但允许出现任意数量的空值;
总结: List中的元素,有序、可重复、可为空;
Set中的元素,无序、不重复、只有一个空元素;
Map中的元素,无序、键不重,值可重、可一个空键、多可空值;
2. 实现类:
① List:ArrayList、LinkedList;
② Set:HashSet、LinkedHashSet、TreeSet、SortedSet等等;
③ Map:HashMap、TreeMap、WeakHashMap、LinkedHashMap、IdentityHashMap等等;
3. List集合的子类ArrayList、Vector、LinkedList之间的区别:
ArrayList和Vector都是以数组的方式存储数据的,此数组长度大于实际存储元素个数,以方便插入元素;它们都允许直接按索引获取元素;由于在插入数据时,涉及到数组元素的移动等内存操作,所以在插入数据时执行速度较慢;Vector是线程安全的(synchronized),所以性能上要比ArrayList差;
而LinkedList是以双向链表的形式存储数据的,在按索引获取数据时只需要向前或者向后进行遍历即可;在插入数据时,只需要记录本项的前后项即可,所以插入速度较快。
4. HashMap和HashTable的区别:
HashMap时HashTable的轻量级实现(非线程安全的实现),它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上高于HashTable。
HashMap允许将null作为一个entry的key或者value,而HashTable不允许。
HashMap去掉了HashTable的contains方法,改成containsValue和containsKey方法。
二者最大的不同是,HashTable的方法是synchronized(线程安全的),而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。