Java List基础篇

目录

  • 前言
  • 一、常用List
    • 1.1 List
      • 1.1.1 特点
      • 1.1.2 常用API
    • 1.2 ArrayList
      • 1.2.1 特点
      • 1.2.2 使用
    • 1.3 LinkedList
      • 1.3.1 特点
      • 1.3.2 使用
    • 1.4 CopyOnWriteArrayList
      • 1.4.1 特点
      • 1.4.2 使用
    • 1.5 Arrays.asList()
      • 1.5.1 特点
      • 1.5.2 使用
  • 二、对比总结


前言

一、常用List

1.1 List

List是Java集合框架中的接口,表示有序的集合,可以包含重复元素。

public interface List<E> extends Collection<E> {

1.1.1 特点

特点:允许元素重复,有序集合,可以通过索引访问元素。

1.1.2 常用API

api作用描述
boolean add(E element)将指定元素添加到列表的末尾。
void add(int index, E element)在指定位置插入元素。
E get(int index)返回指定位置的元素。
E remove(int index)移除指定位置的元素。
boolean remove(Object o)移除指定元素。
boolean contains(Object o)判断列表是否包含指定元素。
int size()返回列表中的元素个数。
boolean isEmpty()判断列表是否为空。
void clear()清空列表中的所有元素。
E set(int index, E element)将指定位置的元素替换为新元素。

1.2 ArrayList

ArrayList是基于数组实现的动态数组。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

1.2.1 特点

ArrayList的特点:支持随机访问元素,插入和删除元素效率较低。

1.2.2 使用

