List和Set

list和set均是继承了Collection接口,其中list下有ArrayList,Vector和LinkedList,Set下有HashSet,LinkedHashSet,TreeSet。
区别
List中的的元素都是有序且可重复的

  • ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全但是效率高
  • Vector:底层数据结构是数组,查询快,增删慢。线程安全但是效率低。
  • LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全但是效率高

Set中的元素是无序但是唯一的,且三者

  • HashSet:
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    1 依赖两个方法:hashCode()和equals()
  • LinkedHashSet:
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯一
  • TreeSet:
    底层数据结构是红黑树。(唯一,有序)
    1.如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

Set三个实现类都不保证线程安全,如果要保证线程安全可以使用Collections.synchronizedSet()。HashSet是通用的数据集合,LinkedHashSet保证有序集合(先进先出),TreeSet使用自然排序或者是比较器排序。在速度上三者HashSet最快,LinkedHashSet次之,TreeSet最慢,因为要进行内部排序

总结
在需要对使用集合时,如果不要求唯一使用List,要求线程安全使用Vector,否则使用ArrayList或LinkedList(根据业务的不同来选择),如果要求唯一使用set,不要求排序的话使用HashSet,否则选LinkedHashSet或者TreeSet,一般来说不知道具体业务的情况下,选择ArrayList和HashSet

Map

与Set和List类似,Map也有三个主要的实现类,HashMap、TreeMap和Hashtable。HashMap和Hashtable是无序的,TreeMap是基于红黑二叉树的NavigableMap的实现,是有序的。Hashtable的方法是同步的,HashMap的方法不是同步的。这也意味着Hashtale保证了线程安全,性能要低一些。
HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。TreeMap不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口。
Map的遍历
1、通过内部类Entry进行遍历
2、通过迭代器进行遍历,先获得Entry的Set集合
3、通过keySet方法获得键的Set集合,通过遍历键取值
4、通过map.values()获得所有值,但是不能获得键

参考:菜鸟教程-java集合框架