ArrayList和LinkedList

news2024/10/5 16:25:37

ArrayList的注意事项

1、在ArrayList中可以放任意元素,包括空值,任何元素,且可重复添加。

2、ArrayList底层是由数组来实现数据存储的

3、ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),看源码

在多线程的情况下,不建议使用ArrayList。

ArrayList底层操作机制源码分析

1、ArrayList 中维护了 一个Object类型的数组 elementData.

transient Object[] elementData;

transient: 表示瞬间、短暂的,表示该属性不会被序列化
在这里插入图片描述

2、当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0, 第一次添加,则扩容elementData为10,如果需要再次扩容的话,则扩容elementData为1.5倍

3、如果使用的是指定容量capacity的构造器,则初始的elementData容量为capacity,如果需要扩容,则扩容至当前elementData的1.5倍。

4、当添加元素时,先判断是否需要扩容,如果需要扩容,则调用grow方法。

重要、重要、重要!!!

上面的总结是基于之前的代码,现在新版本的源码已经改变,扩容机制也已经更改,可以看下面的👇🏻的源码分析。

源码解析

  • 无参构造器创建
ArrayList list = new ArrayList();

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

示例代码,可将代码复制至idea进行调试总结

package com.zhang.test_package.list_;

import java.util.ArrayList;

public class ArrayListSource {
    public static void main(String[] args) {
        // 使用无参构造器,默认容量为0
        ArrayList list = new ArrayList();
        // ArrayList list1 = new ArrayList(8);

        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }

        list.addAll(1, list);


        for (int i = 11; i <= 15; i++) {
            list.add(i);
        }

        list.add(123);
        list.add(300);
        list.add(null);
        for (Object o :
                list) {
            System.out.println(o);
        }
    }
}

流程图:

小画桌-免费在线协作白板

Vector注意事项

1、Vector 中维护了一个Object类型的数组 elementData.

private Object[] elementData;

2、Vector是线程同步的,即支持线程安全,Vector类的操作方法中带有 synchronized

synchronized: 支持线程同步和互斥。

3、在开发中,如果需要线程同步安全时,优先使用Vector。

单线程的时候优先考虑使用ArrayList 方法(效率高)

Vertor扩容机制

在这里插入图片描述

1、无参构造器,默认的 initialCapacity 为10
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、之后扩容按照2倍扩容

在这里插入图片描述

LinkedList的底层结构

1、LinkedList 底层实现了 双向链表 和 双端队列 特点

2、可以添加任意元素(元素可以重复),包括null

3、线程不安全,没有实现同步。

LinkedList底层操作机制

1、LinkedList底层维护了一个双向链表

2、LinkedList中维护了两个属性,first和last,分别指向 首节点和尾节点

3、每个节点(Node对象),里面又维护了 prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点,最终实现双向链表。

4、LinkedList 中的元素添加和删除,不是通过数组完成的,相对来说效率较高一些

package com.zhang.test_package.list_;

public class LinkedList01 {
    public static void main(String[] args) {
        Node c = new Node("C++");
        Node java = new Node("java");
        Node python = new Node("Python");

        // 连接三个节点,形成双向链表
        //  c -> java -> python
        c.next = java; // 头节点
        java.next = python; // 尾结点

        // python -> java -> c
        python.pre = java;
        java.pre = c;

        Node first = c; // 让first引用指向jack,就是双向链表的头结点
        Node last = python; //让last引用指向hsp,就是双向链表的尾结点
        System.out.println("正向遍历");
        while (first != null) {
            System.out.println(first);
            first = first.next;
        }

        System.out.println("反向遍历");
        while (last != null) {
            System.out.println(last);
            last = last.pre;
        }
        System.out.println("添加元素");
    }
}


class Node{
    private Object item; // 保存节点处的数据
    public Node next;  // 下一个节点
    public Node pre;  // 上一个节点

    public Node(Object item) {
        this.item = item;
    }

    @Override
    public String toString() {
        // 此处的toString方法不能加next和pre,不然的话,next和pre也都是Node,会调用toString方法
        // 最终StackOverFlowException
        return "Node{" +
                "item=" + item +
//                ", next=" + next +
//                ", pre=" + pre +
                '}';
    }
}

数据结构的知识做基础。建议多学习数据基础相关的知识。

LinkedList分析流程图:

小画桌-免费在线协作白板

LinkedList的增删改查

package com.zhang.test_package.list_;

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListCRUD {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        for (int i = 0; i < 1000; i++) {
            linkedList.add(i);
        }
//        linkedList.add(1);
//        linkedList.add(2);
//        linkedList.add(3);
//        linkedList.add(4);
//        linkedList.add(5);

        System.out.println(linkedList);

        linkedList.remove(30);

        linkedList.set(2, 10);

        linkedList.get(2);

        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }


    }
}

