Java8 ArrayList的实现

Java中初始化ArrayList的几种方法 下面是几种常见的初始化ArrayList的方法。asList()方法接受一个数组作为参数,并返回一个包含数组元素的固定大小的List。根据具体的需求,我们可以选择合适的方法来初始化ArrayList,并开始使用它来存储和管理数据。ArrayList还提供了一个带有初始容量的构造函数,可以在创建ArrayList时指定其初始容量。最简单的初始化ArrayList的方法是使用无参构造函数,它将创建一个空的ArrayList。上述代码将数组转换为ArrayList,并将数组中的元素添加到ArrayList中。 阅读详情

ArrayList底层是使用数组的方式实现的,在java8中初始化则是分配一个内存为0的对象数组(常量类型),在添加时在不断分配新内存

  • 初始化
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
   //默认的数组长度
    private static final int DEFAULT_CAPACITY = 10;

    //java8以后的ArrayList初始化之后并不会马上分配内存空间
    private static final Object[] EMPTY_ELEMENTDATA = {};

     //transient修饰非序列化
    transient Object[] elementData; // non-private to simplify nested class access


    private int size;


    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }


    public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }
}
  • 添加节点
 public boolean add(E e) {
        //判断是否需要扩容(传入的参数是目前所需要的最小数组长度)
        ensureCapacityInternal(size + 1); 
        elementData[size++] = e;
        return true;
 }

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            //判断默认的长度是否符合要求
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
}
//进行扩容
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //Arrays.copyOf(oldArray,newArrayLength)
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

注意:Arrays.copyOf(elementData, newCapacity)在底层视线中非常常见,是将数组有一个数组复制到另一个数组中
区别:System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)表示将数组src从srcPost的位置开始复制,复制的长度为length,复制到dest数组的destPost位置上

  • 删除节点(给出节点位置)
public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
}
//判断节点位置是否存在
private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
  • 删除节点(已知节点内容)
 public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
    //快速删除节点
private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }

同样的,在ArrayList中允许节点内容为空,也允许节点内容重复

  • 获取某位置的节点
public E get(int index) {
            rangeCheck(index);
            checkForComodification();
            return ArrayList.this.elementData(offset + index);
}
//判断该节点是否已经被修改了(这个一般用于并发操作的控制,防止多个线程都写不一致)
private void checkForComodification() {
            if (ArrayList.this.modCount != this.modCount)
                throw new ConcurrentModificationException();
}
  • 设置某位置的节点为指定内容
public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
}
//获取某位置的节点
 E elementData(int index) {
        return (E) elementData[index];
}
  • 获取表长度
//同样这里增强了对并发操作的版本控制,查看目前的size是否被改变过
 public int size() {
            checkForComodification();
            return this.size;
}
8、Java集合API中的列表与ArrayList实现详解 本文深入解析了Java集合API中列表(List)的两种主要实现:ArrayList和LinkedList。详细分析了它们在不同操作(如随机访问、插入、删除、搜索)上的运行时间复杂度,并通过示例代码展示了如何高效地使用列表操作,特别是remove和迭代遍历。文章还介绍了ListIterator接口的功能及其在ArrayList和LinkedList上的性能差异,以及如何手动实现一个简单的ArrayList(MyArrayList),并讨论了内部类在迭代器中的应用及其优势。最后,文章提供了不同场景下选择合适列 阅读详情

相关推荐

Java 8中使用Stream API对ArrayList与BigDecimal实现高效求和

