Java --- 集合(1)--- 带你了解Collection接口以及三种遍历方式

引言:本期博客摘选黑马程序员与Java从入门到精通,如果有不准确的地方还请指出,另外也感谢各位大佬点击进来观看。


目录

一.什么是集合?

二.单列集合的体系结构:

三.Collection接口的使用:

四.Collection的三种遍历方式:

 1.迭代器遍历:

2.增强for遍历:

3.Lambda表达式遍历:


一.什么是集合?

在Java中,java.util包中提供了一些集合类,而这些集合类也会被称为容器。这里提到容器,我们也会想到数组,那么数组与集合的区别是什么呢?数组的长度是固定的,而集合的长度是可变的,另外数组是被用来存储基本数据类型,而集合是可以被用来存储引用数据类型,如果想存储基本数据类型,则需给对应的基本数据类型以包装类的形式定义。

我们常用的集合分为两类:单列集合(Collection)与双列集合(Map)。本期内容将给大家介绍单列集合的相关内容。

二.单列集合的体系结构:

请看下面图片:(图片摘要黑马程序员)

上面红色框代表接口,而蓝色框则代表实现类。

三.Collection接口的使用:

 Collection接口是单列集合的祖宗接口,因为是接口嘛,所以全部单列集合都可以通过继承来使用接口内部的方法。

 下图代码给大家带来上面方法的使用,由于Collection是接口,以至于不可以被直接使用,这里就先创建他的实现类对象。

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

public class Test1 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        //添加
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");
        //打印
        System.out.println(coll);//[zhangsan, lisi, wangwu]
        //删除
        System.out.println(coll.remove("lisi"));//true
        System.out.println(coll);//[zhangsan, wangwu]
        //判断是否包含
        System.out.println(coll.contains("zhangsan"));//true
        System.out.println(coll.contains("lisi"));//false
        //判空
        System.out.println(coll.isEmpty());//false
        //元素个数
        System.out.println(coll.size());//2
    }
}

四.Collection的三种遍历方式:

 1.迭代器遍历:

迭代器,Iterator,也是一个接口,主要用于遍历集合中的元素。

 下面代码为遍历模板:

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

public class Test1 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        //添加
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");
        Iterator<String> it = coll.iterator();
        while(it.hasNext()){
            String str = it.next();
            System.out.println(str);
        }
    }
}

那么如何理解迭代器的两种方法呢?

1.hasNext()方法是判断当前位置有没有元素,起到判断的作用。

2.next()方法会做两件事,首先获取当前元素并返回,然后将迭代器向下移动

所以利用这两种方法就可以使用迭代器获取集合内部对象。

注意!!!

  1. 迭代器使用完成不会再重新复位进行使用。
  2. 每次while循环只能使用一次next()方法,因为如果使用两次,在最后会发生迭代器越界,导致报错。
  3. 迭代器遍历不可以使用集合的方法增加或者删除,我们可以利用迭代器内部方法it.remove(),移除的是当前迭代器指向的数据。

2.增强for遍历:

为了简化迭代器树下,在JDK5后出现了该方法,其内部原理就是个迭代器,所有的单列集合以及数组才可以利用该方法进行遍历

public class Test1 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        //添加
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");
        for(String s : coll){
            System.out.println(s);
        }
    }
}

我们在这里可以把 s 当成第三方变量,在循环过程依次表示集合中的每一个数据

注意,利用s是不会修改集合中原本的数据的!!!

3.Lambda表达式遍历:

在JDK8开始,Java给我们提供了更简单且直接的遍历集合的方式。

方法名称说明
default void forEach(Consumer<? super T> action):结合lambda遍历集合

 首先,我们先写一个匿名内部类的形式:

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

public class Test1 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        //添加
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");
        coll.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
}

其底层原理也是遍历集合得到每一个元素,并将其传递给accept方法,s同样也表示集合中的每一个元素。

下面看lambda表达式的正确书写格式:

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

public class Test1 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        //添加
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");
        coll.forEach (s->System.out.println(s));//lambda
    }
}

肯定有人会不理解这里是如何改变的???

实际上lambda表达式的语法非常特殊,其语法格式:   

()->结果表达式

参数->结果表达式

(参数1,参数2,...)->结果表达式

(类型1 参数1,类型2 参数2,...)->结果表达式

理解: 

我们可以对比上面的两组代码,当其内部仅一个参数,则()与数据类型可以省略,如果有两个数据类型相同的参数,那么可以省略数据类型 ,如果数据类型不相同,就不可以省略。如果下面的结果表达式内容仅一行代码则可以省略 ; 与 { } ,如果多行代码则不可以省略。

