JAVA基础——集合框架(List与Set)

数据结构

什么是数据结构

        数据结构就是用来装数据以及数据与之间关系的一种集合。如何把相关联的数据存储到计算机,为后续的分析提供有效的数据源,是数据结构产生的由来。数据结构就是计算机存储、组织数据的方式。好的数据结构,让我们做起事来事半功倍。精心选择的数据结构可以带来更高的计算速度和存储效率。总体来说:数据结构是用来存储数据的结构,而使用特定数据结构,这些存放数据有特定关系。

常见的数据结构

树的话这里暂时不做讨论。

List

ArraryList

ArraryList简单介绍

1.内部基于数组实现的一个集合类。查询比较快,添加和删除相对比较慢

2.猜ArrayList中会有哪些功能(方法): 添加、删除、查询、插入、修改。。。

3.不是同步的(存在线程安全问题)

ArraryList基本使用

基本用法为增删改查,ArraryList特点为查找快,增删慢。有序可重复。

基本使用语法示例:

   ArrayList list = new ArrayList();list.add(1);//添加元素list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);list.add(8);list.add("哈哈");list.add("jack");list.add("james");list.add(new User("rose", "12"));list.add(new User("ducan", "32"));list.add(new User("Vicotr", "22"));list.remove("哈哈");//删除“哈哈”list.remove(2);//删除索引为2的元素list.set(2,"哈哈");//在索引为2处插入哈哈list.get(5);//获取索引为5处的元素

遍历方法

普通循环

代码示例:

 System.out.println("=================普通for=================");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}
加强循环

代码示例:

System.out.println("=================增强for=================");for (Object e : list) {System.out.println(e);}
单向迭代

代码示例:

  System.out.println("=================单向迭代器=================");// 获得迭代器 - 单向迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {Object o = iterator.next();//nextSystem.out.println(o);}
双向迭代

代码示例:

  System.out.println("=================双向迭代器=================");//获取双向迭代器的方式ListIterator listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}while (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}

LinkedList

LinkedList基本使用

        与ArraryList一致,基本的增删改查都是调用相同的方法,此处便不再再次给出代码。读者可自行参考上方的ArraryList。特点:有序可重复,增删快,查询慢。

遍历方法

普通循环

代码示例

  System.out.println("=================普通for=================");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}
加强循环

代码示例

  System.out.println("=================增强for=================");for (Object e : list) {System.out.println(e);}
单项迭代
System.out.println("=================单向迭代器=================");// 获得迭代器 - 单向迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {Object o = iterator.next();//nextSystem.out.println(o);}
双向迭代
    }System.out.println("=================双向迭代器=================");//获取双向迭代器的方式ListIterator listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}while (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}

List相关思维导图

Set

HashSet

HashSet简介

1.不能够添加重复元素

2.无序(不保证和添加和打印顺序一致)

如何判断元素是否重复:

1.通过添加进去的元素的hashCode+eqauls 两者进行比较

2.如果两个对象的hashCode相等 并且 两个对象调用equals结果是true 才认为两个元素重复

HashSet基本方法

调用语法与List相同,遍历方式为两种。

增强for循环

代码示例:

  System.out.println("===================遍历set 增强for=========================");for (Object e:hashset1){System.out.println(e);}
单向迭代

代码示例:

 System.out.println("===================遍历set 迭代器=========================");Iterator iterator=hashset1.iterator();while (iterator.hasNext()){System.out.println(iterator.hasNext());}//hashset没有双向迭代

LinkedHashSet

特点:有序不可重复。相关方法调用与HashSet一样。

代码示例:

/*** 有序不可重复* @author XM**/
public class LinkedHashSetTest {public static void main(String[] args) {LinkedHashSet set = new LinkedHashSet(); set.add("zs");set.add("ls");boolean result = set.add("zs");System.out.println(result);set.add("ww");set.add("zl");System.out.println(set);}}

TreeSet(排序,不可重复)

TreeSet简介

1.无序:不保证(不记录)我们的添加顺序;但是排序了

2.不重复:不能够添加重复元素(多个心眼)如何判断重复的呢?

3.感觉内部存储有一定的顺序

**注意:TreeSet一旦添加了第一个元素后就不能添加其它数据类型的元素了,只能添加相同数据类型的元素,除非将容器中所有的元素全部清空,才能添加新的数据类型的元素

TreeSet结构分析

1.TreeSet内部是按照大小进行排序的,大小有对象与对象之间比较进行决定的

2.设计TreeSet之前:Java设计了一个接口Comparable接口,其中提供了对象之间比较的方法CompareTo

3.TreeSet会调用对象的CompareTo方法,比较对象,所以我们放入的对象需实现Comparable

自然排序与定制排序(比较器)

