一.集合和数组的区别
二.概述
集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。常见的集合主要有三种——Set(集)、List(列表)和Map(映射)。其中,List和Set 都实现了 Collection 接口,并且List和Set也是接口,而Map为独立接口。常见的实现类如下:
List 的实现类有:ArrayList、Vector、LinkedList;
Set 的实现类有:HashSet、LinkedHashSet、TreeSet;
Map 的实现类有:HashTable、HashMap、LinkedHashMap、TreeMap。
三.详细讲解
1.List列表 —— 有序、值可重复
(1)ArrayList
优点: 底层数据结构是数组Array,查询快。增删慢。
缺点: 线程不安全,效率高
(2)Vector
优点: 底层数据结构是数组Array,查询快。增删慢。
缺点: 线程安全,效率低
Vector是实现了 synchronized 的,这也是Vector和ArrayList的唯一的区别。
(3)LinkedList
优点: 底层数据结构是链表LinkedList,增删快。查询慢。
缺点: 线程不安全,效率高
*链表的每一个节点(Node)都包含两方面的内容:【1】节点本身的数据(data);【2】下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
2.Set 集 —— 值不可重复
(1)HashSet
调用add()方法向Set中添加对象,底层数据结构是哈希表,无序。
依赖两个方法来保证元素唯一性:hashCode()和equals()。使用对象的值来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性。
(2)LinkedHashSet
底层数据结构是双向链表和哈希表,有序。
由链表保证元素有序,由哈希表保证元素唯一。
(3)TreeSet
底层数据结构是红黑树,内部实现排序,也可以自定义排序规则。
自然排序、比较器排序保证元素排序。根据比较的返回值是否是0来保证元素唯一性。
针对Collection集合我们到底使用谁呢?(掌握)
唯一吗?
是:Set 排序吗? 是:TreeSet或LinkedHashSet 否:HashSet 如果你知道是Set,但是不知道是哪个Set,就用HashSet。 否:List 要安全吗? 是:Vector 否:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。
3.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
4.方法介绍
(1)Collection集合的方法
(2)List方法
(3)Map方法