java三大集合类--List

List Set Map

一、List

几个小问题:

1、接口可以被继承吗?(可以)

2、接口可以被多个类实现吗?(可以)

3、以下两种写法有什么区别?

//List list1=new List();是错误的因为List()是一个接口,是抽象的不能被实例化
//ArrayList()在源码中是一个类(class),可以new对象
//只能用List接口里的方法,不能使用ArrayList中的方法
List list1=new ArrayList();//可以使用ArrayList里的所有方法,因为ArrayList实现1ist接口,所以可以调用的方法比第一种要多,还可以使用List接口里面没有的方法
ArrayList list2=new ArrayList();
  • 第一种写法是List接口new的对象,只能用接口中的方法;
  • 第二种是new一个类对象,就像Student stuent=new Student()这样,所以可以使用ArrayList中的方法,又因为ArrayList实现了List接口,所以也能用List中的方法

4、通常List添加元素:

List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");

当所添加元素确定时,可以这样写:

List<String> list1 = Arrays.asList("aaa","bbb");

当List内元素确定时,这样写性能较高,没有扩容操作

但是如果想再向list1中添加元素时会报错,原因是上述写法执行时JVM会自动申请两块(只有两块)连续的内存空间,再add会报错。

List中的api

1、添加元素 add()
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");System.out.println(list); //[aaa,bbb,ccc,ddd]
2、获取指定下标元素 get(int index)
String str = list.get(3);
System.out.println(str);//ccc
3、设置指定元素更改为新值 set(int index,E e)
String old = list.set(0, "1");
System.out.println(list);//[1,bbb,ccc,ddd]
System.out.println(old);//aaa
4、指定位置添加新元素 add(int index,E e)

在第index个位置添加新的值e,原来这个位置及其后面的元素都向后移一位。

//list集合为:[aaa,bbb,ccc,ddd]
list.add(1,"2");
System.out.println(list);
//[aaa,2,bbb,ccc,ddd]
5、删除指定位置元素 remove(int index)

删除第index数,返回的是被删除的那个数;每次只能删除一个数

String str = list.remove(1);
System.out.println(list);//[aaa,bbb,ccc,ddd]
System.out.println(str);//2
6、删除全部元素
错误示例:遍历删除
List<String> list = new ArrayList<>();
//这里插入4个aaa
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");//遍历删除
for(int i=0;i<list.size();i++){if("aaa".equals(list.get(i))){list.remove(i);}
}System.out.println(list); //[aaa,aaa]

0

发现这样的遍历删除并不能删除干净。

为什么遍历list删不干净

原因:每当删除一个元素,下一个元素就会向前顶一个位置,会使原本index为1的元素变为为0,且 i 在执行后会自增,导致一半元素无法删除。

删除的三种方法
  • 倒序删除
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("aaa");list.add("aaa");list.add("aaa");//倒序遍历删除for(int i=list.size()-1;i>=0;i--){if("aaa".equals(list.get(i))){list.remove(i);}}System.out.println(list);}
  • 迭代器删除
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("aaa");list.add("aaa");list.add("aaa");// 使用迭代器删除Iterator<String> iterator = list.iterator();while(iterator.hasNext()) {String s = iterator.next();if ("aaa".equals(s)) {iterator.remove();}}System.out.println(list);}
  • lambada删除
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("aaa");list.add("aaa");list.add("aaa");// 使用 jdk8 新方法list.removeIf(item -> "aaa".equals(item));System.out.println(list);}

list判空?
List<String> list=new ArrayList<>();
system.out.print(list==null); //false

list数组是new出来的,判断一定为false

使用 hutool 工具类判空

依赖

<!--hutool工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version>
</dependency>

工具类判空

List<String> list = new ArrayList<>();//写法错误,当list定义为List<String> list=null;会出现空指针
list.get(1).equals(list.get(2));//正确写法
boolean equals=StrUtils.equals(list.get(1),list.get(2));

