Collection集合 --java学习笔记

Collection

  • Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的

List系列集合:List系列集合:ArrayList、LinkedList --java学习笔记-CSDN博客

Set系列集合:Set系列集合:Hashset、LinkedHashset、TreeSet --java学习笔记-CSDN博客


Collection集合体系特点

List系列集合:添加的元素是有序、可重复、有索引

  • 有序:取出和存入时的顺序一致
  • 可重复:可以往集合中添加多个一摸一样的数据
  • 有索引:可以通过索引操作集合里面的数据

常见List系列集合—— ArrayList、LinkdList:有序、可重复、有索引

Set系列集合:添加的元素是无序、不重复、无索引(与List系列集合相反)

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:按照大小默认升序排序、不重复、无索引

Collection集合的常用方法

代码演示

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

public class CollectionTest1 {
    public static void main(String[] args) {
        Collection<String> arr = new ArrayList<>(); //多态写法
        //1.public boolean add(E e):添加元素,添加成功返回true。
        arr.add("aaa");
        arr.add("bbb");
        arr.add("ccc");
        arr.add("aaa");
        System.out.println(arr);    //[aaa, bbb, ccc, aaa]
        //2.public void clear():清空集合的元素。
        arr.clear();
        System.out.println(arr);    //[]
        // 3.public boolean isEmpty():判断集合是否为空 是空返回true,反之。
        System.out.println(arr.isEmpty());  //true
        arr.add("aaa");
        System.out.println(arr.isEmpty());  //false
        //4.public int size():获取集合的大小。
        System.out.println(arr.size()); //1
        //5.public boolean contains(object obj): 判断集合中是否包含某个元素。
        System.out.println(arr.contains("aaa"));    //true
        System.out.println(arr.contains("bbb"));    //false
        // 6.public boolean remove(E e):删除某个元素:如果有多个重复元素默认删除前面的第一个!
        arr.add("bbb");
        arr.add("ccc");
        arr.add("aaa");
        arr.remove("aaa");
        System.out.println(arr);    //[aaa, bbb, ccc, aaa]
        // 7.public 0bject[] toArray():把集合转换成数组
        Object[] arr2 = arr.toArray();
        System.out.println(Arrays.toString(arr2));   //[bbb, ccc, aaa]
        String[] arr3 = arr.toArray(new String[0]);
        System.out.println(Arrays.toString(arr3));  //[bbb, ccc, aaa]
        //把一个集合的全部数据倒入到另一个集合中去
        Collection<String> arr4 = new ArrayList<>();
        arr4.add("aaa");
        arr4.add("bbb");
        Collection<String> arr5 = new ArrayList<>();
        arr5.add("aaa");
        arr5.add("bbb");
        arr4.addAll(arr5);
        System.out.println(arr4);   //[aaa, bbb, aaa, bbb]
        System.out.println(arr5);   //[aaa, bbb]
    }
}

运行结果


Collection集合的遍历方式

  • 迭代器
  • 增强for
  • lambda表达式

迭代器

迭代器是用来遍历集合的专用方式(数组没有迭代器 ),在java中迭代器的代表是Iterator

Collection集合获取迭代器的方法:

Iterator迭代器中的常用方法:

代码演示:

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

public class CollectionTest2 {
    public static void main(String[] args) {
        Collection<String> arr = new ArrayList<>();
        arr.add("愚者");
        arr.add("正义");
        arr.add("倒吊人");
        arr.add("太阳");
        arr.add("魔术师");
        System.out.println(arr);    //[愚者, 正义, 倒吊人, 太阳, 魔术师]

        // 使用迭代器遍历集合
        // 1.从集合对象中获取迭代器对象
        Iterator<String> it = arr.iterator();
//        System.out.println(it.next());  //愚者
//        System.out.println(it.next());  //正义
//        System.out.println(it.next());  //倒吊人
//        System.out.println(it.next());  //太阳
//        System.out.println(it.next());  //魔术师
        // System.out.println(it.next());  // 出现异常  NoSuchElementException

        //2.我们应该使用循环结合迭代器遍历集合
        while(it.hasNext()){
            String name = it.next();
            System.out.println(name);   //愚者\n 正义\n 倒吊人\n 太阳\n 魔术师\n
            
        }
    }
}

运行结果:

增强for循环

  • 增强for循环可以用来遍历集合或者数组
  • 增强for循环遍历集合,本质就是迭代器遍历集合的简化写法

代码演示:

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

public class CollectionTest3 {
    public static void main(String[] args) {
        Collection<String> arr = new ArrayList<>();
        arr.add("愚者");
        arr.add("正义");
        arr.add("倒吊人");
        arr.add("太阳");
        arr.add("魔术师");
        System.out.println(arr);    //[愚者, 正义, 倒吊人, 太阳, 魔术师]

        //使用增强for遍历集合或数组
        for (String s : arr) {
            System.out.println(s);  //愚者\n 正义\n 倒吊人\n 太阳\n 魔术师\n
        }

        String[] names = {"小红","小白","小绿","小黑"};
        for (String name : names) {
            System.out.println(name);   //小红\n 小白\n 小绿\n 小黑\n
        }
    }
}

