Java集合进阶(上)

集合

集合在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.mzph.cn/news/203279.shtml

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

相关文章

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

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

Kubernetes Service控制器详解以及切换为ipvs代理模式

文章目录 一、Service 存在的意义二、Pod与Service的关系三、Service定义与创建四、Service三种常用类型五、Service代理模式六、切换Service代理模式七、service总体工作流程八、kube-proxy ipvs和iptables的异同九、Service DNS名称 一、Service 存在的意义 service的引入主…

【从零开始学习JVM | 第四篇】类加载器的分类以及双亲委派机制

前言&#xff1a; 在Java编程中&#xff0c;类加载器(Class Loader)扮演着重要的角色。类加载器负责加载Java字节码并将其转换为可执行对象&#xff0c;使得我们能够在应用程序中使用各种类和资源。Java类加载器的设计和实现旨在支持动态扩展和模块化编程&#xff0c;为Java语…

管理和监控CentOS上的HTTP服务

CentOS作为一款稳定的开源服务器操作系统&#xff0c;为各种网络服务提供了优秀的支持。其中&#xff0c;HTTP服务是互联网上最常用的服务之一&#xff0c;它为人们提供了便捷的信息访问和交互方式。在CentOS上管理和监控HTTP服务是一项重要的任务&#xff0c;下面我们将介绍一…

【改进YOLOv8】融合感受野注意力卷积RFCBAMConv的杂草分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展&#xff0c;图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行有效的分离&#xff0c;对于许多应用领…

elk+kafka+filebeat

elk1 cd /opt 把filebeat投进去 tar -xf filebeat-6.7.2-linux-x86_64.tar.gz mv filebeat-6.7.2-linux-x86_64 filebeat cd filebeat/ yum -y install nginx systemctl restart nginx vim /usr/share/nginx/html/index.html this is nginx cp filebeat.yml filebeat.yml.…

EPICS modbus 模块数字量读写练习

本文使用modbus slave软件模拟一个受控的modbus设备&#xff0c;此模拟设备提供如下功能&#xff1a; 1、线圈1&#xff0c;起始地址为0&#xff0c;数量为8&#xff0c;软件设置如下(功能码1)&#xff1a; 2、线圈2&#xff0c;起始地址为8&#xff0c;数量为8&#xff0c;软…

使用GPT-4V解决Pycharm设置问题

pycharm如何实现关联&#xff0c;用中文回答 在PyCharm中关联PDF文件类型&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 打开PyCharm设置&#xff1a;点击菜单栏中的“File”&#xff08;文件&#xff09;&#xff0c;然后选择“Settings”&#xff08;设置&#xff09;。…

论文笔记--A Fine-grained Interpretability Evaluation Benchmark for Neural NLP

论文笔记--A Fine-grained Interpretability Evaluation Benchmark for Neural NLP 1. 文章简介2. 文章概括3 文章重点技术3.1 数据收集3.2 数据扰动3.3 迭代标注和检查根因3.4 度量3.4.1 Token F1-score3.4.2 MAP(Mean Average Precision) 4. 文章亮点5. 原文传送门 1. 文章简…

日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)

原文链接 日志框架发展历程 在了解日志框架时总会列出一系列框架&#xff1a;Log4j&#xff0c;Reload4j&#xff0c;JUL&#xff0c;JCL&#xff0c;SLF4J&#xff0c;Logback&#xff0c;Log4j2&#xff0c;这么多框架让人感到混乱&#xff0c;该怎么选取、该怎么用。接下来…

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

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

2023年山东省职业院校技能大赛信息安全管理与评估第一阶段样题

2023年山东省职业院校技能大赛信息安全管理与评估样题 竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000 分。三个模块内容和分值分别是&#xff1a; \1. 第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;240 分钟&…

MAMBA介绍:一种新的可能超过Transformer的AI架构

有人说&#xff0c;“理解了人类的语言&#xff0c;就理解了世界”。一直以来&#xff0c;人工智能领域的学者和工程师们都试图让机器学习人类的语言和说话方式&#xff0c;但进展始终不大。因为人类的语言太复杂&#xff0c;太多样&#xff0c;而组成它背后的机制&#xff0c;…

华为数通---配置ARP安全综合功能案例

简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击&#xff0c;还可以防范网段扫描攻击…

搭建个人网盘应用Nextcloud

使用DNF管理软件包 1 使用winscp工具将openeuler-20.03-LTS-x86_64-dvd.iso上传至openeuler虚拟机的/root目录下&#xff0c;然后执行如下命令挂载ISO [rootopenEuler ~]# mount -o loop /root/openEuler-20.03-LTS-everything-x86_64-dvd.iso /mnt/2 添加软件源 [rootope…

数据挖掘 分类模型选择

选择的模型有&#xff1a; 决策树、朴素贝叶斯、K近邻、感知机 调用的头文件有&#xff1a; import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.linear_model import Perceptron from sklearn.naive_bayes import GaussianNB from s…

echerts 循环图 显示获取不到id

报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading getAttribute)&#xff0c; 我所出现的问题是 1&#xff0c;我在循环方法的时候 id没有从0开始&#xff0c;把id变成从0开始循环 2&#xff0c;设置myChart 全局属性 呈现效果 代码 html 动态绑…

0X05

打开题目 点击完登录和注册都没有什么反应&#xff0c;所以先扫一下看看 在出现admin.php后就截止了&#xff0c;访问看看,进入后台。。 尝试一下弱口令 admin/12345 或者是demo/demo 设计中-自定义->右上角导出主题 找到一个导出的点&#xff0c;下载了一个1.zip压缩包…

C#图像处理OpenCV开发指南(CVStar,07)——通用滤波(Filter2D)的实例代码

1 函数定义 void Filter2D (Mat src, Mat dst, int ddepth, InputArray kernel, Point anchor Point(-1,-1), double delta 0, int borderType BORDER_DEFAULT ) 1.1 原型 #include <opencv2/imgproc.hpp> Convolves an image wit…

Cocos Creator加入图片没有被识别

原因&#xff0c;需要更换类型&#xff0c;选择下图中的类型