【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)

news2024/11/28 16:45:30

目录

1. 集合框架概述

1.1 生活中的容器

1.2 数组的特点与弊端

1.3 Java集合框架体系

1.4 集合的使用场景

2. Collection接口及方法

2.1 添加

2.2 判断

2.3 删除

2.4 其它

3. Iterator(迭代器)接口

3.1 Iterator接口

3.2 迭代器的执行原理

3.3 foreach循环


1. 集合框架概述

1.1 生活中的容器

1.2 数组的特点与弊端

  • 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。

  • 另一方面,使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。

  • 数组在内存存储方面的特点

    • 数组初始化以后,长度就确定了

    • 数组中的添加的元素是依次紧密排列的有序的,可以重复的。

    • 数组声明的类型,就决定了进行元素初始化时的类型。不是此类型的变量,就不能添加。

    • 可以存储基本数据类型值,也可以存储引用数据类型的变量

  • 数组在存储数据方面的弊端

    • 数组初始化以后,长度就不可变了,不便于扩展

    • 数组中提供的属性和方法少不便于进行添加、删除、插入、获取元素个数等操作,且效率不高。

    • 数组存储数据的特点单一,只能存储有序的、可以重复的数据

  • Java 集合框架中的类可以用于存储多个对象,还可用于保存具有映射关系的关联数组。

1.3 Java集合框架体系

Java 集合可分为 Collection 和 Map 两大体系:

  • Collection接口:用于存储一个一个的数据,也称单列数据集合

    • List子接口:用来存储有序的可以重复的数据(主要用来替换数组,"动态"数组)

      • 实现类:ArrayList(主要实现类)、LinkedList、Vector

    • Set子接口:用来存储无序的不可重复的数据(类似于高中讲的"集合")

      • 实现类:HashSet(主要实现类)、LinkedHashSet、TreeSet

  • Map接口:用于存储具有映射关系“key-value对”的集合,即一对一对的数据,也称双列数据集合。(类似于高中的函数、映射。(x1,y1),(x2,y2) ---> y = f(x) )

    • HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

  • JDK提供的集合API位于java.util包内

  • 图示:集合框架全图

  • 简图1:Collection接口继承树

  • 简图2:Map接口继承树

1.4 集合的使用场景

2. Collection接口及方法

  • JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)去实现。

  • Collection 接口是 List和Set接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 集合。方法如下:

2.1 添加

(1)add(E obj):添加元素对象到当前集合中
(2)addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this = this ∪ other

注意:add和addAll的区别

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;

public class TestCollectionAdd {
    @Test
    public void testAdd(){
        //ArrayList是Collection的子接口List的实现类之一。
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        System.out.println(coll);
    }

    @Test
    public void testAddAll(){
        Collection c1 = new ArrayList();
        c1.add(1);
        c1.add(2);
        System.out.println("c1集合元素的个数:" + c1.size());//2
        System.out.println("c1 = " + c1);

        Collection c2 = new ArrayList();
        c2.add(1);
        c2.add(2);
        System.out.println("c2集合元素的个数:" + c2.size());//2
        System.out.println("c2 = " + c2);

        Collection other = new ArrayList();
        other.add(1);
        other.add(2);
        other.add(3);
        System.out.println("other集合元素的个数:" + other.size());//3
        System.out.println("other = " + other);
        System.out.println();

        c1.addAll(other);
        System.out.println("c1集合元素的个数:" + c1.size());//5
        System.out.println("c1.addAll(other) = " + c1);

        c2.add(other);
        System.out.println("c2集合元素的个数:" + c2.size());//3
        System.out.println("c2.add(other) = " + c2);
    }
}

注意:coll.addAll(other);与coll.add(other);

2.2 判断