这里先介绍这么多,后序文章会给大家写一篇详细说明Lambda表达式。


好了今天的内容就到这里了,关注博主,下期给大家继续介绍集合的相关知识,加油!!!

记得三连支持哈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS事件组

什么是事件标志组? 事件标志位 :表明某个事件是否发生,联想:全局变量 flag 。通常按位表示,每一个位表示一个事件(高8 位不算) 事件标志组 是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 事件标志组本质是一个 16 位或 32 位无符号的数据类型…

交通数据三维可视化呈现与可视化分析系统开发(附程序源码)

目录 01 系统介绍 02 功能介绍 文件管理功能 模型研究 可视化分析功能 今天分享一套“交通数据三维可视化呈现与可视化分析系统”&#xff0c;并开放程序源代码下载&#xff0c;内容涉及开源空间数据库的使用、三维引擎的二次开发、矢量和栅格数据管理、交通流量分析模型框…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…

【深度学习实战(35)】数据处理之数据增强(不修改标签)

一、简介 不需要修改标签的数据增强有变明&#xff0c;变暗&#xff0c;hsv增强&#xff0c;color增强&#xff0c;cutout&#xff0c;模拟太阳光&#xff0c;雨水&#xff0c;雾等。 二、 代码 import random import numpy as np import os.path import cv2 from PIL impor…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

一、Prometheus介绍及部署

目录 一、什么是Prometheus&#xff1f; 二、特点 三、prometheus 的生态组件&#xff1a; 四、Prometheus架构图 五、prometheus 的工作模式 六、Prometheus 的工作流程 七、部署Prometheus 1、prometheus配置文件介绍 2、配置文件详解 3、配置systemd服务 用systemct…

原子学习笔记4——GPIO 应用编程

一、应用层如何操控 GPIO 与 LED 设备一样&#xff0c;GPIO 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下&#xff0c;如下所示&#xff1a; gpiochipX&#xff1a;当前 SoC 所包含的 GPIO 控制器&#xff0c;我们知道 I.MX6UL/I.MX6ULL 一共包…

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。 气象温度的预测一直以来都是…

Java基础(三):Java异常机制以及底层实现原理

&#x1f337;一、异常 ☘️1.1 什么是异常 Java异常是程序发生错误的一种处理机制&#xff0c;异常的顶级类是Throwable&#xff0c;Throwable字面意思就是可抛出的&#xff0c;该类是所有的错误和异常的超类&#xff0c;只有Throwable类或者Throwable子类的实例对象才可以被…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支…

开启异步线程的方法

1&#xff0c;开启异步线程&#xff0c;在启动类上加注解&#xff1a; 2&#xff0c;自定义线程池&#xff1a; Configuration public class PromotionConfig {Beanpublic Executor generateExchangeCodeExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExec…

ROS2 安装与测试

文章目录 ROS2 安装与测试ROS2 安装1. 设置编码2. 添加源3. 安装 ROS24. 设置环境变量 ROS2 示例测试实例一&#xff1a;命令行实例实例二&#xff1a;小海龟仿真实例 参考链接 ROS2 安装与测试 ROS2 安装 基于 Ubuntu 22.04 LTS 操作系统。 1. 设置编码 sudo apt update &…

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

Spring-Bean 作用域

作用域 作用域案例 public class BeanScopeDemo {AutowiredQualifier("singletonPerson")Person person;AutowiredQualifier("prototypePerson")Person person1;AutowiredQualifier("prototypePerson")Person person2;AutowiredSet<Person&g…

perf 中的 cpu-cycles event 介绍

perf 中的 cpu-cycles event 介绍 cycles简介 cycles事件记录处理器核心执行的时钟周期数。每个时钟周期代表处理器内部时钟振荡器的一个周期。这个事件通常用于衡量处理器的执行速度&#xff0c;因为它直接反映了指令执行所需的时间。一个较高的cycles计数可能意味着代码执行…

【数据结构】顺序表与链表的差异

顺序表和链表都是线性表&#xff0c;它们有着相似的部分&#xff0c;但是同时也有着很大的差异。 存储空间上的差异&#xff1a; 对于插入上的不同点&#xff0c;顺序表在空间不够时需要扩容&#xff0c;而如果在使用realloc函数去扩容&#xff0c;会有原地扩容和异地扩容两种情…

Blender细节补充

1.饼状菜单&#xff0c;用于快速切换/选择 例如&#xff1a; ~&#xff1a;切换视图 Z&#xff1a;切换着色方式 &#xff0c;&#xff1a;切换坐标系 .&#xff1a;切换基准点 Shift S&#xff1a;吸附 有两种使用方式&#xff1a; -点选 -滑选&#xff0c;按快捷键…

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…