Java集合进阶(上)

news2025/1/21 1:02:39

集合

集合在Java开发中应用极为广泛,它其实就是一些常用的数据结构的包装类,分为单列集合(Collecton接口类,例如LinkdeList集合)和双列集合(Map接口类,例如HashMap集合)两种

Collection

Collecion集合体系结构与方法

体系结构

⭐List接口类集合:有序(取出),可重复(集合值),有索引,就是可变数组和链表一类

⭐Set接口类集合:无序,不可重复,无索引,类似于高中数学中的集合

API 

Collection通用遍历方法

❀迭代器遍历
什么是迭代器?

迭代器就是一个指向起始地址的指针,循环移动该指针获取其值可以遍历集合

如何遍历集合?

先要了解迭代器的三个方法

遍历代码
public class iterator {
    public static void main(String[] args) {
        //构造集合并加入元素
        Collection<String> list=new ArrayList<>();
        list.add("123");
        list.add("456");
        list.add("789");
        list.add("0");

        //迭代器遍历
        Iterator<String> iterator=list.iterator();      //获取迭代器对象
        while(iterator.hasNext()){            //循环条件,即迭代器指向存在元素
            String element=iterator.next();         //获取迭代器指向的元素,并指针后移一位
            //iterator.remove();                 //要删除可用
            System.out.println(element);
        }
        
    }
}
迭代器注意点

总结 

增强for遍历

话不多说直接代码理解

for (String element : list) {
    System.out.println(element);
}
Lambda表达式遍历 (忘记lambda表达式可见Lambda表达式的应用)
list.forEach( element -> System.out.println(element));
Collection集合总结

List集合

List集合是是Collection的第一个子类

API

 List遍历

列表迭代器

列表迭代器是List在Collection继承下独有的方法,不同于普通迭代器,列表迭代器可以增加元素,还可以前移迭代器 

代码示例
List<String> list1=new ArrayList<>();
ListIterator<String> stringListIterator = list1.listIterator();    //获取列表迭代器
while(stringListIterator.hasNext()){
    stringListIterator.remove();         //删除元素
    stringListIterator.add("123");           //添加元素
    System.out.println(stringListIterator.next());     
}

ArrayList

作为List的实现类,ArrayList其实就是可变数组,在数组的基础上增加了扩容机制

代码实现可见 动态数组的实现

LinkedList 

LinkedListList的另一个实现类,其本质是双向链表,在Java中应用极其多

代码实现可见双向链表的实现(Java)-CSDN博客

泛型

为了统一集合中元素的数据类型,泛型出现了!!!

简单来说就是用字母 T 来定义一个不确定数据类型的模板T代表的是 任意类型

不过Java中的泛型为伪泛型只在编译时检查元素是否符合集合泛型类型,集合里面元素一律按Object储存,取出元素时会自动强转为泛型指定类型

用<    >的就是泛型,List集合就是泛型接口

代码示例 
List<String> list1=new ArrayList<>();

泛型类,方法与接口

同C++中泛型一样,    看得懂就行(除非你要当造轮子的大佬)❀ ,不写代码示例偷懒咯

Set集合

Set集合Collection接口的第二个子类,类似为高中数学中的集合无序,不可重复,无索引

遍历方法及API

Collection,偷懒❀

HashSet

本质为数组+链表+红黑树(也是哈希表的组成)

无序(入取),不重复,无索引

底层原理

HashSet集合的底层数据结构是什么

⭐JDK8之前:数组+链表

⭐JDK8之后:数组+链表+红黑树

HashSet添加元素过程

⭐先获取HashCode值,再确定元素添加位置,再直接尾插链表

HashSet为什么存取顺序不同

⭐HashSet存元素时按照HashCode,取元素时从数组左遍历到右边

HashSet为什么无索引

⭐多种数据结构组合,难以确定索引

HashSet利用什么机制去重的 