运行结果:

Lambda表达式

  • 得益于jdk 8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合

需要使用Collection的如下方法来完成:

代码演示:

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

public class CollectionTest4 {
    public static void main(String[] args) {
        Collection<String> arr = new ArrayList<>();
        arr.add("愚者");
        arr.add("正义");
        arr.add("倒吊人");
        arr.add("太阳");
        arr.add("魔术师");
        System.out.println(arr);    //[愚者, 正义, 倒吊人, 太阳, 魔术师]

        //使用Lambda表达式遍历集合
        //需要使用Collection的forEach方法来完成
//        arr.forEach(new Consumer<String>() {    //匿名内部类,可用Lambda表达式简化
//            @Override
//            public void accept(String s) {
//                System.out.println(s);  //愚者\n 正义\n 倒吊人\n 太阳\n 魔术师\n
//            }
//        });

//        arr.forEach(s -> System.out.println(s));    //Lambda表达式,还可以简化成方法引用

        arr.forEach(System.out::println);    //方法引用
        //愚者\n 正义\n 倒吊人\n 太阳\n 魔术师\n
    }
}

运行结果:


集合的并发修改异常

  • 使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误

案例:

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

public class CollectionTest5 {
    public static void main(String[] args) {
        Collection<String> arr = new ArrayList<>();
        arr.add("愚者");
        arr.add("愚人节");
        arr.add("正义");
        arr.add("太阳");
        arr.add("魔术师");
        System.out.println(arr);

        Iterator<String> it = arr.iterator();
        while(it.hasNext()){    //遍历每个元素
            String name = it.next();
            if(name.contains("愚")){     //删除带愚字的元素
                arr.remove(name);
            }
        }

        System.out.println(arr);
    }
}

这一段代码乍一看没有任何问题,但是实际运行之后:

 若是将增强for换成fori再看

运行结果

        这次虽然没有报错,但是删除的元素少了一个,愚人节并没有被删掉。仔细思考不难发现,其实是因为在删除愚者的时候其它所有元素的索引都减了一,而i++到了索引1的位置,此时索引1已经是正义,也就跳过了愚人节元素,因此出现了bug。而迭代器(增强for本质就是使用迭代器)知道这个问题,它会直接抛个异常出来,在fori解决这个问题是很简单的,在删除的同时i--,或者把i++放到下面去,或者倒着删等等都可以解决这个问题,那么在迭代器中该如何解决呢?
        很简单,在使用迭代器删除数据时不要使用集合对象自己去删除数据,那样是一定会出现并发修改异常的,而是使用迭代器本身提供的一个remove方法,这个remove方法的作用就是删除当前迭代到的数据,且再删除的同时做i--操作

运行结果:

增强for循环和lambda表达式删除数据也会出现并发修改异常,而且它们无法解决,因为增强for循环就是迭代器的简化写法,因为是简化写法所以无法拿到迭代器对象,也就不能使用迭代器的remove,而lambda式原理也是使用了增强for循环


Collection各集合应用场景

1、如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据

  • 用ArrayList集合(有序、可重复、有索引),底层基于数组的。(常用)

2、如果希望记住元素的添加顺序,且增删首尾数据的情况较多

  • 用LinkedList集合(有序、可重复、有索引),底层基于双链表实现的

3.如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快

  • 用HashSet集合(无序,不重复,无索引),底层基于哈希表实现的。(常用)

4.如果希望记住元素的添加顺序,也没有重复元素需要存储,且希望增删改查都快

  • 用LinkedHashSet集合(有序,不重复,无索引),底层基于哈希表和双链表

5.如果要对元素进行排序,也没有重复元素需要存储?且希望增删改查都快?

  • 用Treeset集合,基于红黑树实现

Collection的其它相关知识

可变参数:可变参数 --java学习笔记-CSDN博客
用来操作集合的工具类Collections:Collections --java学习笔记-CSDN博客

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

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

相关文章

ARMv9新特性:虚拟内存系统架构 (VMSA) 的增强功能

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 权限索引 2022 ARM引入了一种新的控制内存权限方法。 不再是直接在转换表条目 (TTE) 中编码权限&#xff0c;而是使用 TTE 中的字段来索引寄存器中指定的权限数组。这种间接提供…

.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案

目录(结尾附加项目代码资源地址) 引言&#xff1a; 1. SAGA事务模式 2. 拆分为子事务 3. 失败回滚 4. 如何做补偿 4.1 失败的分支是否需要补偿 5. 异常 6. 异常与子事务屏障 6.1 NPC的挑战 6.2 现有方案的问题 6.3 子事务屏障 6.4 原理 7. 更多高级场景 7.1 部分…

蓝桥杯单片机---第十一届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.电压 & LED显示5.定时器中断6.消除85C显示 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数中 总结 比赛…

【Redis】redis主从复制

概述 常见的Redis高可用的方案包括持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题&#xff08;从内存到硬盘的备份&#xff09;&#xff1b;而主从复制则侧重解决数据的多机热备。此外&#xff0c;主从复制…