自然排序

什么是自然排序

1.例如:大家排队,按照高矮个排队,那么同学们自己相互之间就能进行对比,每个对象具备自我比较判断的能力,称之为自然排序

*Comparable*中API**文档中的描述:

2.此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

**理解:如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序

代码示例:

@Override
public int compareTo(Object o) {if(o==null){return 0;}Student stu = (Student)o;if(this.age>stu.age){//如果大于的时候返回负数表示降序,返回负数表示升序return -1;}else if(this.age<stu.age){//如果大于的时候返回负数表示降序,返回负数表示升序return 1;}else{//如果年龄不大于也不小于说明等于,那么有名字来决定对象是否相同String已经写好排序规则return this.name.compareTo(stu.name);}
}


测试代码:

TreeSet ts = new TreeSet();
Student stu1 = new Student("XXX",20);
Student stu2 = new Student("XXX",20);
ts.add(stu1);
ts.add(stu2);
System.out.println(ts.size());
System.out.println(ts);
定制排序

1、什么是定制排序

定制排序,相当于给容器提供了一个裁判:例如操场就是一个容器,那么体育老师就是这个裁判,每个同学进入操场同学们相互之间可以比较谁比较帅,或者不可以比较谁帅都可以,有了老师这个裁判,老师可以负责比较每一位同学

2、为什么需要定制排序

(1) 原来的比较规则不符合所有人的使用需求

(2) 不存在比较规则的对象,无法放入容器,我可以给容器提供定制比较器

3、定制排序如何实现

(1) Comparator 是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);

(2) 自定义一个类实现Comparator接口,其中写比较规则 ---> 比较器的模板,我们现在需要的是一个具体的比较器对象

代码示例:

