一、集合概述
Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而数组长度固定,不能满足变化的要求。所以,java提供了集合。数组就是一个集合,集合实际上就是一个容器,可以容纳其他类型的数据。在实际开发当中,从数据库查询出的所有的对象,封装成对于的Java对象,放入到对于类型的集合里面。
特点:
- 容器(变量、数组(储原始类型数据)):可以存储多个数据,必须存对象。
- 集合的空间大小是动态分配的:根据集合中存储的元素的增多或者减少自动调整空间大小。
- 集合不能直接存储基本数据类型,另外集合也不能直接存储Java对象,集合存储的都是Java对象的内存地址(或者说集合存储的是引用)
- 在Java中,每一个Java集合对于不同的数据结构,往不同的集合中存储元素,相当于往不同的数据结构存储元素。
- 所以的集合类与集合接口都在Java.util.*;包下。
- 与数组区别:
数组 | 集合 | |
长度 | 固定 | 可变 |
存储元素 | 基本类型/引用类型 | 引用类型 |
元素类型的一致性 | 必须一致 | 可以不一致 |
二、集合体系
集合作为一个容器,可以存储多个元素,但是由于数据结构的不同,java提供了多种集合类。将集合类中共性的功能,不断向上抽取,最终形成了集合体系结构。
三、Java Collections Framework
容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK 1.2,优点是:
- 降低编程难度
- 提高程序性能
- 提高API间的互操作性
- 降低学习难度
- 降低设计和实现相关API的难度
- 增加程序的重用性
Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。
Java集合的继承结构图
- ArrayList
(1)ArrayList集合底层采用了数组这种数据结构。
(2)ArrayList集合是非线程安全的。
(3)ArrayList集合适合查询,不适合频繁的增删改。
- LinkedList
(1)LinkedList集合采用了双向链表数据结构。
(2)LinkedList集合适合增删改,不适合查询。
- Vector
(1)Vector集合底层采用了数组这种数据结构。
(2)Vector集合是线程安全的。
(3)Vector所有的方法都有synchronized关键字修饰,所以线程安全,但是效率较低,现在保证线程安全有别的方案,所以Vector使用的较少了。
- Set
(1)Set集合存储元素特点:无序不可重复,无序表示存进去是这个顺序,取出来就不一定是这个顺序了。
(2)Set集合中元素没有下标,Set集合中的元素还不能重复。
(3)实际上HashSet集合在new的时候,底层实际上new了一个HashMap集合。向HashSet集合中存储元素,实际上是存储到HashMap集合中了。
HashMap集合是一个哈希表数据结构。
TreeSet集合底层实际上是TreeMap。new TreeSet集合的时候,底层实际上new了一个TreeMap集合。
往TreeSet集合中放数据的时候,实际上是将数据放到TreeMap集合中了。
TreeMap集合底层采用了二叉树数据结构。
补充:SortedSet集合存储元素的特点:
由于继承了Set集合,所以它的特点也是无序不可重复,但是放在SortedSet集合中的元素可以自动排序。我们称为可排序集合。放到该集合中的元素是自动按照大小顺序排序的。
Map集合继承结构图
总结:
ArrayList | 底层是数组 |
LinkedList | 底层是双向链表 |
Vector | 底层是数组,线程安全的,效率较低,使用较少 |
HashSet | 底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合key部分了 |
TreeSet | 底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合key部分了 |
HashMap | 底层是哈希表 |
Hashtable | 底层也是哈希表,只不过线程安全的,效率较低,使用较少 |
Properties | 是线程安全的,并且key和value只能存储字符串String |
TreeMap | 底层是二叉树。TreeMap集合的key可以自动按照大小顺序排序 |
存储元素的特点:
List集合 | Set(Map)集合存 | SortedSet(SortedMap)集合 |
有序可重复 | 无序不可重复 | 首先是无序不可重复的,但是SortedSet集合中的元素是可排序的 |
有序:存进去的顺序和取出的顺序相同,每一个元素都有下标 | 无序:存进去的顺序和取出的顺序不一定相同。另外Set集合中元素没有下标 | 无序:存进去的顺序和取出的顺序不一定相同。另外Set集合中元素没有下标 |
可重复:存进去1,还可以再存储一个1 | 不可重复:存进去1,就不能再存储1了 | 不可重复:存进去1,就不能再存储1了。可排序:可以按照大小顺序排列 |
Map集合的key,就是一个Set集合。
在Set集合中放数据,实际上放到了Map集合的key部分。