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

目录
打赏
0
0
0
0
17
分享
相关文章
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
58 4
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
85 9
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
77 12
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
116 14
|
3月前
|
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
44 1
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
129 8
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。

热门文章

最新文章