list不是线程安全的
  • 创建线程的四种方式

    1)继承Thread类创建线程

    2)实现Runnable接口创建线程

    3)使用Callable和Future创建线程

    4)使用线程池例如用Executor框架

  • 多线程操作List实例
public class ListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();MyThread m1=new MyThread(list);MyThread m2=new MyThread(list);new Thread(m1).start();new Thread(m2).start();System.out.println(list);}
}
public class MyThread implements Runnable{ArrayList<String> arr;public MyThread(ArrayList<String> arr) {this.arr = arr;}@Overridepublic void run() {for(int i=0;i<100;i++){arr.add("arr"+i);System.out.println(Thread.currentThread().getName()+"在第"+i+arr.get(i));}}
}

0

两个线程操作同一个List导致线程不安全。

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

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

相关文章

数据治理技术:研究现状与数据规范

随着信息技术的迅速发展,数据规模逐渐扩大&#xff0c;与此同时&#xff0c;劣质数据也随之而来&#xff0c;极大地降低了数据挖掘的质量&#xff0c;对信息社会造成了严重的困扰&#xff0c;劣质数据大量存在于很多领域和机构&#xff0c;国外权威机构的统计表明&#xff1a;美…

Android : 异常记录

查询大数据时 报错 android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos0, totalRows1解决办法&#xff1a;cursor DB.rawQuery("select * from " DBhelpUtil.TABLE_NAME" where id ?",new String[]…

untiy 配置iis服务器来打开webgl

最简单的方法是不需要配置服务器&#xff0c;打包的时候直接build and run&#xff0c;但是有时候如果我们需要调整js的内容&#xff0c;会很不方便&#xff0c;所以配置一个iis服务器还是很有必要的 首先要开启iis服务 控制面板&#xff0c;查看方式选类型&#xff0c;点击程…

C++设计模式——工厂模式 :简单工厂、工厂方法、抽象工厂

工厂模式可以分为三种&#xff0c;简单工厂模式&#xff0c;工厂方法模式和抽象工厂模式。 那么&#xff0c;这三种工厂模式长啥样&#xff0c;又为啥会衍生出这三种模式来呢&#xff1f;本篇和大家一起来学习总结一下。 一、简单工厂模式 简单工厂SimpleFactory 负责创建所有…

Webpack——模块打包

模块之于程序&#xff0c;就如同细胞之于生物体&#xff0c;是具有特定功能的组成单元。不同的模块负责不同的工作&#xff0c;它们以某种方式联系在一起&#xff0c;共同保证程序的正常运转。介绍Webpack如何对其进行打包以及合并&#xff0c;主要内容如下&#xff1a; 不同模…

使用OSS搭建私有云内网yum仓库的方法

使用OSS搭建私有云内网yum仓库的方法 文字&图片内容已脱敏 #、前几天接到一个搭建内网yum源的任务。刚接到这个任务的时候还是比较头疼的&#xff0c;因为内部有很多VPC。VPC与VPC之间是不互通的&#xff0c;又不能打高速通道&#xff0c;也不可能每个VPC下边都建一个yum…

Python 判断域名是否合规且是否可访问

需求 获得参数为域名的字符串后 1. 判定是否为合规域名 2. 该域名是否活着&#xff08;可访问&#xff09; 实例 headers { # 默认标头User-Agent: $,Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,Accept-Language: en-US,en;q0.5,Accept-Enc…

csv文件EXCEL默认打开乱码问题

这里讨论的问题是&#xff0c;当用记事本打开带有中文字符的csv正常时&#xff0c;用excel打开却是乱码。 简单概括就是&#xff1a;编码问题&#xff0c;windows的 excel打开csv文本文件时&#xff0c;默认使用的是系统内的ANSI&#xff0c;在中文环境下就是GB2312。如果写文件…

mySQL踩坑记录