重写HashCode与equals方法,哈希碰撞发生概率小

LinkedHashSet

继承了HashSet,并使用双向链表使元素拥有顺序

 TreeSet

本质为红黑树,会为元素自动排序(可自定义规则

TreeSet的排序规则 

TreeSet自定义排序规则

为了解决自定义类的排序规则问题,Java提供了多种自定义排序规则方法

方法一:实现Comparable 接口

实现Comparable接口后重写排序方法

代码示例

public class Student implements Comparable<Student>{           //实现泛型接口并指定数据类型

    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //规范2
    //姓名属性的获取(get)
    public String getName() {
        return name;
    }
    //姓名属性的更改(set)
    public void setName(String name) {
        this.name = name;
    }
    //年龄属性的获取(get)
    public int getAge() {
        return age;
    }
    //年龄属性的改变(set)
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    //重写规则方法
    @Override
    public int compareTo(Student o) {          //o代表treeSet已有元素
        return this.age-o.age;                         //定义比较规则
    }
}

自定义比较规则this.age-o.age 代表升序排列,反之o.age-this.age代表降序排列,就是C++的比较器原理

this.age-o.age:   当插入元素时,会将插入元素与集合内每一个元素进行compareTo比较得到return值,当return值(即this.age-o.age)为正数时代表当前元素排在已有元素右边,最大值的return值一定全为正(即this.age   >   o.age),故最大值排最右边,显然为升序排序(个人理解,表达能力不行,谅解❀,形成自己的理解是最好的)

⭐方法二:构造时指定排序

原理一样,这个直接使用带比较规则的构造函数即可,直接看代码示例

TreeSet<String> treeSet=new TreeSet<>((add,exist) -> {
    return add.length()-exist.length();
});
TreeSet总结 

 Collection总结

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

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

相关文章

Sprite Editor图片编辑器的使用_unity基础开发教程

Sprite Editor图片编辑器的使用 什么是Sprite Editor安装插件&#xff08;3D项目&#xff09;切片方式Automatic&#xff1a;自动切片Grid By Cell Size&#xff1a;按照像素大小进行切片Grid By Cell Count&#xff1a;按照个数进行切片Isometric Grid&#xff1a;等距网格切片…

Java利用UDP实现简单群聊

一、创建新项目 首先新建一个新的项目&#xff0c;并按如下操作 二、实现代码 界面ChatFrame类 package 群聊; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.InetAddress; public abstract class ChatFrame extends JFrame { p…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含pytho、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度下降算法&#xff0c;按比例…

MAC 系统在vs code中,如何实现自动换行

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在vscode中&#xff0c;有些时候&#xff0c;一行内容过多&#xff0c;如果不能自动换行&#xff0c;就需要拖动页面&#xff0c;才能看到完整的内容。如下图两行所示&#xff1a; 问题解决&#xff1a…

华为数通---使用基本ACL限制Telnet登录权限案例

组网需求 如下图所示&#xff0c;PC与设备之间路由可达&#xff0c;用户希望简单方便的配置和管理远程设备&#xff0c;可以在服务器端配置Telnet用户使用AAA验证登录&#xff0c;并配置安全策略&#xff0c;保证只有符合安全策略的用户才能登录设备。 配置通过Telnet登录设备…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组&#xff08;样卷&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段教师组样题&#xff0c; 内容包括&#xff1a;网络安全渗透、理论技能与职业素养。 本次比赛时间为180分钟。 介绍 Ge…

Unity中Batching优化的GPU实例化(1)

文章目录 前言一、GPU实例化的规则1、必须满足 Mesh 网格一样2、只有OpenGL es 3.0及以上才支持&#xff08;3.0及以上有部分硬件可能也不支持&#xff09; 二、GPU实例化的应用场景1、公开几个成员属性&#xff0c;用于存放可以调整的数据2、用Random.insideUnitCircle随机生成…

Linux(ubuntu)利用ffmpeg+qt设计rtsp_rtmp流媒体播放器(完全从0开始搭建环境进行开发)

一、前言 从0开始搭建Linux下Qt、ffmpeg开发环境。 从安装虚拟机开始、安装Linux(Ubuntu)系统、安装Qt开发环境、编译ffmpeg源码、配置ffmpeg环境、编写ffmpeg项目代码、完成项目开发。 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开…

决策树 (人工智能期末复习)

几个重要概念 信息熵&#xff1a;随机事件未按照某个属性的不同取值划分时的熵减去按照某个属性的不同取值划分时的平均 熵。即前后两次熵的差值。 表示事物的混乱程度&#xff0c;熵越大表示混乱程度越大&#xff0c;越小表示混乱程度越小。 对于随机事件&#xff0c;如果它的…

【Hadoop_01】Hadoop介绍与安装

1、Hadoop、HDFS、YARN介绍&#xff08;1&#xff09;Hadoop简介与优势&#xff08;2&#xff09;Hadoop组成&#xff08;3&#xff09;HDFS概述&#xff08;4&#xff09;YARN概述&#xff08;5&#xff09;MapReduce概述 2、安装&#xff08;1&#xff09;Centos7.5软硬件安装…

数据仓库与数据挖掘复习资料

一、题型与考点[第一种] 1、解释基本概念(中英互译解释简单的含义)&#xff1b; 2、简答题(每个10分有两个一定要记住)&#xff1a; ① 考时间序列Time series(第六章)的基本概念含义解释作用&#xff08;序列模式挖掘的作用&#xff09;&#xff1b; ② 考聚类(第五章)重点考…

用23种设计模式打造一个cocos creator的游戏框架----(四)装饰器模式

1、模式标准 模式名称&#xff1a;装饰器模式 模式分类&#xff1a;结构型 模式意图&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰器模式比生成子类更为灵活。 结构图&#xff1a; 适用于&#xff1a; 当需要给一个对象在运行时添加更…

Linux系统调试课:网络性能工具总结

文章目录 一、网络性能指标二、netstat三、route四、iptables沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章一起了解下网络性能工具。 一、网络性能指标 从网络性能指标出发,你更容易把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握。这样,…

网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit

miniconda与anaconda的区别&#xff1a; Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点&#xff1a; 1. 安装内容和大小&#xff1a; Anaconda&#xff1a; Anaconda 是一个完整的 Python 数据科学平台&#xff0c;包含…

Kafka使用指南

Kafka简介架构设计Kafka的架构设计关键概念Kafka的架构设计关键机制 Partition介绍Partition工作机制 应用场景ACK机制介绍ACK机制原理ACK机制对性能的影响ACK控制粒度Kafka分区数对集群性能影响调整分区优化集群性能拓展Kafka数据全局有序 Kafka简介 Kafka是由Apache软件基金…

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享 前言竞赛简介竞赛目的如何备战1.基础学习2.实战训练&#xff08;非常重要&#xff09; 资料分享 前言 博主在蓝桥杯中获得过十四届Java B 组的省一国二&#xff0c;本文为大家介绍一下蓝桥杯并分享一下自己的参赛经验。 竞赛简介…

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段学生组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段学生组&#xff08;样卷&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段样题&#xff0c;内容包括&#xff1a;网络安全渗透、理论技能与职业素养。 本次比赛时间为180分钟。 介绍 GeekSe…

分享“技艺与传承”的魅力!春城晚报(开屏新闻)生活节第七期媒体开放日活动举行

近日&#xff0c;由云南报业传媒&#xff08;集团&#xff09;有限责任公司、云南春晚传媒有限公司指导&#xff1b;金格金俊广场、云南精品文化传媒有限公司联合主办的第七期媒体开放日活动在金格金俊广场B1共享空间举办。本次活动以「技艺与传承」为主题&#xff0c;特邀青年…