1、集合是用来存放对象(的引用)的
java集合中只能保存引用类型的数据,实际上存放的是对象的引用,而非对象本身。集合中元素相当于引用类型变量。
现在集合也能保存基本数据类型,但是没有实际意义。
2、集合要使用泛型
集合是存放对象的,默认是Object对象。所以集合能存放不同类的对象。如果我们希望集合保存单一类型的对象,那么就要使用泛型。
比如创建一个键为String,值为object类型的HashMap,在此基础上创建list集合。
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
3、集合的类型
从体系结构上讲,集合的类型可以分成3种:
集(set):set集合中不区分元素的顺序,不允许出现重复的元素。
列表(list):list集合区分元素的顺序,且允许出现重复的元素。
映射(map):映射保存成对的键值信息映射中不能包含重复的键,每个键只能映射一个值。
因为list区分元素的顺序,所以使用者要对列表元素的插入位置进行精确的控制。列表元素的插入位置就是它的索引。
比如:
list.add(map1);
list.add(map2);
list.add(map3);
调用list.get(2);返回的是map3
4、list集合一般在项目中用来存储什么对象
- 存储map对象。map对象以键值对的形式存储数据。
============================================
1. util包的框架
常用的集合类主要实现两个“super接口”而来:Collection
和Map
。
1.1 Collection
有两个子接口:List
和Set
List
特点是元素有序,且可重复。实现的常用集合类有ArrayList
、LinkedList
,和Vector
(线程安全)。
Set
特点是元素无序,不可重复。实现的常用集合类有HashSet
,LinkedHashSet
,TreeSet
(可排序)
1.2 Map
是key、value键值对的集合
特点是key值无序不可重复,value值可重复(这样表述其实不太准确,因为实际上key和value是绑定在一起的)。常用的有HashMap
,HashTable
(线程安全),TreeMap
(可排序)。
1.3 其余重要接口和类
上面是util包中的集合框架,一般Java教材里面都会讲到。但我们深入研究一下,会发现还有其余几个重要的内容:
- Iterator:迭代接口
集合类实现该接口后便具有了迭代功能。最简单的迭代实现是ArrayList
,迭代过程其实就是数组的迭代。LinkedList
、LinkedHashSet
和LinkedHashMap
迭代过程就是链表的迭代。这两者的迭代效率都很高,迭代时间与容器里的元素数目成正比。但HashSet
、HashMap
迭代效率就略低了,因为采用了哈希表,所以元素是散列在数组中的,迭代时必须读完整个数组,迭代时间与容器的容量成正比。 - Comparator:比较接口
实现该接口后,集合内元素便可比较通过compare()
方法实现元素排序 - AbstractXXX:骨架类
所谓骨架类,其实就是不同集合的核心代码实现,让继承这个抽象类的子类少干点活。例如AbstarctList
代表“随机访问”集合(底层数组实现)的骨干代码实现。AbstractSequentialList
代表“连续访问”(底层链表实现)集合的骨干代码实现。 - Collections、Arrays
集合工具类和数组工具类。Java中的工具类好像都喜欢在对应的接口或类名称后,加S
来表示其工具类。
接下来给一张比较完整的util包框架图:
2. 常用集合类原理
2.1 ArrayList
ArrayList
的实现最简单,采用的顺序表,底层就是一个Object
数组,初始容量为10,每当元素要超过容量时,重新创建一个更大的数组,并把原数据拷到新数组中来。
2.2 LinkedList
LinkedList
采用双向链表。集合中的每一个元素都会有两个成员变量prev
和next
,分别指向它的前一元素和后一元素。
ArrayList
和LinkedList
的区别这里就不详细讨论了,其实就是顺序表和链表两种数据结构的区别。之前写的博文中已经提到(包括ArrayList
和LinkedList
的详细实现):
数据结构基础(一)线性表
2.3 Vector
Vector
底层实现和ArrayList
类似,区别在于在许多方法上加了synchronized
关键字,来实现了多线程安全。但代价是性能的降低。由于加锁的是整个集合,所以并发情况下进行迭代会锁住很长时间。
2.4 HashMap
HashMap
采用的是哈希表结构,用链表法来解决hash冲突。这里不详细讨论,之前的文章写过:
HashMap原理解析
2.5 HashTable
HashTable
的底层实现和HashMap
类似,区别也是在许多方法上加了synchronized
关键字,来实现了多线程安全。
2.6 LinkedHashMap
在HashMap
的基础上加了双链表,该集合中的每个元素也都保留了前一个元素和后一个元素的“指针”。这样便可以按照插入顺序来读取集合元素。也可设置为按照访问顺序来读取集合元素。
由于要维护额外的双链表,LinkedHashMap
增删操作会比HashMap
慢,但迭代时会比HashMap
快。
2.7 TreeMap
采用了红黑树数据结构,从而实现了有序集合。这个比较复杂,以后单独开出一篇来讨论,此处略。
2.8 HashSet、LinkedHashSet、TreeSet
Set和Map有千丝万缕的联系呀。例如HashSet
底层实现其实就是一个固定value的HashMap
。LinkedHashSet就是一个value固定的LinkedHashMap
,TreeSet
就是一个value固定的TreeMap
。
这段内容转载自:Java.util包简单总结