(3)int size():获取当前集合中实际存储的元素个数
(4)boolean isEmpty():判断当前集合是否为空集合
(5)boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素
(6)boolean containsAll(Collection coll):判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”
(7)boolean equals(Object obj):判断当前集合与obj是否相等

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class TestCollectionContains {
    @Test
    public void test01() {
        Collection coll = new ArrayList();
        System.out.println("coll在添加元素之前,isEmpty = " + coll.isEmpty());
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        coll.add("佛地魔");
        System.out.println("coll的元素个数" + coll.size());

        System.out.println("coll在添加元素之后,isEmpty = " + coll.isEmpty());
    }

    @Test
    public void test02() {
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        coll.add("佛地魔");
        System.out.println("coll = " + coll);
        System.out.println("coll是否包含“小李广” = " + coll.contains("小李广"));
        System.out.println("coll是否包含“宋红康” = " + coll.contains("宋红康"));

        Collection other = new ArrayList();
        other.add("小李广");
        other.add("扫地僧");
        other.add("尚硅谷");
        System.out.println("other = " + other);

        System.out.println("coll.containsAll(other) = " + coll.containsAll(other));
    }

    @Test
    public void test03(){
        Collection c1 = new ArrayList();
        c1.add(1);
        c1.add(2);
        System.out.println("c1集合元素的个数:" + c1.size());//2
        System.out.println("c1 = " + c1);

        Collection c2 = new ArrayList();
        c2.add(1);
        c2.add(2);
        System.out.println("c2集合元素的个数:" + c2.size());//2
        System.out.println("c2 = " + c2);

        Collection other = new ArrayList();
        other.add(1);
        other.add(2);
        other.add(3);
        System.out.println("other集合元素的个数:" + other.size());//3
        System.out.println("other = " + other);
        System.out.println();

        c1.addAll(other);
        System.out.println("c1集合元素的个数:" + c1.size());//5
        System.out.println("c1.addAll(other) = " + c1);
        System.out.println("c1.contains(other) = " + c1.contains(other));
        System.out.println("c1.containsAll(other) = " + c1.containsAll(other));
        System.out.println();

        c2.add(other);
        System.out.println("c2集合元素的个数:" + c2.size());
        System.out.println("c2.add(other) = " + c2);
        System.out.println("c2.contains(other) = " + c2.contains(other));
        System.out.println("c2.containsAll(other) = " + c2.containsAll(other));
    }

}

2.3 删除

