java集合进阶篇-《Collection集合》

 

个人主页→VON

收录专栏→java从入门到起飞

目录

一、前言

二、Collection集合简要概述

Collection的主要实现

Collection的方法

迭代器(Iterator)

三、单列集合顶层接口Collection

CollectionDemo01

CollectionDemo02

CollectionDemo03

CollectionDemo04

CollectionDemo05


一、前言

java中的集合也是一个重点,同样也是难点,涉及到的东西较多较杂,希望大家能够和我一起来学习java集合进阶方面的知识。预计一周的时间将java集合进阶部分拿下,加油。

二、Collection集合简要概述

在Java中,java.util.Collection 是一个接口,它是所有Java集合框架的根。它定义了集合类必须实现的基本操作,如添加元素、删除元素、迭代等。所有的集合类(如 List, Set, Queue 等)都是 Collection 接口的直接或间接实现。

Collection的主要实现

  1. List:这是一个有序的集合,可以包含重复的元素,并且可以通过索引访问元素。主要的实现包括:

    • ArrayList:实现了基于动态数组的数据结构。
    • LinkedList:实现了基于双向链表的数据结构。
    • Vector:与 ArrayList 类似,但是线程安全的。
  2. Set:这是一个不允许有重复元素的集合。主要的实现包括:

    • HashSet:提供了一个平均性能较高的实现,不保证元素的顺序。
    • TreeSet:提供了排序功能,元素按自然顺序或由 Comparator 指定的顺序进行排序。
    • LinkedHashSet:结合了 HashSet 和 LinkedHashMap 的特性,维护了插入顺序。
  3. Queue:用于按照特定顺序保持元素的集合,主要用于FIFO(先进先出)情况。主要的实现包括:

    • LinkedList:实现 Queue 接口,并提供队列操作。
    • PriorityQueue:按照优先级顺序对元素进行排序。

Collection的方法

Collection 接口定义了一些常用的方法,比如:

  • boolean add(E e):向集合中添加一个元素。
  • boolean remove(Object o):从集合中移除指定的元素。
  • void clear():移除集合中的所有元素。
  • boolean contains(Object o):如果此集合包含指定元素,则返回 true
  • Iterator<E> iterator():返回集合的迭代器。
  • int size():返回集合中的元素数量。
  • boolean isEmpty():如果集合不包含任何元素,则返回 true

迭代器(Iterator)

Iterator 接口是 Collection 中的一个内部接口,用于遍历集合中的元素。它提供了 hasNext() 方法来检查集合中是否还有更多的元素,以及 next() 方法来获取集合中的下一个元素。

三、单列集合顶层接口Collection

CollectionDemo01

关于Collection的一些常见函数的使用 

package ArrayDemo.CollectionDemo;

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

public class A01_CollectionDemo01 {
    public static void main(String[] args) {
        // 注:
        // Collection是一个接口,不能够直接创建他的对象
        // 只能创建他实现类的对象
        Collection<String> coll = new ArrayList<>();

        // 集合中常见方法
        // 1.添加元素
        // List系列的允许元素重复
        // Set系列的不允许元素重复
        coll.add("a");
        coll.add("b");
        coll.add("c");
        System.out.println(coll);// [a, b, c]

        // 2.清空
        /*coll.clear();
        System.out.println(coll);*/ // []

        // 3.删除
        // 注:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除
        System.out.println(coll.remove("a"));// true

        // 如果删除成功返回true,删除失败返回False
        System.out.println(coll.remove("d"));// false
        System.out.println(coll);// [b, c]

        // 4.判断元素是否包含
        // 底层是依赖equals方法进行判断是否存在的
        // 所以,如果集合中储存的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean中,一定要重写equals方法
        System.out.println(coll.contains("a"));// false
        System.out.println(coll.contains("b"));// true
        System.out.println(coll.contains("c"));// true

        // 5.判断集合是否为空
        boolean result = coll.isEmpty();
        System.out.println(result);// false

        // 6.获取集合的长度
        int size = coll.size();
        System.out.println(size);// 2

    }
}

CollectionDemo02

思考一下为什么结果为false?

package ArrayDemo.CollectionDemo;

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

public class A02_CollectionDemo02 {
    public static void main(String[] args) {
        // 1.创建集合对象
        Collection<Student> coll = new ArrayList<>();
        // 2.创建三个 学生对象
        Student s1 = new Student("zhang",18);
        Student s2 = new Student("li",19);
        Student s3 = new Student("wang",20);
        // 3.将学生对象添加到集合中
        coll.add(s1);
        coll.add(s2);
        coll.add(s3);
        // 4.判断集合中某一个学生对象是否包含
        Student s4 = new Student("zhang",18);
        System.out.println(coll.contains(s4));// false
    }
}

 不知道你们有没有疑问,明明集合中有该对象,但是判断的时候结果却是false。

