Java集合框架
java集合类概述
- Set(集):对象容器中的对象没有顺序,且不能重复。
- List(列表):对象容器中的对象按照索引顺序排序,而且可以有重复的对象。
- Map(映射):对象容器中的元素包含一对"键对象-值对象"映射,其中键对象不能重复,值对象可以重复。Map(映射):对象容器中的元素包含一对"键对象-值对象"映射,其中键对象不能重复,值对象可以重复。
在Set和List接口之上,定义接口Collection,用于定义存取Set和List类型容器中对象的一些通用操作,包括对象的增加、删除、遍历等。
为支持对象的排序和遍历访问操作,Java集合框架中又提供了几个接口:
- 接口SortedSet为Set类型容器提供排序功能。
- 接口SortedMap是为Map类型容器提供对键对象的排序。
- 接口Iterator提供了对集合对象进行遍历访问的遍历器。
- 接口Comparable和Comparator用来实现集合中对象的排序。
Collection接口和Iterator接口
在集合框架中,集合(Collection)接口位于Set接口和List接口的最顶层,
是Set接口和List接口的父接口。
Collection接口中的主要方法:
操作分类 | 方 法 | 描 述 |
|
基本操作 | int size() | 返回当前集合中包含的元素个数 |
|
isEmpty() | 判断集合中是否含有元素 |
| |
boolean contains(Object o) | 判断集合中是否包含某一指定元素 |
| |
boolean add(Object o) | 向集合中添加到某一元素 | ||
boolean remove(Object o) | 从集合中删除某一元素 |
| |
Iterator iterator() | 返回一个遍历器,用来访问集合中的各个元素 |
| |
批量操作 | containsAll(Collection c) | 判断集合中是否包含某一指定集合中的全部元素 |
|
boolean addAll(Collection c) | 将另一个集合中的所有元素插入到当前集合中 |
| |
boolean removeAll(Collection c) | 从集合中删除指定集合中的全部元素 |
| |
boolean retainAll(Collection c) | 只保留指定集合中包含的元素,其他的删除 |
| |
void clear() | 删除集合中所有元素 |
| |
数组操作 | Object[] toArray() | 返回一个包含集合所有元素的array |
|
Iterator接口是一种用于遍历集合的接口。所谓遍历,是指从集合中取出每一个元素的过程。
在Collection接口中,有一个iterator()方法,通过该方法可以返回一个Iterator对象。通过这
个对象,可以遍历集合中所有元素。
实 现 方 法 | 描 述 |
hasNext() | 如果集合中还有更多元素,该方法返回true |
next() | 返回集合中的下一个元素 |
remove() | 删除iterator返回的最后一个元素 |
List接口
List接口继承自Collection接口,它有如下特点:
- List中的元素是有顺序的。
- List通常允许重复元素。
- List的实现类通常支持null元素。
- 可以通过索引访问List对象容器中的元素。
下表列出了List接口中在Collection接口新添加的一些常用方法:
方 法 | 描 述 |
|
void add(int index, Object o) | 在列表指定的位置插入对象 |
|
boolean addAll(int index, Collection c) | 将另一个集合中的所有对象插入到列表指定位置 |
|
Object get(int index) | 返回列表中指定位置的对象 |
|
Object set(int index, Object o) | 用指定对象替换列表中指定位置的对象 |
|
Object remove(int index) | 删除列表指定位置的对象 |
ArrayList
- 集合对元素类型没有任何限制。这样可能会引发一些问题。例如,如果我们想创建一个只能保存Employee类型的集合,但是别人一样可以把一个Integer类型的对象放入进去,所以可能会引发异常。
- 由于把对象放入集合后,集合丢失了对象的状态信息,集合只知道它装的是Object,所以取出来之后通常还要进行强制类型转换。这种转换既会增加编程的复杂度,也可能引发ClassCastException异常。
ArrayList底层是基于数组结构来实现的,查询数据较快,操作数据较慢
ArrayList在概念上与数组类似,表示一组编入索引的元素,区别之处在于ArrayList没有预先确定的大小,其长度可按需增大。
LinkedList
linkedList底层是基干链表结构来实现的,操作数据上较快,查询数据较慢
方 法 | 描 述 |
void addFirst(Object o) | 在链表开头添加一个对象 |
void addLast(Object o) | 在链表末尾添加一个对象 |
Object getFirst() | 返回链表中的第一个元素 |
Object getLast() | 返回链表中的最后一个元素 |
Object removeFirst() | 删除链表中的第一个元素 |
Object removeLast() | 删除链表最后一个元素 |
Vecto
Vector同ArrayList一样,也是基于数组结构来实现的,但是区别在于它线程安全
Set接口
Set接口也继承自Collection接口,同时也继承了Collection接口的全部方法。
它有如下特点:
- Set类型容器中不能包含重复元素。当加入一个元素到容器中时候,要比较元素的内容是否存在重复的,所以加入Set类型对象容器的对象必须重写equals()方法。
- 元素可能有顺序,也可能没有顺序。
- 因为元素可能没有顺序,所以不能基于索引访问Set中的元素。
但是最常用的是HashSet和TreeSet类。下面我们分别详细讲述HashSet和TreeSet类的使用。
HashSet
HashSet类是基于哈希算法的Set接口实现,它主要有如下几个特点:
- 当遍历HashSet时,其中的元素是没有顺序的。
- HashSet中不允许出现重复元素。这里的重复元素是指有相同的哈希码,并且用equals()方法进行比较时,返回true的两个对象。
- 允许包含null元素。
TreeSet
TreeSet类不仅实现类Set接口,还实现了SortedSet接口,
从而保证集合中的对象按照一定的顺序排序。当向TreeSet集合中添加一个对象时,
会把它插入到有序的对象序列中。但是这种排序并不是按照对象添加的顺序排序,
而是按照一定的算法来排序。
TreeSet集合中,只能存放相同类型的数据
集合中的元素,必须要实现Comparable接口,并重写compareTo()
TreeSet底层是TreeMap,但是TreeMap是采用二叉树的结构来存储数据,
在二叉树中,比较元素时,比树中元素小的,永远在下一代的左边
当然,比树中元素大的,永远在下干代的右边,相等的,就直接覆盖
方 法 | 描 述 |
Object first() | 返回TreeSet中第一个元素 |
Object last() | 返回TreeSet中最后一个元素 |
Object pollFirst() | 获取并删除第一个元素 |
Object pollLast() | 获取并删除最后一个元素 |
Object higher(Object o) | 返回此集合中严格大于给定元素的最小元素 |
Object lower(Object o) | 返回此集合中严格小于给定元素的最大元素 |
SortedSet headSet(Object o) | 返回集合的部分视图,其元素严格小于指定的元素o |
SortedSet tailSet(Object o) | 返回集合的部分视图,其元素大于指定的元素o |
具类Collections和Arrays
Collections类
Java集合框架中提供了一个操作Set、List和Map等集合的工具类Collections,该工具类中提供了大量方法,用于对集合元素进行排序、查询、修改等操作。这些方法都是静态方法。
Arrays类
Java集合框架不仅提供了Collections类用于操作集合,同时也提供了Arrays类用于操作数组。Arrays类包含用来操作数组(比如排序和搜索)的各种方法。