(8)void clear():清空集合元素
(9) boolean remove(Object obj) :从当前集合中删除第一个找到的与obj对象equals返回true的元素。
(10)boolean removeAll(Collection coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll
(11)boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与coll集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll

注意几种删除方法的区别

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate;

public class TestCollectionRemove {
    @Test
    public void test01(){
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        coll.add("佛地魔");
        System.out.println("coll = " + coll);

        coll.remove("小李广");
        System.out.println("删除元素\"小李广\"之后coll = " + coll);
        
        coll.clear();
        System.out.println("coll清空之后,coll = " + coll);
    }

    @Test
    public void test02() {
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        coll.add("佛地魔");
        System.out.println("coll = " + coll);

        Collection other = new ArrayList();
        other.add("小李广");
        other.add("扫地僧");
        other.add("尚硅谷");
        System.out.println("other = " + other);

        coll.removeAll(other);
        System.out.println("coll.removeAll(other)之后,coll = " + coll);
        System.out.println("coll.removeAll(other)之后,other = " + other);
    }

    @Test
    public void test03() {
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
        coll.add("佛地魔");
        System.out.println("coll = " + coll);

        Collection other = new ArrayList();
        other.add("小李广");
        other.add("扫地僧");
        other.add("尚硅谷");
        System.out.println("other = " + other);

        coll.retainAll(other);
        System.out.println("coll.retainAll(other)之后,coll = " + coll);
        System.out.println("coll.retainAll(other)之后,other = " + other);
    }

}

2.4 其它

(12)Object[] toArray():返回包含当前集合中所有元素的数组
(13)hashCode():获取集合对象的哈希值
(14)iterator():返回迭代器对象,用于集合遍历

3. Iterator(迭代器)接口

3.1 Iterator接口

  • 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.IteratorIterator接口也是Java集合中的一员,但它与CollectionMap接口有所不同。

    • Collection接口与Map接口主要用于存储元素

    • Iterator,被称为迭代器接口,本身并不提供存储对象的能力,主要用于遍历Collection中的元素

  • Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。

    • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

    • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

  • Iterator接口的常用方法如下:

    • public E next():返回迭代的下一个元素。

    • public boolean hasNext():如果仍有元素可以迭代,则返回 true

  • 注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常

举例:

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class TestIterator {
    @Test
    public void test01(){
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");

        Iterator iterator = coll.iterator();
        System.out.println(iterator.next());
        System.out.println(iterator.next());
        System.out.println(iterator.next());
        System.out.println(iterator.next()); //报NoSuchElementException异常
    }

    @Test
    public void test02(){
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");

        Iterator iterator = coll.iterator();//获取迭代器对象
        while(iterator.hasNext()) {//判断是否还有元素可迭代
            System.out.println(iterator.next());//取出下一个元素
        }
    }
}

3.2 迭代器的执行原理

        Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,接下来通过一个图例来演示Iterator对象迭代元素的过程:

使用Iterator迭代器删除元素:java.util.Iterator迭代器中有一个方法:void remove() ;

注意:

  • Iterator可以删除集合的元素,但是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。

  • 如果还未调用next()或在上一次调用 next() 方法之后已经调用了 remove() 方法,再调用remove()都会报IllegalStateException。

  • Collection已经有remove(xx)方法了,为什么Iterator迭代器还要提供删除方法呢?因为迭代器的remove()可以按指定的条件进行删除。

3.3 foreach循环

  • foreach循环(也称增强for循环)是 JDK5.0 中定义的一个高级for循环,专门用来遍历数组和集合的。

  • foreach循环的语法格式:

for(元素的数据类型 局部变量 : Collection集合或数组){ 
    //操作局部变量的输出操作
}
//这里局部变量就是一个临时变量,自己命名就可以
  • 举例:

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;

public class TestForeach {
    @Test
    public void test01(){
        Collection coll = new ArrayList();
        coll.add("小李广");
        coll.add("扫地僧");
        coll.add("石破天");
		//foreach循环其实就是使用Iterator迭代器来完成元素的遍历的。
        for (Object o : coll) {
            System.out.println(o);
        }
    }
    @Test
    public void test02(){
        int[] nums = {1,2,3,4,5};
        for (int num : nums) {
            System.out.println(num);
        }
        System.out.println("-----------------");
        String[] names = {"张三","李四","王五"};
        for (String name : names) {
            System.out.println(name);
        }
    }
}
  • 对于集合的遍历,增强for的内部原理其实是个Iterator迭代器。如下图。

  • 它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统:windows11java版本:23android sdk版本:35android ndk版本:22rust版本: AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk,…

【Matlab绘图】从Excel导入表格并进行三维绘图

前言 今天手头上拿到一份论文的xlsx数据,要求使用MATLAB绘制进行三维图标坐标绘制。那么我们来看看如何使用如下数据进行绘图。 如上数据所示,数据是一个30行25列的数据,数据的内容是论文某项模型模拟的结果,我们希望把横坐标x取…

【ADC】ADC 系统失调和增益误差的校准方法

概述 本文学习于TI 高精度实验室课程,讨论如何计算增益和偏移误差并通过校准消除。首先对数据转换器系统进行偏移和增益误差计算,然后讨论几种校准此误差的方法。最后介绍一些难以校准的误差源。 文章目录 概述一、误差校准原理与方法二、实际应用问题举…

Linux进程概念二

我们利用fork函数来辅助我们讲解进程 首先认识两个调用进程地址的函数:getpid(),和getppid(),他们分别可以调用自己的pid和父进程的pid fork()可以在代码层面来创建子进程,一般而言,父进程fork出来的子进程与父进程代码和数据相…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件,可能会涉及到的会有: /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

[Cocoa]_[初级]_[绘制文本如何设置断行效果]

场景 在开发Cocoa程序时,表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时,需要截断超出宽度的文字,怎么实现? 说明 Cocoa下的文本…

【java数据结构】顺序表

【java数据结构】顺序表 一、了解List接口二、顺序表2.1 线性表2.2 顺序表2.2.1 顺序表接口的实现给数组增加新元素判断数组数据是否为满在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字…

Manim:使用Python绘制数学动画

Manim是一个由3Blue1Brown的Grant Sanderson开发的开源框架,用户可以通过编写Python代码来创建数学动画,适用于教学、科研和科普宣传等多个领域。 Manim的核心功能之一是动画效果的创建和控制。它提供了多种动画效果,如创建、变换、淡入淡出…

分布式数据库知识详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1(建立项目、执行_建立第一个工程) 建立第一个工程,使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application(最常使用) 2.项目保存位…

使用Pytorch构建自定义层并在模型中使用

使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类,自定义名称为NoisyLinear的线性层,并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…

LSM6DSV16X基于MLC智能笔动作识别(2)----MLC数据采集

LSM6DSV16X基于MLC智能笔动作识别.2--MLC数据采集 概述视频教学样品申请源码下载输出速率执行流程速率设置量程设置检测状态数据单位采集数据静止(Steady)闲置(Idle)书写(Writing)其他(other) 概述 MLC 是“机器学习核心”(Machine Learning Core)的缩写…

全球购的智能引擎:AI与RPA如何重塑跨境电商帝国?

在全球化的大潮中,跨境电商已成为连接世界的桥梁。随着人工智能(AI)和机器人流程自动化(RPA)技术的飞速发展,跨境电商领域的运作模式正在经历一场革命性的变革。 一、跨境电商的挑战 随着互联网技术的普及…

D3.js中国地图可视化

1、项目介绍 该项目来自Github,基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

在VirtualBox中安装OpenEuler操作系统保姆级教程

前言 OpenEuler是一个由中国华为公司主导开发和维护的开源操作系统项目,旨在打造一个开放、可信且可扩展的企业级操作系统,适用于多种应用场景。 该项目致力于通过开放和协作的方式推动操作系统的创新与发展。OpenEuler采用开源软件模型,允…

多模态:Florence2论文详解

文章目录 前言一、介绍二、方法1.模型结构1)Vision encoder2)Multi-modality encoder decoder3)Optimization objective 2.数据工程1)Image Collection2)Data Annotation3)Data filtering and enhancement4…

spring学习日记-day8-声明式事务

一、学习目标 声明式事务是Spring框架提供的一种事务管理方式,其主要特点是通过声明(而非编程)的方式来处理事务。这种方式让事务管理不侵入业务逻辑代码,从而提高了代码的可维护性和可读性。 定义:声明式事务…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56

【数据结构笔记13】

408数据结构答题规范 原视频 视频参考,以下为视频的笔记 需要写的部分 如果题目要求了函数名、参数列表、返回值类型就按题目的来 函数的类型可以是返回值类型或者void类型,如果函数名不清楚里面的功能是什么,在函数title下面最好写一行注…

磁盘存储和文件系统管理【1.9】

磁盘存储和文件系统管理【1.9】 12、磁盘存储和文件系统12.1.管理存储12.1.1.新加10G硬盘并识别12.1.2.备份查看MBR分区表二进制信息12.1.3.删除破坏分区表12.1.4.恢复MBR分区表12.1.5.完整步骤12.1.6.fdisk分区12.1.7.gdisk分区12.2.文件系统12.2.1.查看支持的文件系统格式12.…