1.MYSQL Workbench-8.0.27.1出现"Exception: Current profile has no WMI enabled"错误的解决方法 MYSQL Workbench-8.0.27.1出现“Exception: Current profile has no WMI enabled“错误的解决方法_赛风扥的博客-CSDN博客 C:\Program Files\MySQL\MySQL Workbench …

windows11 phpstudy_pro php8.2 安装redis扩展

环境&#xff1a;windows11 phpstudy_pro php8.2.9 一、命令查看是否安装redis扩展 在对应网站中通过打开&#xff0c;&#xff0c;选择对应的PHP版本&#xff0c;用命令 php -m 查看自己的php 有没有redis扩展 上面如果有&#xff0c;说明已经安装了,如果没有安装&#xff1…

AWL中英文对照表

Sublist 1 sector&#xff1a;部门、 available&#xff1a;可用的、 financial&#xff1a;财务的、 process&#xff1a;过程、 individual&#xff1a;个人的、 specific&#xff1a;具体的、 principle&#xff1a;原则、 estimate&#xff1a;估计、 variables&#xff1…

5 时间序列预测入门:LSTM+Transformer

0 引言 论文地址&#xff1a;https://arxiv.org/abs/1706.03762 1 Transformer Transformer 模型是一种用于处理序列数据的深度学习模型&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;任务。它在许多 NLP 任务中取得了重大突破&#xff0c;如机器翻译、文本…

docker安装elasticsearch

1、拉取镜像 docker pull elasticsearch:7.17.5 (听说这玩意不同版本有不同的坑&#xff0c;不兼容程序等等&#xff0c;所以要注意下载对应版本号) 2、创建挂载目录 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.host: …

Linux内存管理(六十四):ION 内存管理器——system heap

源码基于:Linux 5.4 约定: 芯片架构:ARM64内存架构:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :30. 前言 ION 是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存…

Servlet-Vue-JSON交互

Servlet-Vue-JSON交互 统一结果返回 定义 package org.example.result;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result<T> {private Integer code;private St…

Android Studio 模拟器设置独立窗口

目录 模拟器在窗口内部运行 设置成独立窗口 模拟器在窗口内部运行 操作起来十分不便 设置成独立窗口 Android Studio -> Preferences(Settings) -> Tools-> Emulator ->取消勾选 Launch in a tool window -> 点击右下角的 OK 按钮 -> 重启 Android Studio

Python与微信交互(互动)神器yyds

Weixin-Python 是一个用于开发微信公众平台应用的 Python 库。它可以帮助你轻松地处理微信服务器发来的消息&#xff0c;以及向用户发送各种类型的消息。 Weixin-Python 的主要功能包括&#xff1a; 验证微信服务器的签名&#xff0c;确保请求来自微信服务器。解析微信服务器发…

前端---CSS篇(详解CSS)

1.CSS简介 CSS(Cascading Style Sheets)层叠样式表&#xff0c;是用来为结构化文档&#xff08;HTML、XML等应用&#xff09;添加样式,比如字体、颜色、大小、间距的计算机语言。CSS目前已经发展到了CSS3.0了。 2.CSS导入方式 CSS有三种导入方式&#xff1a; 1.行内样式&am…

MySQL在Docker容器中的性能损失分析与优化策略

文章目录 1. Docker容器对MySQL性能的潜在影响1.1. IO性能1.2. 网络性能1.3. 资源隔离 2. 优化策略2.1. 使用本地数据卷2.2. 配置合理的容器网络2.3. 限制容器资源2.4. 使用容器编排工具 3. 性能测试与监控4. 结论 &#x1f389;MySQL在Docker容器中的性能损失分析与优化策略 ☆…

Positive Technologies 公司发布了一种保护容器环境的产品 PT Container Security

根据 Positive Technologies 公司的数据&#xff0c;该类产品在俄罗斯的市场容量为 25 亿卢布&#xff0c;据预测&#xff0c;到 2026 年将增长两倍 Positive Technologies 公司正在增加应用安全方面的产品组合。新产品 PT Container Security可在构建、部署和工业运行阶段自动…