Java集合框架之 Collection 接口 #yyds干货盘点#

简介: Java集合框架之 Collection 接口 #yyds干货盘点#

Collection 接口

所有通用集合实现都有一个带有 Collection 参数的构造函数,此构造函数初始化新集合以包含指定集合中的所有元素,即它允许转换集合的类型。

如把一个 Collection<String> s,它可以转化成 List、Set 或其他类型的 Collection。如:

List<String> s = new ArrayList<String>(c);

Collection 接口包含执行基本操作的方法:

  • int size()
  • boolean isEmpty()
  • boolean contains(Object element
  • boolean add(E element)
  • boolean remove(Object element)
  • Interator<E> interator()

Collection 接口还包含对整个集合进行操作的方法:

  • boolean containsAll(Collection<?> c)
  • boolean addAll(Collection<? extends E> c)
  • boolean removeAll(Collection<?> c)
  • boolean retainAll(Collection<?> c)
  • void clear()

Collection 接口还存在用于数组操作的附加方法,例如:

  • Object[] toArray()
  • <T> T[] toArray(T[] a)

JDK 8 及更高版本中,Collection 接口还公开方法 Stream<E> stream() 和 Stream<E> parallelStream(),帮助从底层集合中获取顺序或并行流。

public interface Collection<E> {
  boolean add(E element);
  Interator<E> iterator();  // 返回一个用于访问集合中各个元素的迭代器
}

add 方法用于向集合中添加元素。如果成功添加元素改变了集合就返回 true;如果集合没有发生改变就返回 false。比如在集合( set )中添加一个对象,如果这个元素在集合中已经存在,这时 add 方法就没有奏效,因为集合中不允许有重复的对象。

interator 方法用于返回一个实现了 Interator 接口的对象,可以使用这个迭代器对象依次访问集合中的元素。

集合遍历接口--迭代器

Iterator 接口包含 4 个方法:

public interface Interator<E> {
  E next(); // 返回将要访问的下一个对象。如果已经到达了集合的末尾,将抛出一个 NoSuchElement-Exception
  boolean hasNext();  // 如果存在另一个可访问的元素,返回 true
  void remove();  // 删除上次访问的对象。这个方法必须紧跟在访问一个元素之后执行。如果上次访问之后集合已经发生了变化,这个方法将会抛出一个 IllegalStateException
  default void forEachRemaining(Consumer<? super E> action); // 访问元素,并传递到指定的动作,直到再没有更多元素,或者这个动作抛出一个异常
}

通过反复调用 next 方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next 方法将抛出一个 NoSuchElementException。因此,在需要调用 next 之前调用 hasNext 方法。

hashNext 如果迭代器对象还有多个可以访问的元素,这个方法就返回 true。

Collection<String> c = ...;
Interator<String> iter = c.iterator();
while (iter.hasNext()) {
  String element = iter.next();
  // do something with element
}

for each 循环可以更加简练地表达同样的循环操作:

for (String element : c) {
  // do something with element
  System.out.Println(element);
}

for each 循环可以处理任何实现了 Iterable 接口的对象,这个对象只包含一个抽象方法:

public interface Iterable<E> {
  Iterator<E> iterator();
}

JDK8 及更高版本中,迭代集合的首选方法是获取流并对其执行聚合操作。聚合操作需要与 Lambda 表达式结合使用,以使用较少的代码使编程更具表现力。

myShapeCollection.stream()
  .filter(e -> e.getColor() == Color.RED)
  .forEach(e -> System.out.Println(e.getName()));

访问元素的顺序取决于集合类型。

  • 如果迭代处理一个 ArrayList,迭代器索引从 0 开始,没迭代一次,索引值加 1 。
  • 如果访问 HashSet 中的元素,会按照一种基本上随机的顺序获得元素。(每一次访问的顺序都是唯一的)

Iterator 接口的 remove 方法将会删除上次调用 next 方法时返回的元素。目的是:删除某个元素前最该先看一下这个元素。

集合接口批量操作

批量操作对整个集合执行操作。包含基本的方法有:

  • contailsAll : 如果目标 Collection 包含指定 Collection 中的所有元素,就返回 true。
  • addAll : 将指定 Collection 中的所有元素添加到目标 Collection。
  • removeAll : 从目标 Collection 中删除包含在指定 Collection 中的所有元素。
  • retainAll : 从目标 Collection 中删除所有所有未包含在指定 Collection 中删除所有未包含在指定 Collection 中的元素。
  • clear : 从集合中删除所有元素。

如,检测任意集合是否包含指定元素的泛型方法:

public static <E> boolean contains(Collection<E> c, Object obj) {
    for (E element : c)
    if (element.equals(obj))
        return true;
    return false;
}

其他方法

还有一些实用方法非常有用,应该将它们提供给用户实用。下面列举一部分:

int size()  // 返回当前存储在集合中的元素个数
boolean isEmpty() // 如何集合中没有元素,返回 true
boolean contains(Object obj)  // 如果集合中包含了一个与obj相等的元素,返回true
boolean equals(Object other)  // 如果集合与 other 集合相等,返回true
boolean add(E element) // 将一个元素添加到集合中。由于这个调用改变了集合,返回 true
boolean addAll(Collection<? extends E> from) // 将 other 集合中的所有元素添加到这个集合。如果由于这个调用改变了这个集合,返回true
boolean remove(Object obj)  // 从这个集合中删除等于 obj 的对象。如果有匹配的对象被删除,返回true
boolean removeAll(Collection<?> c) // 从这个集合中删除obj集合中存在的所有元素。如果这个调用改变了集合,返回true
default boolean removeIf(Predicate<? super E> filter // JDK8, 从这个集合中删除filter返回true的所有元素,如果因为这个调用改变了集合,返回true
void clear() // 从这个集合中删除所有的元素
boolean retainAll(Collection<?> c) // 从这个集合中删除所有与other集合元素不同的元素。如果由于这个调用改变了集合,返回true
Object[] toArray() // 返回这个集合中的对象的数组
<T> T[] toArray(T[] arrayToFill)

<T> T[] toArray(T[] arrayToFill) :返回这个集合中的对象的数组。如果 arrayToFill 足够大,就将集合中的元素填入这个数组中,剩余空间填补 null;否则,分配一个新数组,其成员类型与 arrayToFill 的成员类型相同,其长度等于集合的大小,并填充集合元素。

目录
打赏
0
0
0
0
6
分享
相关文章
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
106 5
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
58 4
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
61 3
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
3月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
66 6
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
71 5
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
116 0
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
87 0
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
87 0
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
96 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等