一、集合的概述
1、集合的由来
Java是面向对象的语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。而我们要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,而在我们Java的基础知识里,我们有哪些容器类型的呢?答案是数组和StringBuffer两种,但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。而对象数组又不能适应变化的需求,因为数组的长度是固定的。这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
2、集合和数组的区别
既然提到了数组和集合,那么我们就说一下集合和数组的区别:
A:长度区别
数组的长度固定
集合的长度可变
B:内容不同
数组存储的是同一种类型的元素
集合可以存储不同类型的元素
C:存储元素的数据类型不同
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用数据类型
二、Collection集合的框架体系
1、Collection集合体系
Collection集合是单列集合的顶层接口。Collection表示一组对象,这些对象也称为Collection的元素。该集合的数据结构(简单记就是数据的存储方式)对集合元素有效。
Collectoin集合的功能概述:
1)添加功能
boolean add(Object obj):添加功能
boolean addAll(Collection c):添加一个集合的元素
2)删除功能
void clear():移除所有元素
boolean remove(Object obj):移除一个元素
boolean removeAll(Collection c):移除一个集合的元素(只要有一个元素移除了就返回true)
3)判断功能
boolean contains(Object obj):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(只有包含指定集合中所有的元素才叫包含)
boolean isEmpty():判断集合是否为空(指集合的数据元素为空)
4)获取功能
Iterator iterator():迭代器,集合专有的遍历方式
5)长度功能
int size():元素的个数
6)交集功能
boolean retainAll(Collection c):两个集合中都有的元素(假设有两个集合A、B,A对B做交集,最终的结果保存在集合A中,集合B不变,返回值表示的是集合A是否发生过改变)
7)把集合转换为数组
Object[] toArray():把集合转成数组,可以实现集合的遍历
Collection集合有两个子接口List和Set。
2、List集合
List集合的特点:有序(指存储和取出元素的顺序一致)、存储元素可重复
List集合的特有功能:
1)添加功能
void add(int index,Object element):在指定位置添加元素
2)获取功能
Object get(int index):获取指定位置的元素
3)列表迭代器
ListIterator listIterator():迭代所有的元素
ListIteraror listIterator(int index):从指定位置开始迭代元素
4)删除功能
Object remove(int index):根据索引删除元素,返回被删除的元素
5)修改功能
Object set(int index,Object element):根据索引修改元素,返回被修改的元素
List集合有ArrayList、Vector和LinkedList三个常用子类。
3、List集合的子类
List集合的子类特点:
ArrayList的底层数据结构是数组,查询快,增删慢,线程不安全,效率高
Vector的底层数据结构是数组,查询快,增删慢,线程安全,效率低
LinkedList的底层数据结构是链表,查询慢,增删快。线程不安全,效率高
Vector的特有功能:
1)添加功能
public void addElement(Object obj)
2)获取功能
public Object elementAt(int index)
public Enumeration elements()
LinkedList的特有功能:
1)添加功能
public void addFirst(Object obj)
public void addLast(Object obj)
2)获取功能
public Object getFirst()
public Object getLast()
3)删除功能
public Object removeFirst()
public Object removeLast()
4、Set集合
Set集合的特点:无序(指元素的存储和取出顺序不一致)、存储元素唯一
Set集合有HashSet和TreeSet两个常用子类。
5、Set集合的子类
1)HashSet类的特点:
HashSet类不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。
注意:虽然Set集合的元素是无序的,但是作为集合来说,它肯定有它自己的元素存储顺序。而如果你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,看效果。
HashSet类的底层数据结构是哈希表。而哈希表保证元素的唯一性依赖于两个方法:int hashCode()和boolean equals(Object obj)
用HashSet存储元素的执行顺序:
首先比较hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
HashSet类有一个子类LinkedHashSet,LinkedHashSet存储元素的特点是有序、唯一
LinkedHashSet的底层数据结构由链表和哈希表组成,由链表保证元素有序,由哈希表保证元素唯一。
2)TreeSet类的特点
TreeSet类底层数据结构是红黑树(是一种自平衡的二叉树)。
TreeSet类如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
TreeSet类如何保证元素的排序呢?
a:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
b:比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象