在某些复杂场景下,可能需要自定义合并逻辑。例如,我们希望在合并时对结果进行精度控制。.reduce(

weixin_34374684的博客 787

JDK8中ArrayList初始化和add过程

扩容:只有当前数组的size大于已经创建数组的长度才需要扩容,扩容时会拿到object数组长度加上object数组>>1位运算 (object数组数组长度/2) 也就每次扩容都是1.5倍,如果扩容之后还不够,会把最大值给要扩容的长度,如果扩容的长度大于数组的最大长度,如果是负数则抛异常,否则会返回Integer.最大值,然会拿着扩容的长度和数组进行扩容。ArrayList创建时如果没有指定大小长度底层默认会创建一个数组长度为空的Objet数组,并且保存这次的数组对象。这样做的好处:可以节省堆空间的开销。

j20020227的博客 733

中文顶刊《会计研究》文本分析技术最新进展总结盘点

会计研究》是由中华人民共和国财政部主管、中国会计学会主办的国家一级学术期刊,为会计领域中文顶级期刊。随着大数据技术的日益成熟, 社交网络类文本 、上市公司披露类文本、媒体报道类文本、 其他类文本 、网络搜索数据、P2P 网络借贷文 本与分析师报告等文本数据逐渐成为财务会计的研究素材。

qq_52891550的博客 2891

Java:ArrayList初始化赋值

测试环境。

彭世瑜的博客 3213

Ubuntu22环境下Xinference与RAGFLOW集成:构建高效rerank模型服务【实战指南】

本文详细介绍了在Ubuntu22.04系统上,通过部署Xinference模型推理服务来加载bge-reranker-base等rerank模型,并将其与RAGFLOW框架集成的完整实战指南。该方案实现了模型服务的解耦与灵活管理,有效提升RAG系统的检索精度与答案相关性,并提供了从环境配置、服务启动、网络连接到性能调优及常见问题排查的全流程解决方案。

pluto的博客 500

EXI编解码避坑指南:ISO15118-2协议中3条异常命令的差异分析

本文深度剖析了ISO15118-2协议测试中EXI编解码的典型问题,聚焦于ChargeParameterDiscoveryRes、CertificateInstallationReq和MeteringReceiptReq三条命令在不同工具间产生109字节差异的现象。通过对比EXICodec.jar、OpenEXI和Efficient XML的输出,揭示了差异根源于EXI报头处理机制与模式文件完整性,并提供了从现象确认、根因分析到解决方案的标准化排查流程,助力协议测试工程师确保编解码一致性与通信可靠性。

algae的博客 411

arraylist 初始化_Java-ArrayList

Java 集合框架ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:import java.util.ArrayList; // 引入 ArrayList 类 Ar...

weixin_39838758的博客 403

【鸿蒙实战开发】HarmonyOS申请调试签名证书过程

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_002的博客 3561

Java ArrayList

ArrayList 是Java集合框架中的动态数组实现,提供了灵活的元素操作和自动扩容机制。通过常用方法如add、remove、get等,能方便地管理列表元素。支持泛型,可以存储不同类型数据。在实际开发中,ArrayList是处理动态数据集合的常用选择。

m0_67882861的博客 1986

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 863

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 917

Java8 实现ArrayList求交集并集差集

本文借助Java8的Stream API完成ArrayList集合运算:求交集、并集和差集!以下代码可立刻复制至IDE运行调试! public class CollectionUtil { /** * 判断为空 */ public static boolean isEmpty(Collection&lt;?&gt; collection) { ...

Blake的博客 2957

大语言模型原理与工程实践:手把手教你训练 7B 大语言模型 自动化训练框架

近年来,大语言模型(Large Language Models,LLMs)在自然语言处理领域取得了突破性进展。从GPT-3到ChatGPT,再到最新的GPT-4,这些模型展现出了惊人的语言理解和生成能力,引发了学术界和产业界的广泛关注。然而,训练如此庞大的模型不仅需要海量的数据和计算资源,还需要复杂的工程实践和优化技巧。本文将深入探讨大语言模型的原理,并以7B参数规模的模型为例,详细介绍如何构建一个自动化训练框架,使读者能够亲自动手训练自己的大语言模型。

AI天才研究院 1923

深入学习Java8——ArrayList的实现原理

ArrayList一、 ArrayList的概述二、属性三、方法1、构造方法2、get 方法3、add 方法4、set 方法5、remove 方法6、grow 方法7、size 方法8、indexOf 方法和 lastIndexOf四、Vector1.属性和构造方法2.grow 方法五、总结 一、 ArrayList的概述 ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在 内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的

魚生 310

Unity之ASE+ShaderGraph+VFX入门到精通 目录

这里是ASE+ShaderGraph+VFX从入门到精通专栏的目录,不停更新中,有问题随时留言或者私信。

TxNet 2841

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java8前-ArrayList实现原理

概述 ArrayList 是 List 接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造 ArrayList 时指定其容量。在添加大量元素前,应

clearlxj的博客 284

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java8 新特性 之 集合的底层源码实现:ArrayList、LinkedList、Vector、HashMap、Hashtable

目录 ArrayList、LinkedList、Vector区别? HashMap和Hashtable的对比 HashMap的底层实现原理 HashMap的存储结构 负载因子值的大小,对HashMap有什么影响? Java8 新特性 之 Lambda表达式 Java8 新特性 之 函数式接口 Java8 新特性 之 方法引用与构造器引用 Java8 新特性 之 Stream ...

超人不会飞 550

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深入java8的集合1:ArrayList的实现原理

一、概述 一上来,先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implem...

weixin_42694887的博客 3874

Java8-ArrayList实现原理

概述 先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipu

clearlxj的博客 526

Java8的集合:ArrayList的实现原理

一、概述 ArrayList 是一个动态数组,实现了 List 接口以及 list相关的所有方法,它允许所有元素的插入,包括 null。另外,ArrayList 和 Vector 除了线程不同步之外,大致相等。 二、属性 ArrayList 的属性非常少,就只有这些。其中最重要的莫过于 elementData ,ArrayList所有的方法都是建立在 elementData 之上 /** * 默认容量大小 */ private static final int DEFAULT_C

HTZW的博客 333

Java集合源码剖析——基于JDK1.8中ArrayList的实现原理

Java集合源码剖析——基于JDK1.8中ArrayList的实现原理

贝尔摩德苦艾酒 7584

java8:ArrayList与Vector的实现原理

1、ArrayList 创建时的大小为 0;当加入第一个元素时,进行第一次扩容时,默认容量大小为 10。2、ArrayList 每次扩容都以当前数组大小的 1.5 倍去扩容。3、Vector 创建时的默认大小为 10。4、Vector 每次扩容都以当前数组大小的 2 倍去扩容。当指定了 capacityIncrement 之后,每次扩容仅在原先基础上增加 capacityIncrement 个单位空间。

xuonline4196的博客 801

java arraylist底层实现原理_Java ArrayList底层实现原理源码详细分析Jdk8

简介ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。Ar...

weixin_39647773的博客 167

java8 ArrayList,Vector,Stack接口实现源码解析

一、类继承关系 二、接口功能概述 List接口表示一个有序的集合,也称为列表,调用方可以控制元素插入列表的位置,可以根据元素在列表中的位置随机访问某个元素,也可以搜索指定元素。List接口提供了一个特殊的迭代器ListIterator,该迭代器扩展自Iterator,增加了倒序遍历,添加元素,修改元素的方法。两者包含的方法如下: 参考用例如下: @Test ...

菜鸟进阶之路 348

大数据集合求交集_Java8 实现ArrayList求交集并集差集

本文借助Java8的Stream API完成ArrayList集合运算:求交集、并集和差集!public class CollectionUtil {/*** 判断为空*/public static boolean isEmpty(Collection> collection) {return (collection == null || collection.isEmpty());}/**...

weixin_39588911的博客 377

判断两个list是否有交集_Java8 实现ArrayList求交集并集差集

本文借助Java8的Stream API完成ArrayList集合运算:求交集、并集和差集!public class CollectionUtil {/*** 判断为空*/public static boolean isEmpty(Collection> collection) {return (collection == null || collection.isEmpty());}/**...

weixin_39927508的博客 2075
上一篇: Java8 LinkedList的底层实现
下一篇: Java8 String的底层实现
yadicoco49
博客等级 码龄10年 6粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值