Java容器深入浅出之Collection与Iterator接口

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系。其中包括:1. Collection:包括Set、List和Queue;主要的实现类有HashSet、TreeSet、ArrayList、LinkedList和ArrayDeque2.

Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系。其中包括:

1. Collection:包括Set、List和Queue;主要的实现类有HashSet、TreeSet、ArrayList、LinkedList和ArrayDeque

2. Map:主要的实现类为HashMap、TreeMap

3. Iterator: 用于遍历集合中的对象

Collection

Collection接口中定义了Set、List和Queue都会用到的方法,包括:

1. 增

boolean add(Object o)

boolean addAll(Collection c)

2. 删

boolean remove(Object o): 删除对象o,只删除第一个符合的对象,成功返回true

boolean removeAll(Collection c):删除集合c包含的所有元素,

boolean removeIf(Predicate<? super E> filter):Java8增强的条件查询,传入函数式Predicate对象filter进行条件删除

boolean retainAll(Collection c):删除c中不包含的元素,相当于取交集

void clear():清除所有元素,长度归0

3. 查

int size()

boolean isEmpty()

boolean contains(Object o):是否包含元素o

boolean containsAll(Collection c):是否包含集合c的所有元素

4. 改

Object toArray():集合变为数组

5. 其它

Iterator iterator():返回一个Iterator对象,用于遍历集合元素

Iterator

Iterator是Java集合的接口成员,提供遍历集合对象的方法。定义了如下4个方法:

1. boolean hasNext():判断是否遍历完成

2. Object next():返回下一个元素

3. void remove():删除上一次next返回的元素

4. void forEachRemaining(Consumer action):Java8新增的Lambda遍历方法

要注意的是:

1. Iterator对象通过集合调用Iterator方法生成。

2. Iterator遍历集合元素时(包括增强for循环),是通过值传递来获取元素的值,因此在迭代中修改元素的值将不起作用。

3. Iterator只能通过自身的remove方法删除对象,而不能调用集合自身的remove方法,否则会导致ConcurrentModificationException异常。

4. Iterator对象的遍历方法,无论是常规的while循环,还是Java8新增的forEachRemaining方法,只能在一个方法中遍历一次集合。(原因在于底层都是通过Next来返回集合元素,在第一轮中已经Next完集合所有元素了,所以再起一轮遍历,hasNext将为false;相反,集合的forEach方法,则可以多轮遍历)

public class IteratorTest {

    public static void main(String[] args) {
        
        Set<String> books = new HashSet<String>();
        books.add("1844年经济学哲学手稿");
        books.add("德谟克利特的自然哲学和伊壁鸠鲁的自然哲学的差别");
        books.add("资本论");
        books.add("自然辩证法");
        books.add("1");
        //Java8的增强条件删除,需要传入函数式条件
        books.removeIf(ele -> ele.length() < 3);
        
        Iterator<String> it = books.iterator();
        //使用Lambda表达式遍历集合(Iterator对象)
        //it.forEachRemaining(obj -> System.out.println("Iterator遍历对象:" + obj));
        
        while(it.hasNext()) {
            String book = it.next();
            System.out.println(book);
            if(book.equals("资本论")) {
                it.remove();
            }
            book = "通往奴役之路";//Iterator不能改变集合元素,赋值失败
        }
        
        System.out.println(books);

        
        //使用Lambda表达式遍历集合(集合对象)
        books.forEach(obj -> System.out.println("集合遍历对象:" + obj));
    }

}

 

 

目录
相关文章
|
3月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
66 2
|
3月前
|
JSON Java 数据库连接
|
5月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
107 0
|
5月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
108 0
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
存储 Java 容器
Java中集合容器详解:简单使用与案例分析3
Java中集合容器详解:简单使用与案例分析
181 0
|
安全 算法 Java
安全无忧:Java并发集合容器的应用与实践
安全无忧:Java并发集合容器的应用与实践
97 0
安全无忧:Java并发集合容器的应用与实践
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
132 0
|
存储 算法 安全
面霸篇:Java 核心集合容器全解(核心卷二)
面霸篇:Java 核心集合容器全解(核心卷二)
112 0