原因如下:

因为contains方法底层依赖equals方法判断对象是否一致的

如果存的是自定义对象,没有重写equals方法,那么默认使用Object类中的equals方法进行判断,而Object类中equals方法,依赖地址值进行判断。

解决方法:

在类中的javabean中重写equals方法
重写之后结果为true

CollectionDemo03

利用迭代器遍历集合中的数据

package ArrayDemo.CollectionDemo;

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

public class A03_CollectionDemo03 {
    public static void main(String[] args) {
        /*
        Collection系列集合三种通用的遍历方式
        1.迭代器遍历
        2.增强for遍历
        3.lambda表达式遍历

        迭代器相关的三个方法
        1.Iterator<E>iterator():获取一个迭代器对象
        2.boolean hasNext()    :判断当前指向的位置是否有元素
        3.E next()             :获取当前指向的元素并移动指针
         */

        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.获取迭代器对象
        Iterator<String> it = coll.iterator();

        // 3.利用循环去获取元素
        while(it.hasNext()){
            // 4.获取元素并移动指针
            System.out.println(it.next());
        }

    }
}

使用迭代器遍历集合的时候要注意以下几点: 

// 注:
// 1.报错NoSuchElementException
// 2.迭代器遍历完毕,指针不会复位
// 3.循环中只能用一次next方法
// 4.迭代器遍历时,不能用集合的方法进行增加或者删除
// 如果想要删除元素,可以用迭代器提供的remove方法进行删除
// 如果要添加,暂时没有方法

// 报错NoSuchElementException
// System.out.println(it.next());// NoSuchElementException

// 迭代器遍历完毕,指针不会复位
// System.out.println(it.hasNext());// false

CollectionDemo04

增强for循环遍历

package ArrayDemo.CollectionDemo;

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

public class A04_CollectionDemo04 {
    public static void main(String[] args) {
        // 增强for遍历
        // for(数据类型 变量名:集合/数组){
        //
        // }

        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.利用增强for进行遍历
        // s就是一个第三方变量,在循环过程中依次表示集合中的每一个数据
        for (String s : coll) {
            s="s";
        }
        System.out.println(coll);// [a, b, c, d]
        // 注:
        // 修改增强for中的变量,不会改变集合原本的数据

    }
}

自我感觉最好用的一种遍历方式并且有快捷键。

快捷键:集合.for

CollectionDemo05

package ArrayDemo.CollectionDemo;

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

public class A05_CollectionDemo05 {
    public static void main(String[] args) {
        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.利用匿名内部类的形式
        // 底层原理:
        // 将每一个元素都传递给下面的accept方法
        coll.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        // lambda表达式
        coll.forEach (s->System.out.println(s));
    }
}

这个我也不是太理解,希望各位大佬给予指导。 

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

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

相关文章

java maven

参考链接 maven相关配置 maven依赖管理 依赖具有传递性。 maven依赖范围 maven的生命周期 分为三个相互独立的生命周期&#xff1a; 在执行对应生命周期的操作时&#xff0c;需要进行前面的操作。比如&#xff0c;执行打包install的时候&#xff0c;会执行test。

算法时间、空间复杂度(二)

目录 大O渐进表示法 一、时间复杂度量级的判断 定义&#xff1a; 例一&#xff1a;执行2*N&#xff0b;1次 例二&#xff1a;执行MN次 例三&#xff1a;执行已知次数 例四:存在最好情况和最坏情况 顺序查找 冒泡排序 二分查找 例五&#xff1a;阶乘递归 ​编辑 例…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP&#xff0b;MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密&#xff0c;其他开源可二开 演示源码下载 开…

