【Java没基础】Collection接口 与 Collections类

本文介绍了Java集合框架的基础知识,包括Collection接口和Collections类的作用和使用。Collection是集合框架的根接口,提供了迭代器机制,而Collections是集合的工具类,提供了丰富的静态方法。此外,文章还提及了Arrays类,尤其是asList方法,创建的列表具有固定大小的特性。

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

前言

对于 JavaSE 的基础部分回顾已经进行到了集合框架部分,小本本上也已经密密麻麻的写了不少了,正在纠结我是应该先写 List 还是 Map 还是其他的时候,有个初学者小伙伴跟我说能不能和他聊聊 Java 整个的集合框架结构,我想那直接从顶层开始往下细化吧,思路也清晰。

正文

Java Collections Framework

Java 集合框架(JCF) 是 Java 核心库提供的一套封装了常用的数据结构和算法的接口和实现,包括数组、队列、树等数据结构及其常用的操作。
下图为JCF整体的结构图,虚线包裹的是接口,实线包裹的是实现类。

Java Collection Framework

Collection 接口

Collection 接口是 Java Collections Framework 的成员之一,是 Collection 层次结构的根接口,与 Map 接口可以看作平级(在不考虑 Iterable 接口的情况下)。Collection 存储一组类型相同的对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并对其进行最普遍的处理,Java 核心类库提供了很多十分重要的方法

public interface Collection<E> extends Iterable<E> {

  int size();  // @return 此Collection中的元素数量

  boolean isEmpty();  // @return true:当且仅当集合的大小为0

  void clear(); // 移除此 Collection 中的所有元素

  boolean contains(Object o); // @return 是否包含元素 o

  boolean add(Object o); // 向集合中添加元素 o, 成功 return true;

  boolean remove(Objcet o); // 从集合中移除元素 o, 成功 return true;

  Iterator<E> iterator(); // 返回一个迭代 Collection 中元素的迭代器
  ...
}

Collection 接口继承了Iterable 接口,实现 Collection 接口的集合必须提供一个称为 iterator 的方法,该方法返回一个 Iterator 类型的对象。我们以集成 Collection 接口的 List 接口的一个实现类 ArrayList 举例:

/**
 * Returns an iterator over the elements in this list in proper sequence.
 */
public Iterator<E> iterator() {
    return new Itr();
}

private class Itr implements Iterator<E> {
  ...
}

Iterator 迭代器可以帮助我们效率极高的遍历 Collection,能使用迭代器的集合类就可以使用增强for循环,这种语法糖极易编写。

Iterator 接口包含着一个方法 remove,该方法可以删除由 next 最新返回的元素。
当直接使用 Iterator 时,我们要记住一个基本法则:如果对正在被迭代的集合进行结构上的改变(对该集合使用 add、remove、clear),那么迭代器就不再合法(并且在其后使用迭代器的时会有 ConcurrentModificationException 被抛出)。但是,如果迭代器调用的是他自己的 remove 方法,那么这个迭代器依然合法。

Collections 类

说了 Collection ,就不得不说一下 Collections,毕竟它俩相似度很高,会让不少的新人混淆。

在这里我们重新强调一下,Collection 是结合框架的根接口,而 Collections 是实现类,而且 Collections 不是 Collection 的实现类,是 Collection 的包装类,类似工具类,不能实例化。

Collections 完全由操作 collection 或者返回 collection 的静态方法组成。
如果使用此类中的方法操作的 collection 或者对象为 null,那么这些方法都会配出 NullPointerException。

Collections 提供的很多算法拥有文档,用对这个方法使用的算法进行简短的叙述。我们应该将这类描述视为注意事项,我们可以使用其他算法代替,只需要遵循规范本身即可。

比如 Collections 提供了一个 binarySearch 方法:使用二分法搜索指定列表,以获得指定对象,在此调用之前,必须根据列表元素的自然顺序对列表进行升序排序。

public static <T> int binarySearch(List<? extends Comparable<? super T>> List, T key) { ... }

当然了,还有不少的用于其他情况下的静态方法和重载方法,这大大简化了程序开发者们的工作难度。

跑题的说一说 Arrays 类

在这里我们顺手聊聊 Java 集合框架中的另一种“工具类” Arrays。
这个类包含用来操作数组的各种方法,此类还包含一个允许将数组作为列表来查看的静态工厂(除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException 异常)。

方法名描述
binarySearch二分法查找指定内容
copyOf复制指定的数组到指定长度,截取或用其默认内容填充
copyOfRange复制指定数组到一个新数组
equals判断两个数组是否彼此相等
hashCode返回一个数组的哈希值
sort默认的对数组进行排序,也可以根据指定的比较器进行排序
toString返回指定数组内容的字符串表示形式



asList
在这里着重的聊一下这个 允许将数组作为列表来查看的静态工厂方法

返回一个受指定数组支持的固定大小的列表。此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。 ——官方API

我们可以通过现成的数组来调用此方法生成一个列表,也可以使用官方提供的一个创建固定长度的列表的便捷方法

// 方法 一
String[] str1 = new String[]{"a", "b", "c", "d"};
List<String> newStr1 = Arrays.asList(str);

// 方法 二
List<String> newStr2 = Arrays.asList("a", "b", "c", "d");

这个时候我们要注意了,回看官方 API 的描述,返回一个 固定大小 的列表。然后在源码中追溯这个方法

Arrays.asList

注意到了么,返回的这个List 是Arrays.ArrayList.ArrayLIst,再看这个特殊的 “ArrayLIst” 的代码(这里就不粘贴代码了)就可以知道,这个特殊的 LIst 是由Java工程师们特殊设计的 定制版List ,它的一个特点是 长度固定 ,我们可以 get、set、contains这个list,就是不能进行增加或删除等修改list长度的操作。在使用的时候要注意。

这里我啰嗦几句,提供几个通过数组得到正常 List 的方法

// 定义一个String数组 : strArray ["Lee", "Jone", "King"]
// 方法一:将得到的 list 放到一个新的 ArrayList中(调用 copyOf)
ArrayList<String> copyList = 
  new ArrayList<String>(Arrays.asList(strArray));

// 方法二:通过 Collections.addAll 方法
Collections.addAll(new ArrayList<String>(10), strArray);

嘿嘿,不用谢我

后记

写 blog 真是个需要灵感的事情
这有个二维码,不嫌弃的话,就关注下吧

姜某人的微信公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值