这里,先用一张图来大概了解一下常用的集合类,当然还有一些没有列举出来,主要是因为不常用(懒)。
Collection主要包括Set和List,Set是无序不重复集合,List是有序可重复集合,很多时候我们做List的去重操作时,偷懒的方法就是把List转换为Set集合。
从接口上看,List支持指定位置增加对象,同时增加了一个能够双向遍历线性表的新列表迭代器ListIterator以及sort排序。需要注意的是ArrayList和Vector的数据结构是数组,LinkedList的数据结构是链表。
- ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高 - Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低 - LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Set接口扩展自Collection,它与List的不同之处在于,规定Set的实例不包含重复的元素。在一个规则集内,一定不存在两个相等的元素。AbstractSet是一个实现Set接口的抽象类,Set接口有三个具体实现类,分别是散列集HashSet、链式散列集LinkedHashSet和树形集TreeSet。
- HashSet
- 底层数据结构是哈希表。(无序,唯一)
- hashCode()和equals() 保证元素唯一性
- LinkedHashSet
- 底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
- 1.由链表保证元素有序
- 2.由哈希表保证元素唯一
- TreeSet
- 底层数据结构是红黑树。(唯一,有序)
再来说说Map,Map有三个比较常用和重要的实现类, 分别是HashMap、TreeMap和HashTable。
顺序性:
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
特点:
- Hashtable是线程安全的,HashMap不是线程安全的。
- HashMap效率较高,Hashtable效率较低(线程安全的效率一般都低)。
- 如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字,而HashMap的源码中则没有。
- Hashtable不允许null值,HashMap允许null值(key和value都允许)
- 父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap
array、link、hash三种数据结构的特点
- 数组查找快,增删慢(内存连续,数据增删通过copy)
- 链表查询慢,增删快(内存不连续,首尾指向下一个节点)
- 哈希表性能比较综合,通过链表链接数组空间
下一篇文章将从List开始
转载请注明:迷路的老鼠 » java里集合这些事情-概述