【实战项目】——Boost搜索引擎(五万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、项目的相关背景 1.1、什么是Boost库&#xff1f; 1.2、什么是搜索引擎&#xff1f; 1.3、为什么要做Boost库搜索引擎&#xff1f; 二、搜索引擎的宏观原…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

负载均衡和反向代理区别和nginx负载均衡模块

目录 负载均衡和反向代理区别 相似之处&#xff1a; 区别&#xff1a; 负载均衡和反向代理使用什么服务 nginx的负载均衡模块 ​编辑 负载均衡和反向代理区别 相似之处&#xff1a; 请求分发&#xff1a;两者都可以将客户端的请求分发到多个后端服务器&#xff0c;以提…

【AI绘画】Midjourney进阶:留白构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;留白构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&…

Java后端面试题:JVM篇

目录 1. 什么是JVM&#xff1f; 2. 请你介绍JVM的整体结构 3. 了解过字节码文件的组成吗&#xff1f; 4. 说一下运行时数据区&#xff08;介绍一下JVM内存模型&#xff09;。 5. 哪些区域会出现内存溢出&#xff0c;会有什么现象&#xff1f; 6. 请你说说类的生命周期。 …

AD9361 的 TX 输出中添加前置放大器,并在 RX 输入中添加 LNA。

AD9361 的 TX 输出中添加前置放大器&#xff0c;并在 RX 输入中添加 LNA。 https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/AD-TRXBOOST1-EBZ.html https://wiki.analog.com/resources/eval/user-guides/ad-trxboost1-ebz/in…

QT--文本框 QLineEdit、qtextedit

在Qt中&#xff0c;文本框&#xff08;QLineEdit 或 QTextEdit&#xff09;和标签&#xff08;QLabel&#xff09;是两种不同的部件&#xff08;widget&#xff09;&#xff0c;它们的主要区别在于用途和功能&#xff1a; QLabel&#xff08;标签&#xff09; 用途&#xff1…

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

算法.图论-BFS及其拓展

文章目录 广度优先搜索简介经典bfs习题地图分析贴纸拼词 01bfs解析基本过程相关习题 广度优先搜索简介 bfs的特点是逐层扩散, 从源头到目标点扩散了几层, 最短路就是多少 bfs的使用特征是任意两个节点的距离(权值)是相同的(无向图, 矩阵天然满足这一特点) bfs开始的时候可以是…

树莓派应用--AI项目实战篇来啦-10.OpenCV进行车牌检测

1. 介绍 本项目使用 esseract、OpenCV和Python探索光学字符识别&#xff08;OCR&#xff09;的神奇世界&#xff0c;本项目将 带你了解最受欢迎的OCR引擎 Tesseract 背后的技术&#xff0c;以及如何用 Pytesseract 和 OpenCV实现字符识别。 从图像中检测字符的技术称为…

图(Java语言实现)

一、图的概念 顶点&#xff08;Vertex&#xff09;&#xff1a;图中的数据元素&#xff0c;我们称之为顶点&#xff0c;图至少有一个顶点&#xff08;非空有穷集合&#xff09;。 边&#xff08;Edge&#xff09;&#xff1a;顶点之间的关系用边表示。 1.图&#xff08;Graph…

Python Django 数据库优化与性能调优

Python Django 数据库优化与性能调优 Django 是一个非常流行的 Python Web 框架&#xff0c;它的 ORM&#xff08;对象关系映射&#xff09;允许开发者以简单且直观的方式操作数据库。然而&#xff0c;随着数据量的增长&#xff0c;数据库操作的效率可能会成为瓶颈&#xff0c…

如何在Ubuntu上更改MySQL数据存储路径

文章目录 0 背景1 备份现有数据库数据2 停止 MySQL 服务3 复制现有的 MySQL 数据到新目录4 修改 MySQL 配置文件5 更新 AppArmor 或 SELinux 配置&#xff08;如有启用&#xff09;6. 修改 MySQL 系统文件中的 datadir7. 启动 MySQL 服务8. 验证更改参考资料 0 背景 在原先划分…

股市入门常见术语介绍

鉴于最近行情讨论火热&#xff0c;我也想借此平台&#xff0c;结合我大学时期身边同学老师的投资经历&#xff0c;写一篇交易入门术语简介。内容不多但是足以达到科普之用。 ​ 希望大家能谨慎对待投资&#xff0c;始终保持谦虚学习的态度。不要迷失在瞬息万变的金融市场&…

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…

满级抗摔续航王者,荣耀X60系列发布,起步价仅1199元

10月16日&#xff0c;荣耀X60系列暨荣耀平板新品发布会正式举办&#xff0c;荣耀X60 Pro、荣耀X60以及荣耀平板GT Pro、荣耀亲选耳机LCHSE X7e、荣耀亲选WhizKid儿童手表2 Pro等新品悉数亮相。其中&#xff0c;荣耀X60 Pro首次搭载6600mAh最大青海湖电池、绿洲护眼屏、双向北斗…

pta-7-6 学生类设计

题目要求&#xff1a; 设计一个类Student&#xff0c;并在Main类中生成Student类对象进行测试 1.对于Student类&#xff0c;设计私有属性name和age&#xff0c;并为每一个成员变量name和age设计其setXXX&#xff08;&#xff09;和getXXX&#xff08;&#xff09;方法,并对于s…