鸿蒙TypeScript入门学习第4天:【TS变量声明】

1、TypeScript 变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。 TypeScript 变量的命名规则&#xff1a; 变量名称可以包含数字和字母。除了下划线 _ 和美元 $ 符号外&#xff0c;不能包含其他特殊字符&…

使用ai智能写作场景之gpt整理资料,如何ai智能写作整理资料

Ai智能写作助手&#xff1a;Ai智能整理资料小助手 Ai智能整理资料小助手可试用3天&#xff01; 通俗的解释一下怎么用ChatGPT来进行资料整理&#xff1a; 搜寻并获取指定数量的特定领域文章&#xff1a; 想像你在和我说话一样&#xff0c;告诉我你想要多少篇关于某个话题的文…

高效实用的Java输出流:BufferWriter类详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,…

ardupilot开发 --- Remote ID 篇

朝花夕拾 什么是 Remote ID &#xff1f;一些概念OpenDroneIDArduRemoteIDopendroneid-core-c 库 什么是 Remote ID &#xff1f; https://drone-remote-id.com/ 一些概念 符合美国航空管理局FAA规定的一些 Remote ID 设备有哪些&#xff1f; https://uasdoc.faa.gov/listDoc…

【APP_TYC】数据采集案例天眼APP查_查壳脱壳反编译_③

是不是生活太艰难 还是活色生香 我们都遍体鳞伤 也慢慢坏了心肠 你得到你想要的吗 换来的是铁石心肠 可曾还有什么人 再让你幻想 &#x1f3b5; 朴树《清白之年》 查壳 工具介绍Frida-dexDump Frida-dexDump简介 Frida-dexDump是基于Frida的一个工具&…

Java中读取html文件转成String,展示在浏览器

这里写目录标题 第一章1.1&#xff09;pom中引入依赖和html文件示例1.2&#xff09;使用hutool工具包读取html文件转为string1.3&#xff09;页面显示 第一章 1.1&#xff09;pom中引入依赖和html文件示例 引入hutool工具包依赖 <dependency><groupId>cn.hutool&…

vue前端工程化

前言 本文介绍的是有关于vue方面的前端工程化实践&#xff0c;主要通过实践操作让开发人员更好的理解整个前端工程化的流程。 本文通过开发准备阶段、开发阶段和开发完成三个阶段开介绍vue前端工程化的整体过程。 准备阶段 准备阶段我将其分为&#xff1a;框架选择、规范制…

html安装及入门

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、简单介绍一下前端三大件开发工具 二、安装VSCode三、VSCode相关配置1.汉化2.live server3.使用前 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下…

治愈自己的短句,心灵鸡汤!

一、不是所有的是非都能理清&#xff0c;不是所有的付出都有收获。有些选择是无可奈何&#xff0c;有些失去是注定的。与其无法言说&#xff0c;不如一笑而过&#xff1b;与其无法释怀&#xff0c;不如安然自若。 二、没人会真正的感同身受到你的痛楚&#xff0c;也没人会真正…

如何通过使用yolov8实现火灾烟雾检测

在该项目中&#xff0c;对原始YOLO模型进行训练集数据收集、模型结构调整、超参数优化等步骤&#xff0c;使其能够准确高效地从视频或图像中识别出火源或其他火灾相关特征&#xff0c;以实现实时火警监测、预警等功能。 介绍 该代码库包含使用YOLOv8在实时视频中跟踪和检测火灾…

网络七层模型之表示层:理解网络通信的架构(六)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…

春季热卖单品!空气净化器单周销售额近三十万!

季节轮换&#xff0c;你有没有感受到室内空气质量变差呢&#xff1f; 近日&#xff0c;一款空气净化器在美区TikTok小店上掀起了一股购买热潮&#xff0c;成为了当之无愧的爆款商品&#xff01; 它的单周销量竟然高达7.5k&#xff0c;销售额更是超过了惊人的30万&#xff01;…

Webpack常见插件和模式

目录 目录 目录认识 PluginCleanWebpackPluginHtmlWebpackPlugin自定义模版 DefinePlugin的介绍 ( 持续更新 )Mode 配置 认识 Plugin Loader是用于特定的模块类型进行转换&#xff1b; Plugin可以用于执行更加广泛的任务&#xff0c;比如打包优化、资源管理、环境变量注入等 …

2023年财报大揭秘:下一个倒闭的新势力呼之欲出

3月25日&#xff0c;零跑汽车公布了他们2023年的财报。财报数据显示&#xff0c;零跑亏损了42亿元。恰逢近段时间众多新势力车企皆公布了年报&#xff0c;而亏损也成了大家避不开的话题。那今天就让我们一起盘点一下各个车企的财报吧&#xff01; 2023年财报大揭秘&#xff1a;…

12.路由安装

路由安装 安装vscode https://code.visualstudio.com/ 使用vscode打开后台系统项目 在终端运行npm run dev即可运行项目 src/assets中存放静态资源 src/components中存放组件 app.vue是主界面&#xff08;入口页面&#xff09; 注释main.ts中的import ./style.css package.j…