Java List基础篇

news2024/11/25 4:51:21

目录

  • 前言
  • 一、常用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.coloradmin.cn/o/1588167.html

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

相关文章

C++STL--谓词

谓词 ① 可调用的表达式称为谓词,包括仿函数,自定义函数,lambda表达式。 ② 接受一个参数的谓词&#xff0c;称为一元谓词。 ③ 接受两个参数的谓词&#xff0c;称为二元谓词。 可调用的表达式:对于一个对象或者表达式,如果可以使用调用运算符(),就称它为可以调用的。 一元谓…

2024年【T电梯修理】考试总结及T电梯修理考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练&#xff01;安全生产模拟考试一点通每个月更新T电梯修理考试技巧题目及答案&#xff01;多做几遍&#xff0c;其实通过T电梯修理试题及解析很简单。 1、【多选题】修理工陶、陈&#xff0c…

李沐27_含并行连结的网络GoogLeNet_Inception——自学笔记

Inception块 1.四个路径从不同层面抽取信息&#xff0c;然后在输出通道维合并。 2.有更少的参数个数和计算复杂度&#xff08;相比于3X3和5X5卷积层&#xff09; GoogLeNet 1.五个stages&#xff0c;九个inception块 Inception各种后续变种 1.Inception-BN(V2)——使用ba…

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程…

STL--pair 数对

pair 数对&#x1f357; pair是一个模板类,使用时需要引用文件 #include <utility>//通用工具pair可将两个value处理为一个元素。C标准库内多处用到了这个结构。尤其容器 map、unordered_map和unordered_multimap就是使用pair来管理其内部元素(key_value),任何函数如果…

MySQL一些特殊功能的索引(6/16)

特殊功能性索引 B-Tree索引&#xff1a; InnoDB的默认索引类型&#xff0c;适用于多种查询操作。 可以用于等值查询、范围查询和索引列的组合查询。 创建B-Tree索引的示例&#xff1a; CREATE INDEX index_name ON table_name (column1, column2);全文索引&#xff08;FULLTEX…

个人博客项目笔记_05

1. ThreadLocal内存泄漏 ThreadLocal 内存泄漏是指由于没有及时清理 ThreadLocal 实例所存储的数据&#xff0c;导致这些数据在线程池或长时间运行的应用中累积过多&#xff0c;最终导致内存占用过高的情况。 内存泄漏通常发生在以下情况下&#xff1a; 线程池场景下的 ThreadL…

Mysql内存表及使用场景(12/16)

内存表&#xff08;Memory引擎&#xff09; InnoDB引擎使用B树作为主键索引&#xff0c;数据按照索引顺序存储&#xff0c;称为索引组织表&#xff08;Index Organized Table&#xff09;。 Memory引擎的数据和索引分开存储&#xff0c;数据以数组形式存放&#xff0c;主键索…

个人博客项目笔记_07

写文章 写文章需要 三个接口&#xff1a; 获取所有文章类别 获取所有标签 发布文章 1. 所有文章分类 1.1 接口说明 接口url&#xff1a;/categorys 请求方式&#xff1a;GET 请求参数&#xff1a; 参数名称参数类型说明 返回数据&#xff1a; {"success":…

PyTorch-Lightning:trining_step的自动优化

文章目录 PyTorch-Lightning&#xff1a;trining_step的自动优化总结&#xff1a; class _ AutomaticOptimization()def rundef _make_closuredef _training_stepclass ClosureResult():def from_training_step_output class Closure PyTorch-Lightning&#xff1a;trining_ste…

算法 分割字符串为实体类

题目 String userData "10000:张三:男:1998-01-01#10001:张三:男:1998-01-01#10002:李四:女:1999-02-02#10003:王五:男:2000-03-03#10004:赵六:女:2001-04-04"; String[] usersArray userData.split("#"); // 使用Stream API将字符串数组转换为SysUser对…

ALV合并单元格

1、文章说明 在开发一些报表时&#xff0c;需要显示双层的标题&#xff0c;或者合并单元格的数据&#xff0c;归根结底就是要实现类似EXCEL合并单元格的需求。如图所示 网上的资料&#xff0c;很多根据国外某大神的方法实现&#xff1a;https://tricktresor.de/blog/zellen-ver…

JavaScript(四)-Web APIS

文章目录 日期对象实例化时间对象方法时间戳 节点操作DOM节点查找节点增加节点删除节点 M端事件JS插件Window对象BOM&#xff08;浏览器对象模型&#xff09;定时器-延时函数JS执行机制location对象navigator对象history对象 本地存储本地存储介绍本地存储分类localStoragesess…

Play Module Factory:Codigger系统上的高效Module开发工具

Play Module Factory&#xff0c;这款在Codigger系统上独树一帜的Play-Module开发工具&#xff0c;为广大的开发者们提供了一个全新的、高效的插件开发平台。它汇集了丰富的模板资源、基础库、API接口以及语言支持&#xff0c;这些功能强大的工具组合在一起&#xff0c;使得开发…

14亿美元!德国默克与AI生物科技公司合作;马斯克Neuralink首位脑机接口植入者用意念打游戏;黄仁勋在俄勒冈州立大学开讲

AI for Science 的新成果、新动态、新视角—— 日本第一 IT 公司富士通&#xff1a;生成式 AI 加速药物研发 马斯克&#xff1a;Neuralink 首位脑机接口植入者用「意念」打游戏 默克与 AI 生物科技公司 Caris 达成合作 AI 蛋白质设计服务提供商「天鹜科技」完成数千万元 Pre…

VE、希喂、PR猫咪主食冻干怎么样?测评品控最强、配方最好主食冻干!

我发现还是有不少铲屎官局限于“进口最高贵”&#xff0c;盲目的迷信进口产品。看到进口粮就盲买&#xff0c;甚至过分的贬低国产品牌&#xff0c;将国产粮贴上“不靠谱”“不合格”等标签。 最近&#xff0c;我针对主食冻干的国内、国际标准&#xff0c;相关规范文件&#xf…

C++资源重复释放问题

这不是自己释放了2次&#xff1b; 可能是类互相引用&#xff0c;有类似现象释放资源时引起&#xff1b;还不太了解&#xff1b; 类对象作为函数参数也会引起&#xff1b; 下面是一个简单示例&#xff1b; #include <iostream> #include <string.h> #include &l…

如何快速写一份简历

文章目录 如何快速写一份简历一些写简历的技巧 最近一段时间一直在忙简历相关的事情&#xff0c;起初是有一个其他行业的朋友问我&#xff0c;说这些简历我写了好久真难写&#xff0c;我说你可以借助AI&#xff0c;现在这种工具多了去了&#xff0c;为什么不借助呢&#xff1f;…

2024年 Mathorcup高校数学建模竞赛(B题)| 甲骨文识别 | 特征提取,图像分割解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过神经网络解决甲骨文识别问题。结合特征提取&#xff0c;图像分割等多元算法&…

Apabi Reader软件:打开ceb文件

Apabi Reader软件&#xff1a;打开ceb文件 软件下载软件安装 打开ceb文件参考 软件下载 下载官网-Apabi Reader软件 软件安装 打开ceb文件 ceb文件目录如下&#xff1a; 打开文件如下&#xff1a; 参考