 public static void test1() {//使用ArrayList类创建列表List<Integer> numbers = new ArrayList<>();//将元素添加到列表numbers.add(1);numbers.add(2);numbers.add(3);System.out.println("List: " + numbers);//从列表中访问元素int number = numbers.get(2);System.out.println("访问元素: " + number);//从列表中删除元素int removedNumber = numbers.remove(1);System.out.println("删除元素: " + removedNumber);}

输出:
在这里插入图片描述

1.3 LinkedList

LinkedList是基于双向链表实现的列表。

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

1.3.1 特点

特点:适合插入和删除元素,但随机访问元素效率较低。

LinkedList与ArrayList的区别:
LinkedList和ArrayList都实现Collections框架的List接口。 但是,它们之间存在一些差异。

LinkedListArrayList
在单个位置存储3个值(上一个地址,数据和下一个地址)将单个值存储在单个位置
提供list的双链接列表实现提供可调整大小的数组实现
每当添加元素时,上一个和下一个地址都会更改每当添加元素时,该位置之后的所有元素都会移动
要访问元素,我们需要从头开始迭代到元素可以使用索引随机访问元素。

1.3.2 使用

addFirst() - 将指定的元素添加到链接列表的开头
addLast() - 将指定的元素添加到链接列表的末尾

 public static void test1() {Deque<String> animals = new LinkedList<>();//在LinkedList的开始处添加元素animals.addFirst("Cow");animals.addFirst("Dog");animals.addFirst("Cat");System.out.println("LinkedList: " + animals);//在LinkedList的末尾添加元素animals.addLast("Zebra");System.out.println("新的LinkedList: " + animals);}

输出:
在这里插入图片描述

1.4 CopyOnWriteArrayList

CopyOnWriteArrayList是线程安全的ArrayList,使用写时复制的机制。

public class CopyOnWriteArrayList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

1.4.1 特点

优点:适合多线程环境下遍历频繁、修改少的场景,支持并发读取,解决开发工作中的多线程并发问题
缺点:

  1. 内存占用问题:两个数组同时驻扎在内存中,如果实际应用中,数据比较多,而且比较大的情况下,占用内存会比较大,针对这个其实可以使用ConcurrentHashMap来代替。
  2. 数据一致性:CopyOnWriteArrayList容器只能保证数据的最终已执行,不能保证数据的实时一致性,所以如果希望写入的数据,马上能读取到,就不能使用CopyOnWriteArrayList。

CopyOnWriteArrayList详细内容查看如下文章:
CopyOnWriteArrayList详解及使用

1.4.2 使用

public class myCopyOnWriteArrayList {public static void main(String[] args) {startTest();}private static final Integer THREAD_POOL_MAX_SIZE = 10;// 不支持并发
//    private static List<String> mList = new ArrayList<>();// 支持并发private static List<String> mList = new CopyOnWriteArrayList<>();private static void startTest() {// 初始化数据for (int i = 0; i < 10; i++) {mList.add("line:" + (i + 1) + "data");}System.out.println("------------初始化完成--------------------------");ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_MAX_SIZE);// 读写并发测试for (int i = 0; i < THREAD_POOL_MAX_SIZE; i++) {// 读任务立即执行executorService.execute(() -> {for (String item : mList) {System.out.println(Thread.currentThread().getName() + "数据:" + item);}});final int final1 = i + 10;// 写任务立即执行executorService.execute(() -> {mList.add("写线程添加数据" + final1 + "..............");});}}
}

在这里插入图片描述

1.5 Arrays.asList()

Arrays.asList():将数组转换为List的静态方法。
List< String> list = Arrays.asList(“a”,“b”,“c”);
注意:

(1)该方法适用于对象型数据的数组(String、Integer…)
(2)该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)
(3)该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新
(4)不支持add()、remove()、clear()等方法
(5)用此方法得到的List的长度是不可改变的

1.5.1 特点

特点:方便将数组转换为List,但返回的List不支持增删操作

1.5.2 使用

 public static void test1(){//1、使用asList()的String数组,正常String[] strings = {"aa", "bb", "cc"};List<String> stringList = Arrays.asList(strings);System.out.print("1、使用asList()的String数组,正常:  ");for(String str : stringList){System.out.print(str + " ");}System.out.println();//2、使用asList()的对象类型(Integer)数组,正常Integer[] integers = new Integer[] {1, 2, 3};List<Integer> integerList = Arrays.asList(integers);System.out.print("2、使用asList()的对象类型数组,正常:  ");for(int i : integerList){System.out.print(i + " ");}System.out.println();//3、使用asList()的基本数据类型数组,出错int[] ints = new int[]{1, 2, 3};List intList = Arrays.asList(ints);System.out.print("3、使用asList()的基本数据类型数组,出错(将'ints'视为单个元素):");for(Object o : intList){System.out.print(o.toString());}System.out.println();System.out.print("   " + "要正确输出,需按如下方式遍历:");int[] ints1 = (int[]) intList.get(0);for(int i : ints1){System.out.print(i + " ");}System.out.println();//4、更新数组或List时,另一个将自动更新System.out.print("4、更新数组或List时,另一个将自动更新:  ");integerList.set(0, 5);for(Object o : integerList){System.out.print(o + " ");}for(Object o : integers){System.out.print (o + " ");}System.out.println();//5、add() remove() 将报错System.out.print("5、add() remove() 将报错:  ");
//        integerList.remove(0);
//        integerList.add(3, 4);
//        integerList.clear();}

输出:
在这里插入图片描述

二、对比总结

list特点适用场景
ArrayList基于数组实现,支持动态扩容,随机访问元素效率高。需要频繁随机访问元素,对插入和删除操作要求不是特别高的场景。
LinkedList基于双向链表实现,插入和删除元素效率高,但随机访问元素效率相对较低。需要频繁插入和删除元素,而对随机访问元素要求不高的场景。
CopyOnWriteArrayList线程安全,使用写时复制的机制实现。多线程环境下需要频繁遍历而很少修改List的场景。
Arrays.asList()将数组转换为List。需要将数组转换为List的场景。

参考链接:
Java LinkedList(链表)
CopyOnWriteArrayList详解及使用
Arrays.asList() 详解

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

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

相关文章

JUC常用辅助类

一、CountDownLatch 1.原理 它内部维护了一个计数器&#xff0c;该计数器初始化时设定一个数值&#xff0c;表示需要等待的线程数量。每个线程执行完特定任务后会调用CountDownLatch的countDown()方法&#xff0c;该方法会将计数器减一。同时&#xff0c;另外一个或多个线程可…

Acrel-1000DP光伏监控系统 的应用 安科瑞 许敏

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式多为自发自用&#xff0c;余电上网&#xff0c;部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量&#xff0c;提高分布式光伏发电系统的利用率。发展分…

题目 2348: 信息学奥赛一本通T1436-数列分段II【二分答案】

信息学奥赛一本通T1436-数列分段II - C语言网 (dotcpp.com) #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define int long long const int N1e5100; const int inf1e9; int n,m; int a[N]; bool check(int mid) {int s…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

总体标准差、样本标准差、标准误(标准误差)

下面是样例&#xff1a; 参考文章如何做好SCI论文中的标准误差图 - 知乎 (zhihu.com)

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

【LeetCode】单调栈类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 单调栈 通常针对一维数组的问题&#xff0c;如果需要寻找一个元素右边或者左边第一个比自己大或者小的元素的位置&#xff0c;就可以使用单调栈&#xff0c;时间复杂度为O(n) 单调栈的本质是空间换时间&#…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

AI大模型之ChatGPT科普(深度好文)

目录 训练ChatGPT分几步&#xff1f; 如何炼成ChatGPT&#xff1f; 如何微调ChatGPT? 如何强化ChatGPT? 如何调教ChatGPT? AI思维链是什么&#xff1f; GPT背后的黑科技Transformer是什么&#xff1f; Transformer在计算机视觉上CV最佳作品&#xff1f; 数字时代&am…

【MySQL】游标和触发器

一、游标 1.1 什么是游标 1、使用背景 在我们使用update或者delete操作数据时&#xff0c;一般都会根据条件语句查询出很多条记录组成的数据集&#xff0c;然后一次性批量操作 假设我们想要对这个结果集中的数据 一行一行的进行操作&#xff0c;比如某个条件满足后&#xff…

Lora 串口透传开发 5

1 简介 串口转usb、转wifi等很多应用 2 设计原理 2.1 设计需求 1将LoRa终端定义成两种角色:Master和Slave 2一个模块发送任意字节长度&#xff08;小于128Byte&#xff09;数据&#xff0c;另一模块都可以接收到 3PC机上通过串口调试助手实现接收和发送 4终端在LCD屏幕上显…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中&#xff0c;公共厕所作为基础必备的民生设施&#xff0c;一直是城市管理的重要组成部分。随着科技的不断发展&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来&#xff0c;智慧公厕也进行了升级发展…

损失函数:BCE Loss(二元交叉熵损失函数)、Dice Loss(Dice相似系数损失函数)

损失函数&#xff1a;BCE Loss&#xff08;二元交叉熵损失函数&#xff09;、Dice Loss&#xff08;Dice相似系数损失函数&#xff09; 前言相关介绍BCE Loss&#xff08;二元交叉熵损失函数&#xff09;代码实例直接计算函数计算 Dice Loss&#xff08;Dice相似系数损失函数&a…

分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

文章目录 ⛄引言一、思路分析⛅实现方式⚡框架选择 二、实现数据同步⌚需求分析⏰搭建环境⚡核心源码 三、测试四、源码获取⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助…

如何使用Android手机通过JuiceSSH远程访问本地Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Python上解决TypeError: not all arguments converted during string formatting错误

目录 背景尝试1: pymysql模块的escape_string方法尝试2: 修改pandas.read_excel引擎尝试3: 回退xlrd版本总结 背景 在Linux上部署的时候, 使用pandas模块读取Excel, 然后pymysql模块入库, 结果发生了错误 Traceback (most recent call last):File "/usr/local/lib64/pyth…

3月谷歌应用上架/下架情况,上架难度加大,开发者面临新挑战?

在3月份&#xff0c;Google play应用商店应用上架和下架出现了前所未有的情况。很多开发者表示&#xff0c;上架难度简直是“地狱”级别。 下图是3月份美国、巴西、印度、中国香港的下架数量的折线图&#xff0c;根据市场数据监测&#xff0c;可以清晰地看到3月份中旬之后&…

DESTINATION MOON 香港站回顾|聆听 Web3 创新者的未来对话

创新者汇聚 Web3 行业&#xff0c;如何才能在生态、技术、投资的发展新风口把握机遇&#xff1f;「TinTin Destination Moon」香港站活动于 4 月 6 日下午如期举行&#xff01;Web3AI 的融合发展之道在哪&#xff1f;ETF 时代的投资逻辑有哪些&#xff1f;区块链未来的关键究竟…

使用HTML+CSS实现一个简单的登录页面

整个项目使用文件&#xff1a; HTML代码部分&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…