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.hqwc.cn/news/610762.html

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

相关文章

贪心算法:排列算式

题目描述 给出n数字&#xff0c;对于这些数字是否存在一种计算顺序&#xff0c;使得计算过程中数字不会超过3也不会小于0&#xff1f; 输入描述: 首行给出一个正整数t,(1≤t≤1000)代表测试数据组数每组测试数据第一行一个正整数n,(1≤n≤500)第二行包含n个以空格分隔的数字…

基于python的天气数据可视化系统、Flask框架,爬虫采集天气数据,可视化分析

系统介绍 基于Python的天气预测可视化分析系统&#xff0c;该项目的主要流程和功能包括&#xff1a; 数据获取&#xff1a; 使用Python的pandas库从2345天气网&#xff08;http://tianqi.2345.com/Pc/GetHistory&#xff09;抓取山东省各市区县在2021年至2023年间的天气历史数…

实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展

自2023年华为宣布全新HarmonyOS NEXT蓄势待发&#xff0c;鸿蒙原生应用全面启动以来&#xff0c;已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中&#xff0c;美团作为国内头部的科技零售企业&#xff0c;是首批加入鸿蒙生态的伙伴&#xff0c;其下的…

【C 数据结构】静态链表

文章目录 【 1. 基本原理 】1.1 静态链表中的节点1.2 备用链表 【 2. 静态链表的创建 】2.1 实例1 - 创建静态链表&#xff0c;指定值2.2 实例2 - 创建静态链表&#xff0c;默认值 【 3. 静态链表 添加元素 】【 4. 静态链表 删除元素 】【 5. 静态链表 查找元素 】【 6. 静态链…

机器人方向控制中应用的磁阻角度传感芯片

磁阻传感器提供的输出信号几乎不受磁场变动、磁温度系数、磁传感器距离与位置变动影响&#xff0c;可以达到高准确度与高效能&#xff0c;因此相当适合各种要求严格的车用电子与工业控制的应用。所以它远比采用其它传感方法的器件更具有优势。 机器人的应用日渐广泛&#xff0…

【ELFK】Filebeat+ELK 部署

FilebeatELK 部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.67.11 Elasticsearch Kibana Node2节点&#xff08;2C/4G&#xff09;&#xff1a;node2/192.168.67.12 Elasticsearch Apache节点&#xff1a;apache/192.168.67.10 …

如何编译OpenHarmony自带APP

作者&#xff1a;王石 概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

【域适应】基于域分离网络的MNIST数据10分类典型方法实现

关于 大规模数据收集和注释的成本通常使得将机器学习算法应用于新任务或数据集变得异常昂贵。规避这一成本的一种方法是在合成数据上训练模型&#xff0c;其中自动提供注释。尽管它们很有吸引力&#xff0c;但此类模型通常无法从合成图像推广到真实图像&#xff0c;因此需要域…

Harmony鸿蒙南向驱动开发-DAC接口使用

功能简介 DAC&#xff08;Digital to Analog Converter&#xff09;是一种通过电流、电压或电荷的形式将数字信号转换为模拟信号的设备&#xff0c;主要用于&#xff1a; 作为过程控制计算机系统的输出通道&#xff0c;与执行器相连&#xff0c;实现对生产过程的自动控制。 在…

去掉el-date-picker弹窗默认回显当前月份的方法

打开日期弹窗&#xff0c;默认会显示当前月份&#xff0c;如图 会发现加了穿透&#xff1a;&#xff1a;v-deep 样式也不生效 .el-month-table .today .cell {color: pink&#xff1b;font-weight: 400;}要让 popper-class“xclass” :append-to-body“false” 这俩配合着使用…

excel添加折线图,如何将日期作为横坐标?

就这么两列数据&#xff0c;想添加一个以日期为横坐标的折线图&#xff0c;但是出来的折线是这个样子&#xff0c;切换行/列也不行&#xff0c;怎么办呢&#xff1f; 实际上这个折线图中包括两条折线&#xff0c;蓝色的是日期的折线&#xff0c;橙色的是时间的折线&#xff0c;…