集合的基本内容以及迭代器的介绍

news2024/11/27 18:38:24

在我们java中我们存储数据的方式,在我们之前学习中数组是可以存储我们的数据的,但是数组存储数据有一些弊端,灵活性不强,存储数据类型有限,灵活性不强这一点主要是体现在两个方面:一方面数组的长度是自定义后就不改变的,而且必须提前定义,另一方面,增加和修改数组的数据过程是很复杂的。而且数组只能存储同一类型的数据,为了解决这个弊端我们提出了集合这个概念,集合分为两大类一个是实现Collection接口的类,Map类俩种,集合有什么好处呢,集合的长度是可变的,而且它可以存储多种数据类型,而且它提供了许多便利的方法,之后我们会依次的用代码实例展示,并且分析源码,首先我们先看一下这两大类的体系图。

Collection类:

Map类:

这里我们大概了解一下它的数据形式,List和Set接口实现的是单列集合,Map接口实现的是双列集合即K-V,这里的K指的是Key,这里的V指的是Value,我们又称它为键值对。

这里我们先演示一下Collection接口实现类ArrayList类的相关方法以及注释:

import java.util.ArrayList;
import java.util.List;
public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        // add:添加单个元素
        list.add("jack");
        list.add(10);//list.add(new Integer(10))
        list.add(true);
        System.out.println("list=" + list);
        // remove:删除指定元素
        //list.remove(0);//删除第一个元素
        list.remove(true);//指定删除某个元素
        System.out.println("list=" + list);
        // contains:查找元素是否存在
        System.out.println(list.contains("jack"));//T
        // size:获取元素个数
        System.out.println(list.size());//2
        // isEmpty:判断是否为空
        System.out.println(list.isEmpty());//F
        // clear:清空
        list.clear();
        System.out.println("list=" + list);
        // addAll:添加多个元素
        ArrayList list2 = new ArrayList();
        list2.add("红楼梦");
        list2.add("三国演义");
        list.addAll(list2);
        System.out.println("list=" + list);
        // containsAll:查找多个元素是否都存在
        System.out.println(list.containsAll(list2));//T
        // removeAll:删除多个元素
        list.add("聊斋");
        list.removeAll(list2);
        System.out.println("list=" + list);//[聊斋]
    }
}

但是如果我们想取出集合中的元素该怎么办呢,我们是否能用之前学的for循环遍历集合将集合取出,答案是可以的,因为集合也是提供size()和get()方法的,但是我们还会发现Collection实现了一个叫Iterable这个接口,这里的Iterable接口说明集合可以使用迭代器来进行对元素的提取。

首先我们先了解一下迭代器的使用原理是什么,因为Collection实现了迭代器的接口所以实现Collection接口的所有类都有个迭代器方法iterator()我们先来看一下如何使用它,我们用代码实例来解释:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("jack");
        list.add("mack");
        list.add("孙悟空");
        list.add("猪八戒");
        list.add("唐僧");
        list.add("中国队长");
        Iterator iterator = list.iterator();//首先通过该方法得到一个迭代器
        //通过iterator.hasNext()该方法来判断集合是否有下一个元素,返回布尔类型
        while (iterator.hasNext()){
            //通过iterator.next();将next这个指针下移,并返回现有集合的元素
            Object abj = iterator.next();
            System.out.println(abj);
        }
        //如果我们需要二次遍历该集合直接使用while的话我们会发现根本提取不了元素
        while (iterator.hasNext()){
            Object abj = iterator.next();
            System.out.println(abj);
        }
    }
}

为什么会出现该现象,这里解释一下原理,因为你在上次while循环的时候next的指针已经到元素的末尾,所以你下次循环的时候has.next()方法判断是否有下一个元素的时候返回的就是false根本不会进行循环,那如果我们就想二次遍历集合怎么办,我们只需要重置一下迭代器即可:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("jack");
        list.add("mack");
        list.add("孙悟空");
        list.add("猪八戒");
        list.add("唐僧");
        list.add("中国队长");
        Iterator iterator = list.iterator();//首先通过该方法得到一个迭代器
        //通过iterator.hasNext()该方法来判断集合是否有下一个元素,返回布尔类型
        while (iterator.hasNext()){
            //通过iterator.next();将next这个指针下移,并返回现有集合的元素
            Object abj = iterator.next();
            System.out.println(abj);
        }
        //如果我们需要二次遍历该集合直接使用while的话我们会发现根本提取不了元素
        iterator = list.iterator();//重置迭代器来解决上述问题
        while (iterator.hasNext()){
            Object abj = iterator.next();
            System.out.println(abj);
        }
    }
}

这里我们就解决了上述问题,当然大家也是可以重新得到一个新的迭代器来进行遍历。

还有一种方法是for-each来进行遍历,这种for循环又称增强for循环,但是这里有个有意思的点,待会我们来看一下增强for循环的源码是什么我们先来演示一下:
 

import java.util.ArrayList;
import java.util.List;
public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("jack");
        list.add("mack");
        list.add("孙悟空");
        list.add("猪八戒");
        list.add("唐僧");
        list.add("中国队长");
        for (Object o :list) {
            System.out.println(o);
        }

    }
}

我们会看到增强for跟迭代器的效果是一样的

接下来我们来看一下增强for的源码到底长什么样

