Java集合类之Collection接口及其子接口

本文深入解析Java集合框架,包括Collection、List、Set、Queue接口及其核心实现类如ArrayList、LinkedList、HashSet、TreeSet和PriorityQueue的特性与区别,探讨各种集合在实际开发中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collection接口

在Java的类集里面(java.util包)提供了两个最为核心的接口:Collection、Map接口。
Collection是单个集合保存的最大父接口

Collection接口继承树:

Collection接口继承树
Collection接口常用方法:

1. add(E e) : 向集合中添加元素
2. addAll(Collection<? extends E> c) : 向集合中添加一组数据
3. clear() :清空集合数据
4. contains( Object o) : 查找数据是否存在.(需要使用equals()方法).
5. remove( Object o) : 删除数据.(需要使用equals()方法).
6. size() : 取得集合长度
7. toArray() : 将集合变为对象数组返回
8. iterator() : 取得Iterator接口对象,用于集合输出.

在实际开发中,我们很少直接使用Collection接口,往往考虑使用它的子接口:
List(允许数据重复),Set(不允许数据重复)和Queue

下面我们先来看看List接口:

List接口:

List接口提供了两个扩充方法:

  1. get(int index) : 根据索引取得保存数据
  2. set(int index,E element) : 修改数据

List本身还是接口,想要取得接口的实例化对象,就必须有子类,在List接口下有三个常用子类:ArrayList, Vector (不常用), LinkedList.

ArrayList和Vector的区别?

  1. 时间:ArrayList时JDK1.2开始提供的,Vector是从JDK1.0开始提供的.
  2. 安全性:ArrayList采取异步处理,性能较高,线程不安全,Vector采取同步处理,性能较低,线程安全.
  3. 输出形式:ArrayList支持Iterator, ListIterator, foreach ,Vector支持Iterator, ListIterator, foreach ,Enumerator.

ArrayList和LinkedList的区别?

  1. ArrayList基于动态数组实现,LinkedList基于链表实现.
  2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针,
  3. 对于添加(add)和删除(remove)操作LinkedList要优于ArrayList,因为ArrayList要移动数据.

Set接口:

Set接口中没有get()方法
在Set接口下有两个常用子类:HashSet(无序存储),TreeSet(有序存储)

1.HashSet

HashSet不能保证元素的排列顺序,不是同步的,集合元素可以是null但是只能放入一个null,
HashSet判断两个元素相等的标准是equals()相等,并且hashCode()返回值相等.

2.TreeSet
TreeSet支持两种排序方式:1.自然排序 2.定制排序.

a.自然排序: 自然排序使用CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
obj1.compareTo(obj2)方法,返回0,则说明被比较的两个对象相等,
返回一个正数,则表明obj1大于obj2,返回负数,则表明obj1小于obj2。

b.定制排序: 使用Comparator接口,实现 int compare(To1,To2)方法

Queue

除了Collection接口中基本操作外,Queue还提供了其它的插入、获取和检查操作。

  1. boolean add(E e) : 插入指定元素, 操作成功返回true.如果当前没有空间可用,抛出一个IllegalStateException
  2. boolean offer(E e) : 插入指定元素, 操作成功返回true, 失败返回false. (在有容量限制的队列中,这个方法比add()更好.)
  3. E remove() :检索并删除队列的头部元素,还将它返回队列,为空时抛出异常。
  4. E poll():检索并删除队列的头部元素,并将它返回,队列为空时返回null。
  5. E element():检索并返回头部元素,队列为空时,抛出出异常.
  6. E peek() : 检索并返回头部元素,队列为空时,返回null。

PriorityQueue类

非线程安全, PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按队列元素的大小重新排序。当调用peek()或者是poll()方法时,返回的是队列中最小的元素。当然也可以自定义排序.

### 向Java Collection接口的实现类中添加元素 在Java中,`Collection` 接口本身并不提供具体的实现类,而是通过其子接口 `List` 和 `Set` 来间接实现。为了向这些集合中添加元素,通常会使用具体实现类的对象。 #### 使用ArrayList作为List的具体实现 对于 `List` 类型的集合,可以通过创建 `ArrayList` 对象并调用 `add()` 方法来添加元素: ```java import java.util.ArrayList; import java.util.List; public class AddToListExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); // 添加单个元素到列表末尾 list.add("Apple"); list.add("Banana"); // 在指定索引处插入元素 list.add(0, "Orange"); System.out.println(list); // 输出: [Orange, Apple, Banana] } } ``` 这段代码展示了如何利用 `ArrayList` 的两个不同形式的 `add()` 方法:一种是在列表最后追加新项;另一种则允许指定要插入的位置[^2]。 #### 使用HashSet作为Set的具体实现 当涉及到不允许有重复成员且不需要保持任何特定顺序的情况时,则可以选择基于 `Set` 接口的 `HashSet` 实现来进行操作: ```java import java.util.HashSet; import java.util.Set; public class AddToSetExample { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); // 尝试多次添加相同的整数只会保留一次实例 set.add(1); set.add(2); set.add(2); System.out.println(set.size()); // 输出: 2 (因为只存入了不同的数值) } } ``` 这里可以看到即使尝试加入相同的数据两次以上,在最终的结果集中也仅会出现一次该值的存在[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值