ArrayList和LinkedList比较

在这里插入图片描述
1、如果改查的操作多,选择ArrayList

2、如果增删的操作多,选择LinkedList

3、一般来说,在程序中,80%-90%的都是查询,因此大部分情况下选择ArrayList

4、在一个项目中,根据业务灵活选择,可以一个模块使用的是ArrayList,另一个模块是LinkedList.

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

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

相关文章

【Linux系列P7】进度条小程序的深度解剖(细节满满)

​​​​​ ​ 前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&am…

SpringBoot项目中MVC使用--【SB系列之010】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

线程池学习(五)线程工厂、线程池工厂

Executors 定义的Executor, ExecutorService, ScheduledExecutorService, ThreadFactory和Callable类的工厂和实用程序方法&#xff0c;我们称为线程池工厂。ThreadFactory 为定制化创建新线程的对象,我们称为线程工厂 前面几期的学习中&#xff0c;我已经初步会使用线程池了&…

用于公司文件防泄密用的保密软件(企业数据防泄密软件)

防止公司文件泄露是指采取各种措施和方法&#xff0c;以防止公司的敏感和机密文件被未经授权的人员获取、泄露或滥用的行为。 这些文件可能包含公司的商业机密、客户数据、财务信息、研发成果等重要资料&#xff0c;如果泄露给竞争对手、黑客或其他恶意人员&#xff0c;可能会对…

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

offiice64位的按装名字短的&#xff0c;office32位的安装名字长的 安装32位的AccessDatabaseEngine.exe&#xff0c;如果使用64位office点击安装32位access时提示无法安装&#xff0c;此时需要&#xff1a; 1.WINR打开运行&#xff0c;输入CMD&#xff0c;进入安装包文件夹 …

AHD模拟高清方案汇总及国产替代方案

由于模拟高清方案对比LVDS数字高清方案在降本、远距离传输的优势明显&#xff0c;及实现方案相对简单&#xff0c;模拟相机一直在车载和安防监控产品上有着较重要的市场地位。伴随着ZM贸易战和境外疫情影响愈来愈趋于严重化&#xff0c;原有外来品牌公司模拟高清方案在产品交期…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载方面具有突…

【运维小知识】(四)——linux常用命令

运维专栏&#xff1a;运维小知识 目录 1.&#x1f341;&#x1f341;用mv命令修改文件名 2.&#x1f343;&#x1f343;创建及删除文件夹即文件夹下所有文件 3.&#x1f342;&#x1f342;移动文件夹并重命名 4.&#x1f33f;&#x1f33f;复制文件 5.&#x1f344;&#x…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

MySQL-多表设计-一对多

多表的设计-概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一…

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex&#xff1a;Yacc&#xff1a;词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性&#xff1f; Vue内部定义的Vnode对象包含了以下属性&#xff1a; __v_isVNode: true&#xff0c;内部属性&#xff0c;有该属性表示为Vnode __v_skip: true&#xff0c;内部属性&#xff0c;表示跳过响应式转换&#xff0c;reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学&#xff08;部分&#xff09;4力扣 总结作业配套资源 学习资源选择 我从画面&#xff08;一定要看清代码&#xff09;声音&#xff08;清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布&#xff0c;我们称其为离散概率分布。对于连续变量的概率分布&#xff0c;我们称其为连续概率分布。本文主要介绍离散型概率分布。 &#xff11;.离散型均匀…

华为ospf路由协议在局域网中的高级应用案例

关键配置&#xff1a; 1、出口为ospf区域0&#xff0c;下联汇聚依次区域1、2…&#xff0c;非骨干全部为完全nssa区域 2、核心&#xff08;abr&#xff09;上对非骨干区域进行路由汇总&#xff0c;用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

ngAfterViewInit( ) to early /// ngFor和异步网络请求导致无法选中目标元素的问题

今天遇到的最无语的问题&#xff1a; angular 8版本以上&#xff0c;我在ngafterViewInit&#xff08;&#xff09;中选取元素选取不到&#xff0c;加上setTimeOut&#xff08;&#xff09;之后才可以选中 网上的解释&#xff1a; Angular的ngAfterViewInit生命周期钩子是在组…

uniapp | 查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件&#xff0c;但是打包后发现并没有生效&#xff0c;才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起&#xff0c;支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件&#xff08;Bundl…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言&#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

unity 2019 内置渲染管线 光照与Lighting面板 参数详解

文章目录 前言一 Unity的光照 与 烘焙光照1 unity完整的光照组成2 光的亮度与颜色3 全局光照直接光间接光5 间接光≠光照贴图 二 色彩空间与自动烘焙1 unity的色彩空间2 自动烘焙光照 三 烘焙1 什么是烘焙&#xff0c;烘焙的是什么2 如何进行烘焙3 烘焙的优点和缺点4 查看光照贴…