Java—Collection、Iterable、Iterator的区别

简介: 今天先来介绍Java集合中的老大类Collection接口,说说Collection、Iterable和Iterator三个接口之间的关系,为什么要封装一个Collection接口?我们今天来讨论讨论

今天先来介绍Java集合中的老大类Collection接口,说说Collection、Iterable和Iterator三个接口之间的关系,为什么要封装一个Collection接口?我们今天来讨论讨论


d76a62d7d8c1c5529e5a747b4b62f5d4.png


为什么定义出一个Collection接口?


Collection接口可以理解为是父接口,它里面定义了下面具体实现接口类的一些公共规范。比方说添加元素、删除元素都提供了统一的方法来实现。还为实现类List、Set提供了两个构造函数(void无参构造函数、具有指定容量的构造函数)。


Iterable是什么?


遍历集合的接口,提供了用于遍历集合的iterable方法,里面定义了用于for-each元素的具体逻辑,并且返回一个T类型的Iterator迭代器对象


b5a80e571550bd12e86ed4538aa36652.png


Iterator是什么?


迭代器接口,可以用来遍历集合对象,提供了hashNext()、next()、remove()三个公共的操作接口,实现解耦合(隔离容器类的遍历操作和底层实现)


Collection、Iterable、Iterator三者之间有什么关系?


Collection:父接口,继承Iterable接口,提供了实现类统一的操作方法


Iterable:接口,提供了遍历元素的方法,返回一个T类型的Iterator对象


Iterator:迭代器接口,用来遍历集合对象执行的具体操作


下面我们来看看他们三者的具体应用


Collection接口


Collection中能存放什么元素?


没有使用“泛型”之前,Collection中可以存储Object的所有子类型。使用了“泛型”之后,Collection中只能存储某个具体的类型。


方法


int size();
boolean isEmpty();
void clear();
boolean contains(Object element);
boolean add(Object element);
boolean remove(Object element);
Iterator iterator();
boolean containsAll(Collection c);
boolean addAll(Coolection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
Object[] toArray();


实战演练


import java.util.*;
public class CollectionTest {
    public static void main(String[] args){
        Collection c = new ArrayList();
        //可以放入不同类型的对象
        c.add("hello");
        c.add(new Name("f1","l1")); 
        System.out.println(c.size());
        System.out.println();
    }
}
 class Name {
    private String firstName,lastName;
    public Name(String firstName,String lastName){
         this.firstName=firstName;
         this.lastName =lastName;
    }
    public String getFirstName(){
        return firstName;
    }
    public String getLastName(){
        return lastName;
    }
    public String toString(){
        return firstName+" "+lastName;
    }
}


import  java.util.*;
public class BasicContainer {
    public static void main(String[] args){
        Collection c= new HashSet();
        c.add("hello");
        c.add(new Name("f1","l1"));
        c.add(new Integer(100));
        c.remove("hello");
        c.remove(new Integer(100));
        System.out.println(c.remove(new Name("f1","l1")));
        System.out.println(c);
    }
}
class Name {
    private String firstName,lastName;
    public Name(String firstName,String lastName){
        this.firstName=firstName;
        this.lastName =lastName;
    }
    public boolean equals(Object obj){
        if(obj instanceof Name){
            Name name=(Name) obj;
            return (firstName.equals((name.firstName)))
                    && (lastName.equals(name.lastName));
        }
        return super.hashCode(){
            return firstName.hashCode();
        }
    }
}


Iterator接口


统一遍历Collection元素的接口


  • 迭代:重复执行某一个固定的过程,每一次迭代得到的结果作为下一次迭代的初始值
  • 迭代器: 遍历集合的对象,为各种容器提供了公共操作接口,隔离对容器的遍历操作和底层实现,实现解耦


迭代器类似与foreach遍历,每次遍历集合中的一个元素,每次自增1


方法


hashNext()
next()
remove()


实战演练


import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest {
    public static void main(String[] args) {
        //创建集合对象
        Collection c = new ArrayList();
        //添加元素
        c.add("abc");
        c.add("def");
        c.add(100);
        c.add(new Object());
        //获取集合对象的迭代器对象Iterator
        Iterator it = c.iterator();
        //通过以上或取得迭代器想开始迭代/遍历集合
        while (it.hasNext()) { 
            // 让迭代器前进一位,并且将 指向的元素返回
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}


内存执行图


49bfae449e050ff2d12866ac62010234.png

相关文章
|
1月前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
1天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
18天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
27天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
1月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
26 1
|
1月前
|
设计模式 安全 Java
Java Iterator(迭代器)详解
在Java中,`Iterator`是一种设计模式,用于遍历如`List`、`Set`等集合,提供统一访问元素的方式而不暴露内部结构。它包括`hasNext()`、`next()`和`remove()`方法,通过集合的`iterator()`方法获取实例,可用于安全删除元素,避免`ConcurrentModificationException`。
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
43 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
36 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
80 1
|
1月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
34 0
Java中 final、finally、finalize 有什么区别?
下一篇
无影云桌面