public class MyComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {if(o1==null||o2==null){//判断,若两个有一个为null都直接返回return 0;}if(o1 instanceof Student && o2 instanceof Student){//如果类型匹配才转换Student stu1 = (Student)o1;Student stu2 = (Student)o2;if(stu1.age>stu2.age){//先判断年龄后判断姓名return 1;}else if(stu1.age<stu2.age){return -1;}else{return stu1.name.compareTo(stu2.name);}}return 0;}
}

测试代码

MyComparator mc = new MyComparator();
TreeSet ts = new TreeSet(mc);
Student stu1 = new Student("XXX",19);
Student stu2 = new Student("OOO",18);
Student stu3 = new Student("YYY",18);
Student stu4 = new Student("ZZZ",18);
Student stu5 = new Student("QQQ",18);
ts.add(stu1);
ts.add(stu2);
ts.add(stu3);
ts.add(stu4);
ts.add(stu5);
System.out.println(ts.size());
System.out.println(ts);

Set相关思维导图

写在最后

List与Set是JAVA基础中一个十分重要的知识点,后续的实际项目开发过程中会很多次的用到这些相关的知识。希望大家能够重视。

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

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

相关文章

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

练习题(2024/4/29)

在深度优先遍历中&#xff1a;有三个顺序&#xff0c;前中后序遍历 这里前中后&#xff0c;其实指的就是中间节点的遍历顺序&#xff0c;只要记住 前中后序指的就是中间节点的位置就可以了。 如图 1二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

CTFHub-Web-SSRF

CTFHub-Web-SSRF-WP 一、内网访问 1.题目提示说访问127.0.0.1的flag.php&#xff0c;在URL后面添加路径没想到直接访问成功 二、伪协议读取文件 1.题目提示说访问Web目录下的flag.php&#xff0c;联想到Web目录一般存放于/var/www/html/里&#xff0c;去修改URL尝试进行访问…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-UNIX时间戳、BKPRTC

UNIX时间戳 UNIX时间戳最早是在UNIX系统使用的&#xff0c;所以叫做UNIX时间戳&#xff0c;之后很多由UNIX演变而来的系统也继承了UNIX时间戳的规定&#xff0c;目前linux&#xff0c;windows&#xff0c;安卓这些操作系统的底层计时系统都是用UNIX时间戳 时间戳这个计时系统和…

Java对接高德api搜索POI 2.0 关键字搜索

目录 一、注册账号 二、搜索小demo 1.首先要引入依赖 2. 然后查看打印结果即可 三、搜索接口代码 1.引入依赖 2.yml配置 2.Controller 3.静态工具类 四、运行测试 一、注册账号 高德开放平台 | 高德地图API 注册高德开发者&#xff1b;去控制台创建应用&#xff…

Arco design 发布到生成环境F5刷新报错404

问题&#xff1a;开发环境没问题&#xff0c;生成环境正常跳转也没问题但是F5刷新报错 解决办法一&#xff1a;修改 history: createWebHistory(), 改为history: createWebHashHistory(),

在Ubuntu linux操作系统上操作MySQL数据库常用的命令

检查是否安装了MySQL&#xff0c;或检查MySQL的状态&#xff1a; sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装&#xff0c;上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库&#xff1a; sud…

MyBatis 插件介绍及应用

MyBatis 插件介绍及应用 MyBatis 是一个持久层框架&#xff0c;它允许开发者自定义 SQL 语句并将其映射到 Java 对象中。MyBatis 提供了一种灵活的数据库操作方式&#xff0c;但随着项目的复杂度增加&#xff0c;一些通用功能如分页、缓存、事务管理等可能需要重复编写。为了解…

MyBatis(注解方式操作)

文章目录 1.注解方式操作文件目录1.快速入门&#xff08;完整步骤&#xff09;1.pom.xml&#xff08;完整&#xff09;2.resources/jdbc.properties外部配置文件&#xff08;根据实际情况修改参数&#xff09;3.在resources/mybatis-config.xml&#xff08;完整&#xff09;中配…

Android Studio的笔记--布局文件

关于Layout布局文件的使用 LinearLayoutRelativeLayout之前文章的内容一些常见性质在android.graphics.Color中定义了12种常见的颜色常数线性布局LinearLayout 一些常见使用文本框TextView设置文本内容编辑框EditText获取文本内容按钮Button控件使用其他按钮修改图标及名称添加…

智慧旅游驱动行业革新:智能技术引领服务全面升级,匠心打造高品质、个性化旅游新体验

一、引言 随着科技的飞速发展和信息化程度的不断提高&#xff0c;智慧旅游正逐渐成为旅游业发展的新趋势。智慧旅游&#xff0c;顾名思义&#xff0c;是以智能化技术为支撑&#xff0c;通过大数据、云计算、物联网、人工智能等先进技术的应用&#xff0c;实现旅游服务的全面升…

React Router 路由配置数组配组持久化

在一些特定场景下,你可能需要将路由配置数组进行持久化,例如从后端动态加载路由配置或根据用户权限动态生成路由配置。这时,持久化路由配置数组就很有用,可以避免每次应用启动时重新获取或计算路由配置。 持久化路由配置数组的步骤如下: 定义路由配置数组 首先,你需要定义一…

ASR语音转录Prompt优化

ASR语音转录Prompt优化 一、前言 在ASR转录的时候&#xff0c;我们能很明显的感受到有时候语音识别不是很准确&#xff0c;这过程中常见的文本错误主要可以归纳为以下几类&#xff1a; 同音错误&#xff08;Homophone Errors&#xff09; 同音错误发生在不同词语发音相似或相…

使用Postman对@RequestPart和HttpServletRequest组合传参方式

使用Postman对RequestPart和HttpServletRequest组合传参方式 方法代码如下&#xff1a; /*** 发布*/ApiOperation("发布")ApiImplicitParams({ApiImplicitParam(name "req", value "json格式", dataType "Map", dataTypeClass Ma…

【在线名字作画HTML源码】

在线名字作画HTML源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.htm <!DOCTYPE html> <html> <head> <title>在线名字作画|民间花鸟字|多彩花鸟虫鱼组合书法|藏字画|字谜语|飞帛板书|意匠文字</title> <meta http-equiv&…

HarmaonyOS鸿蒙应用科普课

一、什么是鸿蒙OS&#xff1f; 1.概念&#xff1a; 先给大家讲讲今天讲课的主题&#xff0c;鸿蒙OS是什么&#xff1f;鸿蒙系统大家都知道&#xff0c;就是一个操作系统&#xff0c;我们未来是为的成为鸿蒙程序员。所以我们不要将鸿蒙os完全等同于手机操作系统&#xff0c;太…

华为 huawei 交换机 配置 MUX VLAN 示例(汇聚层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如 图 6-4 所示&#xff0c; Switch1 位于网络的汇聚层&#xff0…

Nacos 安全零信任实践

作者&#xff1a;柳遵飞 Nacos 作为配置中心经常存储一些敏感信息&#xff0c;但是由于误用导致安全风险&#xff0c;最常见的主要是以下两个问题&#xff1a; 1&#xff09;Nacos 暴露公网可以吗&#xff1f;不可以&#xff0c;因为 Nacos 定位是注册配置中心&#xff0c;是…

Windows命令行基本命令

目录 什么是相对路径和绝对路径&#xff1f; 一、目录&#xff08;文件夹&#xff09;和文件操作 1.cd命令 用于切换目录 2.dir命令 用于显示目录和文件列表 3.md或mkdir命令 创建文件&#xff0c;也可以创建多级子目录 4.rd命令 用于删除目录 5.move命令 用于移动…