Java集合(一)—— Collection

目录

一、Java集合的分类

二、Collection

List

1.Vector (底层是数组)

2.ArrayList (底层是数组)

3.LinkedList(底层是双链表)

Set

1.Set集合添加元素判断重复的机制

2.实现类

一、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除了具备CollectionList接口提供的方法,还提供了几个去获取链表头部节点、尾部节点、头插法/尾插法增加数据的函数。
【注意】 三个实现类通用在需要有重复数据的情况下,LinkedList一般使用在大量的插入和删除的情况下,VectorArrayList 一般用在查找比较多的情况下,一般使用的都是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值