# 概念
在编程的过程中,我们遇到需要保存的对象,我们可以使用数组进行存储,但是因为数组在初始化的时候指定了数组长度,所以这个数组长度是固定的,当我们需要保存的对象个数不确定或者大于数组的长度时,这时候数组就显得不是很方便了,而且数组无法保存具有映射关系的数据。
为了保存不确定的数据对象,以及保存具有映射关系的数据,Java 提供了集合类。
集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
集合类和数组不一样
数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),
集合里 ** 只能保存对象 **(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)
# 分类
在 Java 中集合类分为 Collection 和 Map,他们都是 Java 集合的根接口。
接口/类说明
名 称 | 用 途 |
---|---|
Iterator 接口 | 集合的输出接口, 主要用于遍历输出(即迭代访问)Collection 集合中的元素 Iterator 对象被称之为迭代器。 迭代器接口是集合接口的父接口,实现类实现 Collection 时就必须实现 Iterator 接口。 |
Collection 接口 | 是 List、Set 和 Queue 的父接口,是存放一组单值的最大接口。 一般很少直接使用此接口直接操作。 |
Queue 接口 | Queue 是 Java 提供的队列实现。 |
Dueue 接口 | 是 Queue 的一个子接口,为双向队列。 |
List 接口 | 最常用的接口。 有序集合,允许有相同的元素。 使用 List 能够精确地控制每个元素插入的位置,用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,与数组类似。 |
Set 接口 | 不能包含重复的元素。 |
Map 接口 | 接口中的每个元素都是一对,以 key:value 的形式保存。 |
日常使用的较多的类有:HashSet、TreeSet、ArrayList、ArrayDueue、LinkedList 和 HashMap、TreeMap
- HashSet: 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,为优化查询速度而设计。
- TreeSet:是一个有序的 Set,这样就能从 Set 里面提取一个有序序列。
- ArrayList:能进行快速的随机访问,效率高而且实现了可变大小的数组。
- ArrayDueue:按 “先进先出” 的方式操作集合元素。
- LinkedList:可以把它当成 Stack(栈)或者 Queue(队列)来使用,优化了顺序访问,随机访问较慢。
- HsahMap:按哈希算法来存取键对象
- TreeMap:可以对键对象进行排序
Collection
Collection 接口定义了一些通用的方法
方法名称 | 说明 |
---|---|
boolean add(E e) | 向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。 E 是元素的数据类型 |
boolean addAll(Collection c) | 向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。 |
void clear() | 清除集合中的所有元素,将集合长度变为 0。 |
boolean contains(Object o) | 判断集合中是否存在指定元素 |
boolean containsAll(Collection c) | 判断集合中是否包含集合 c 中的所有元素 |
boolean isEmpty() | 判断集合是否为空 |
Iterator | 返回一个 Iterator 对象,用于遍历集合中的元素 |
boolean remove(Object o) | 从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。 |
boolean removeAll(Collection c) | 从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。 |
boolean retainAll(Collection c) | 从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。 |
int size() | 返回集合中元素的个数 |
Object[] toArray() | 把集合转换为一个数组,所有的集合元素变成对应的数组元素。 |
List
List 实现了 Collection 接口
常用的有:ArrayList 和 LinkedList
Arraylist:
方法名称 | 说明 |
---|---|
E get(int index) | 获取此集合中指定索引位置的元素 E 为集合中元素的数据类型 |
int index(Object o) | 返回此集合中第一次出现指定元素的索引 如果此集合不包含该元 素,则返回 -1 |
int lastIndexOf(Object o) | 返回此集合中最后一次出现指定元素的索引 如果此集合不包含该 元素,则返回 -1 |
E set(int index, Eelement) | 将此集合中指定索引位置的元素修改为 element 参数指定的对象。 此方法返回此集合中指定索引位置的原元素 |
List | 返回一个新的集合,新集合中包含 fromlndex 和 tolndex 索引之间 的所有元素。 包含 fromlndex 处的元素,不包含 tolndex 索引处的 元素 |
LinkedList:
方法名称 | 说明 |
---|---|
void addFirst(E e) | 将指定元素添加到此集合的开头 |
void addLast(E e) | 将指定元素添加到此集合的末尾 |
E getFirst() | 返回此集合的第一个元素 |
E getLast() | 返回此集合的最后一个元素 |
E removeFirst() | 删除此集合中的第一个元素 |
E removeLast() | 删除此集合中的最后一个元素 |
ArrayList 与 LinkedList 都是 List 接口的实现类,因此都实现了 List 的所有未实现的方法,只是实现的方式有所不同。
ArrayList 是基于动态数组的实现,访问元素速度优于 LinkedList。
LinkedList 是基于链表结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。
根据需求来选则
Set
常用的实现类:HashSet 类和 TreeSet 类
HashSet 是按照 Hash 算法来存储集合中的元素(实际上是一个 HashMap 集合),所以查询和存放速度快,不允许有重复元素的集合。保证元素唯一性的方式依赖于:hashCode () 于 equals () 方法。
保证 HashSet 集合元素的唯一,其实就是根据对象 hashCode 和 equals 方法来决定的。如果往集合中存放自定义对象,为了保证唯一性,就必须重写 hashCode 和 equals 方法建立属于当前对象的比较方法。
// 重写 hashCode 方法 | |
public int hashCode() | |
{ | |
return name.hashCode() + age; | |
} | |
// 重写 equals 方法 | |
public boolean equals(Object obj) | |
{ | |
if(this == obj) | |
return true; | |
if(obj == null) | |
return false; | |
if(obj instanceof Person) | |
{ | |
Person P = (Person)obj; | |
return name.equals(obj.name) && age == P.age; | |
} | |
return false; | |
} |
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 必须在多线程访问时显式同步对 HashSet 的并发访问。
TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对集合进行自然排序。
TreeSet 只能对实现了 Comparable 接口的类对象进行排序。
Map
Map 是采用键值对来存储的
- 每个元素成对存在,由键和值两部分组成,通过键可以找到对应的值
- 键(key 值)不可重复,值(value)可以重复,一个 value 值可以和很多 key 值形成对应关系,每个建最多只能映射到一个值
- 两个 Map 接口的重要实现类:HashMap 类、LinkedHashMap 类
Map 常用方法:
get(Object key):获取指定键 (key) 所对应的值 (value)
put(K key,V value):将指定的键与值对应起来,并添加到集合中
若指定的键 (key) 在集合中没有,则没有这个键对应的值,返回 null,并把指定的键值添加到集合中
若指定的键 (key) 在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值
remove(Object key):根据指定的键 (key) 删除元素,返回被删除元素的值 (value)