我们发现在Degbug增强for的时候发现进入了这个方法上,但是发现又有点眼熟,这不就是迭代器嘛,其实我们增强for的元素遍历就是调用的迭代器,换句话说增强for的本质就是迭代器,所以能有增强for方法的,一定能用迭代器遍历,这就是本次的全部内容,接下来的文章会比较繁琐,因为HashMap,HashSet,Hashtable等等这些类的内容以及源码;理解起来会比较麻烦,但是我也会尽力去写好。

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

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

相关文章

【数据结构】——排序篇(下)

前言:前面我们的排序已经详细的讲解了一系列的方法,那么我们现在久之后一个归并排序了,所以我们现在就来讲解一下归并排序。 归并排序: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法…

springboot集成knife4j详细教程

使用原生的swagger作为接口文档,功能不够强大,并且默认的ui比较简陋,不符合大众审美。所以实际开发中推荐使用knife4j对swagger进行增强。knife4j的地址:https://gitee.com/xiaoym/knife4j 基本使用 想要使用knife4j非常简单&…

MyBatis 四大核心组件之 ResultSetHandler 源码解析

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

【Linux】 通过宝塔面板重置SSH密码,无需原密码

目录 应用场景: 步骤一:登录面板 步骤二:安装linux工具箱 步骤三:点击设置 步骤总结: 应用场景: 忘记ssh密码(前提要有宝塔的账号密码)修改重置ssh密码 步骤一:登录…

LVGL | Demo实例使用说明

LVGL | Demo实例使用说明 时间:2023年12月10日21:51:17 文章目录 LVGL | Demo实例使用说明Demos for LVGLAdd the examples to your projectsDemosWidgetsMusic playerKeypad and encoderBenchmarkStress Contributing Demos for LVGL Add the examples to your p…

【工具】JS脚本|浏览器脚本6分钟极速入门 · 开发一个限制自己刷b站的脚本

这张图花里胡哨的是让AI生成的,我觉得怪可爱的,就直接作为封面了。 这篇文章中会开发一个JS脚本,这是一个用来限制b站网页版功能的脚本,避免刷b站的时间过长。功能如下: 除了搜索、视频页、私信页之外的任何页都会被重…

RabbitMQ学习笔记10 综合实战 实现新商家规定时间内上架商品检查

配置文件: 记住添加这个。 加上这段代码,可以自动创建队列和交换机以及绑定关系。 我们看到了我们创建的死信交换机和普通队列。 我们可以看到我们队列下面绑定的交换机。 我们创建一个controller包进行测试: 启动: 过一段时间会变成死信队列…

Multisim电路仿真软件使用教程

安装直接参考这篇文章:Multisim 14.0安装教程 软件管家公众号里有很多软件,需要的可以去找下然后安装,这里用的是14.0版本。 这里有个大神的详细教程,可以参考: Multisim软件使用详细入门教程(图文全解&…

mybatis数据输出-map类型输出

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;create table emp (empNo varchar(40) null,empName varchar(100) null,sal int null,deptno varchar(10) null ); 2、pom.xml <dependencies><dependency><groupId>org…

原来JMeter 分布式执行原理这么简单,为什么没有早点看到呢!

在使用 JMeter 进行性能测试时&#xff0c;如果并发数比较大&#xff08;比如项目需要支持 10000 并发&#xff09;&#xff0c;单台电脑&#xff08;CPU 和内存&#xff09;可能无法支持&#xff0c; 这时可以使用 JMeter 提供的分布式测试的功能&#xff0c;使用多台测试机一…

Python实现FA萤火虫优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

6.题目:编号2490 小蓝的括号串1

题目: ### 这道题主要考察stack #include<bits/stdc.h> using namespace std; const int N105; stack<char> stk; char s[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;cin>>s1;bool anstrue;for(int i1;i<n;i){…

【PWN】学习笔记(二)【栈溢出基础】

课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…

java--Date、SimpleDateFormat时间类,JDK8之前的

1.Date 代表的是日期和时间 2.SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式。 3.时间格式常见符号 4.SimpleDateFormat解析字符串时间成为日期对象

专业mac投屏软件AirServer v7.2.7 mac中文版

专业mac投屏软件AirServer v7.2.7 mac中文版是一款好用的投屏工具&#xff0c;它可以将您的Mac变成通用镜像接收器&#xff0c;允许您使用内置的AirPlay或基于Google Cast的屏幕投影功能镜像设备的显示器。您可以通过任何AirPlay或Google Cast兼容设备镜像或投射屏幕&#xff0…

C语言精选——选择题Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

LabVIEW开发新型电化学性能测试设备

LabVIEW开发新型电化学性能测试设备 开发了一种基于Arduino和LabVIEW的新型电化学性能测试装置&#xff0c;专门用于实验电池&#xff0c;特别是在锂硫&#xff08;Li-S&#xff09;技术领域的评估。这种装置结合了简单、灵活的硬件和软件工具&#xff0c;使新科学家能够设计针…

DiffiT

本文首发于AIWalker&#xff0c;欢迎关注。 https://arxiv.org/abs/2312.02139 https://github.com/NVlabs/DiffiT 扩散模型以其强大的表达能力和高样本质量在许多领域得到了新的应用。对于样本生成&#xff0c;这些模型依赖于通过迭代去噪生成图像的去噪神经网络。然而&#x…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核&#xff0c;比如1*1的卷积核&#xff0c;3*3的卷积核&#xff0c;本文将讲解1*1的卷积核的使用&#xff0c;它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口&#xff0c;那么1*1的卷积核就失去了卷积层可以识…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…