Collection集合 --java学习笔记

news2024/11/24 0:18:46

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的其它相关知识

可变参数:
用来操作集合的工具类Collections:

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

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

相关文章

08_会话技术

文章目录 前置知识点会话技术Conversation客户端技术CookieCookie的格式Cookie的优缺点构造Cookie信息通过浏览器构造Cookie通过Postman构造Cookie通过服务器构造Cookie 获取Cookie信息Cookie中的信息PathDomainMaxAge 案例&#xff08;cookie相关&#xff09; 服务器技术Sessi…

MD5 计算 (加密辅助类, Win32, C++)

CCryptHelper.h #pragma once #include <string> #include <tchar.h> #include <windows.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 加密辅助类 // 客户端: Windows XP 及以上系统可用 // 服务器: Win…

VESTA模拟计算XRD标准卡片

先上Crystallography Open Database网站下载标准CIF卡片&#xff08;以PbI2为例&#xff09; 1.直接进网站搜元素就行 2.点CIF直接下载 3.打开VESTA&#xff0c;导入刚刚下载的CIF 4.导入成功就是这样的 5.按照我这个操作来计算 6.点Calculation 7.已经计算出来了&#xff…

政安晨:专栏目录【TensorFlow与Keras实战演绎机器学习】

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本篇是作者政安晨的专栏《TensorFlow与Keras…

cf937Div4E题F题

题目要找到一个长为k的子串,使得x个相同的k相连长度和s相同且对应字符中只能有一个地方对应的字符不同, 那是不是说明s也能分成x段,且最多有一段中的一个字符不同,否则就不满足要求,那我们现在要讨论这个不同的字符在哪,如果在第一段比如sabaa aaaa aaaa aaaa,如果我们取了abaa…

怎么评价小米汽车SU7?

编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 小米汽车SU7&#xff1a;电动智能驾驶的新篇章 随着全球汽车产业的深度变革&#xff0c;新能源汽车、智能驾驶等概念逐渐深入人心。在这场汽车产业的革新中&#xff0c;小米汽车SU7无疑是一个引人注目的焦点。这…

利用 Scapy 库编写 ARP 缓存中毒攻击脚本

一、ARP 协议基础 参考下篇文章学习 二、ARP 缓存中毒原理 ARP&#xff08;Address Resolution Protocol&#xff09;缓存中毒是一种网络攻击&#xff0c;它利用了ARP协议中的漏洞&#xff0c;通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC…

002-基于Pytorch的手写汉字数字分类

本节将介绍一种 2.1 准备 2.1.1 数据集 &#xff08;1&#xff09;MNIST 只要学习过深度学习相关理论的人&#xff0c;都一定听说过名字叫做LeNet-5模型&#xff0c;它是深度学习三巨头只有Yann Lecun在1998年提出的一个CNN模型&#xff08;很多人认为这是第一个具有实际应用…

npm install 报错ERESOLVE unable to resolve dependency tree

描述&#xff1a;npm install 报错ERESOLVE unable to resolve dependency tree 解决方案&#xff1a; npm install --legacy-peer-deps

【Linux】网络编程套接字二

网络编程套接字二 1.TCP网络编程1.1TCP Server服务端1.2 TCP Client客户端 2.Server 多进程版本2.1普通版2.2 信号版 3.Server 多线程版4.Server 线程池版5.日志函数重新设计6.守护进程7.TCP协议通讯流程8.TCP和UDP 对比 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&…

[Java基础揉碎]抽象类

目录 通过问题引出 介绍 关键点 细节 ​编辑 抽象类的最佳设计模式--模版设计模式 1.先用最容易想到的方法 2.分析问题&#xff0c;提出使用模板设计模式 通过问题引出 假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道…

绘制特征曲线-ROC(Machine Learning 研习十七)

接收者操作特征曲线&#xff08;ROC&#xff09;是二元分类器的另一个常用工具。它与精确度/召回率曲线非常相似&#xff0c;但 ROC 曲线不是绘制精确度与召回率的关系曲线&#xff0c;而是绘制真阳性率&#xff08;召回率的另一个名称&#xff09;与假阳性率&#xff08;FPR&a…

【爬虫框架pyspider】01-pyspider入门与基本使用

前言 前面我们把爬虫的流程实现一遍&#xff0c;将不同的功能定义成不同的方法&#xff0c;甚至抽象出模块的概念。如微信公众号爬虫&#xff0c;我们已经有了爬虫框架的雏形&#xff0c;如调度器、队列、请求对象等&#xff0c;但是它的架构和模块还是太简单&#xff0c;远远…

|行业洞察·碳纤维|《中国碳纤维行业现状与发展趋势-39页》

报告内容的详细解读&#xff1a; 1. 战略性新材料的重要性 碳纤维是一种轻质高强的高性能纤维材料&#xff0c;在航空航天、国防军工、高端装备制造等领域具有不可替代的作用。碳纤维的应用有助于减少能源消耗和降低碳排放&#xff0c;符合全球可持续发展的要求。 |趋势洞察…

Java增强for循环和foreach循环的误区

网上很多文章都在说增强for循环和foreach循环遍历时不能修改值&#xff0c;只能查看&#xff0c;其实是有区分条件的&#xff0c;不能修改值的是包装类&#xff0c;例如List<String>,引用类型是可以修改值的&#xff0c;例如对象集合。 使用增强for循环或者foreach循环遍…

李宏毅【生成式AI导论 2024】第6讲 大型语言模型修炼_第一阶段_ 自我学习累积实力

背景知识:机器怎么学会做文字接龙 详见:https://blog.csdn.net/qq_26557761/article/details/136986922?spm=1001.2014.3001.5501 在语言模型的修炼中,我们需要训练资料来找出数十亿个未知参数,这个过程叫做训练或学习。找到参数后,我们可以使用函数来进行文字接龙,拿…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可

一台日本原生ip站群服务器多少钱?

一台日本原生ip站群服务器多少钱&#xff1f;日本原生ip站群服务器的价格受到多个因素的影响。以下是一些主要的因素&#xff1a; 服务器配置&#xff1a;硬件配置越高&#xff0c;自然价格也越高。对于站群服务器来说&#xff0c;由于需要同时运行多个网站&#xff0c;因此配置…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间&#xff0c;从而提高程序的性能。项目中可以把Time…