目录
一、Java集合的分类
1.Collection集合体系:单列集合
2.Map集合体系:双列集合(由key和value两部分组成,其中key值不能重复的)
【注意】 Java集合中存放的数据都是以泛型指定,所以Java集合只能存放引用类型数据,基本类型数据是无法存放。
二、Collection
List
List是Collection的子接口,可以存放重复性元素,并且接口中还提供了一些可以根据索引取值和增加数据的方法。 List的常用实现类
1.Vector
(底层是数组)
(1)Vector
集合创建对象有四种方式
- 无参构造器:默认构造一个数组长度为10的,自增因子为0的集合
- int类型参数的构造器:构造一个数组长度为参数的,自增因子为0的集合
- 双参构造器:构造器一个指定数组长度和自增因子的集合
- 参数为集合的构造器:构造一个数组长度为集合长度,自增因子为0的集合
(2)扩容机制
- 默认情况下,
Vector
会将其容量增加到原来的两倍(oldCapacity * 2
)。如果在创建Vector
时指定了增量(自增因子),扩容是原先的数组长度+自增因子。 - 如果通过上述计算得到的新容量仍然小于添加元素后所需的容量(即
minCapacity
),那么新容量将直接设置为minCapacity
。 - 在设置新容量之前,
Vector
也会检查新容量是否超过了Integer.MAX_VALUE - 8
(与ArrayList
类似,这是为了确保在扩容时有足够的空间进行数组复制和其他计算,而不会导致整数溢出)。 - 如果新容量超过了这个值,将抛出
OutOfMemoryError
异常。
2.ArrayList
(底层是数组)
(1)构建方式
- 无参构造器:无参构造器底层会创建一个默认容量的空数组,但是空数组在第一次添加数据的时候,会变成一个长度为10的数组。
- int类型的有参构造器:构建了一个指定长度的数组
- 集合类型的有参构造器:构建一个长度为集合长度的数组
(2)扩容机制
- 如果
ArrayList
是通过默认的无参构造器创建的,那么新的容量将是旧容量的 1.5 倍(oldCapacity * 1.5
),但这个过程会确保新容量至少为DEFAULT_CAPACITY_INCREMENT
(默认是 10,但这个值在 JDK 的某些版本中可能并不直接使用,而是作为扩容的一个备选值)。然而,在大多数情况下,扩容行为是容量翻倍或增加到一个较大的值。 - 如果
ArrayList
是在创建时指定了初始容量的,那么扩容时就不会考虑DEFAULT_CAPACITY_INCREMENT
,而是直接计算新的容量(通常是旧容量的 1.5 倍或更大,以确保有足够的空间)。 - 如果通过上述计算得到的新容量仍然小于添加元素后所需的容量(即
minCapacity
),那么新容量将直接设置为minCapacity
- 在设置新容量之前,会检查新容量是否超过了
Integer.MAX_VALUE - 8
(这是为了确保在扩容时有足够的空间进行数组复制和其他计算,而不会导致整数溢出)。 - 如果新容量超过了这个值,将抛出
OutOfMemoryError
异常。
3.LinkedList(
底层是双链表)
(1)双链表在Java中通过LinkedList的内部类Node(数据域、前指针、尾指针)实现。
(2)每一次使用add增加数据,用的是尾插法增加数据。
(3)LinkedList
除了具备Collection和List
接口提供的方法,还提供了几个去获取链表头部节点、尾部节点、头插法/尾插法增加数据的函数。
【注意】 三个实现类通用在需要有重复数据的情况下,LinkedList一般使用在大量的插入和删除的情况下,Vector和ArrayList
一般用在查找比较多的情况下,一般使用的都是ArrayList,而在多线程环境下,如果需要使用 List
,则可能需要考虑 Vector
或使用其他同步机制来保护 ArrayList
或 LinkedList
。
Set
Set是Collection的子接口,不可以存放重复性元素。
1.Set集合添加元素判断重复的机制
- 计算哈希值:首先,调用要添加元素的
hashCode()
方法计算其哈希值。 - 定位桶:使用哈希值定位到内部存储结构(如哈希表)中的桶。
- 遍历桶中的元素(如果哈希冲突):遍历桶中的元素,使用
equals(Object obj)
方法比较它们是否与要添加的元素相等。 - 判断重复性:
- 如果在桶中没有找到相等的元素,则添加新元素。
- 如果在桶中找到了相等的元素(即
equals(Object obj)
返回true
),则不添加新元素,因为集合中不允许重复元素。
注意:判断两个对象是否相等时,不应该使用==
运算符,因为==
比较的是对象的引用(即内存地址),而不是对象的内容或逻辑等价性。
2.实现类
- HashSet(底层是HashMap):元素不可以重复,而且元素无序。允许使用
null
元素,但最多只能有一个null
元素。 - LinkedHashSet(底层是LinkedHashMap):元素不可以重复,但是元素插入有序(按照元素被添加到集合中的顺序)。它是
HashSet
的一个子类。 - TreeSet(底层是红黑树):元素不可以重复,但是元素有序(按照自然顺序或构造时指定的比较器进行排序)。
TreeSet
基于红黑树实现,要求元素必须实现Comparable
接口或在创建TreeSet
时提供一个Comparator
。