`

arraylist底层实现

阅读更多

ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
    每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
    注意,此实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。
对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作。
ArrayList提供了三种方式的构造器,可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的。
ArrayList提供了set(int index, E element)、add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)这些添加元素的方法
ArrayList提供了根据下标或者指定对象两种方式的删除功能。 注意:从数组中移除元素的操作,也会导致被移除的元素以后的所有元素的向左移动一个位置。
从上述代码中可以看出,数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。或者根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。
ArrayList还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。它可以通过trimToSize方法来实现。
ArrayList也采用了快速失败的机制,通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。

 

分享到:
评论

相关推荐

    模拟arraylist底层实现

    模拟ArrayList底层实现 在Java中,ArrayList是一种常用的集合类,提供了许多实用的方法来操作集合数据,而本文则尝试模拟ArrayList的底层实现,通过自定义集合实现类MyArrayList,来实现基本的集合操作。 模拟...

    1.MyArrayList(ArrayList底层实现).md

    ArrayList. 底层用数组实现, 自己编写的MyArrayList,初始长度10,扩容2倍.

    Java ArrayList的底层实现方法

    Java ArrayList 的底层实现方法 Java ArrayList 是 Java 语言中最常用的集合类之一,了解它的底层实现方法可以帮助开发者更好地理解和使用它。下面是 Java ArrayList 的底层实现方法的详细解释。 构造方法 在 ...

    源码解析jdk7.0集合:ArrayList的底层实现原理.pdf

    在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...

    对ArrayList和LinkedList底层实现原理详解

    ArrayList和LinkedList底层实现原理详解 ArrayList 底层实现方式的知识点: 1. ArrayList 底层实现方式:ArrayList 通过数组实现,一旦我们实例化 ArrayList 无参数构造函数默认为数组初始化长度为 10。 2. add ...

    Java中的ArrayList的底层源码解读、LinkedList、Vector的区别介绍

    适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...

    ArrayList的实现原理

    - **底层结构**:ArrayList内部使用`Object[]`数组作为基本数据结构,存储所有的元素。 - **构造方法**: - 默认构造函数初始化容量为10。 - 带参数构造函数允许指定初始容量。 - 还有一个构造函数接受一个...

    ArrayList底层.pdf

    从文件标题"ArrayList底层.pdf"以及描述中提到的“笔记很乱”,可以推测这份文档主要关注于`ArrayList`的具体内部实现细节。 ### 一、`ArrayList`的类结构与继承关系 `ArrayList`是一个动态数组的实现,其主要功能...

    深入Java集合学习系列:ArrayList的实现原理

    《深入Java集合学习系列:ArrayList的实现原理》 在Java编程中,ArrayList是集合框架中一个重要的类,属于List接口的实现,它提供了动态数组的功能,允许我们在集合中存储、添加、删除元素,并且可以按索引访问。这...

    ArrayList底层原理

    ArrayList是Java编程语言中常用的集合类之一,它实现了List接口,并且其底层数据结构基于数组。ArrayList的主要特点是允许用户按索引访问元素,且提供了动态扩容的能力。在深入理解ArrayList的底层原理之前,我们先...

    ii0#book-3#ArrayList 、 LinkedList 、 Vector 的底层实现和区别1

    Java基础之集合List-ArrayList、LinkedList、Vector的底层实现和区别ArrayList底层实际是采用数组实现的(并且该数组的类型是

    ArrayList集合底层原理.pdf

    ArrayList的底层实现是基于数组的,其核心字段是一个类型为transient的Object数组elementData,这个数组用来存放集合中的元素。由于数组是固定大小的数据结构,所以ArrayList通过在必要时对数组进行扩容来支持动态...

    ArrayList的底层原理Java系列2021.pdf

    ArrayList提供了多种方法来进行数据的增加、删除、修改和查找,而这些方法的底层实现都依赖于数组的相应操作。由于数组的大小是固定的,所以当ArrayList的大小超过当前数组容量时,它会创建一个新的数组,并将旧数组...

    java中容器类ArrayList(底层数组实现)和数组存取效率简单测试

    ArrayList是Java集合框架中的一种重要容器,它以数组为基础实现,提供了动态数组的功能。本篇文章将深入探讨ArrayList的工作原理,以及它与普通数组在存取效率上的差异。 ArrayList的核心是内部的数组对象,它在...

    ArrayList的一个C++类模板实现

    不过,根据标题和描述,这里我们讨论的是一个用C++实现的ArrayList类模板,它采用了双层散列技术来提高性能。这个实现旨在提供高效的数据存储和操作,特别是在处理大量数据时。 首先,让我们深入了解ArrayList的...

    收集的电子书 Java SE Lesson 5

    5. ArrayList底层实现:ArrayList是基于动态数组实现的集合类,在初始化时可以不指定容量,会默认创建一个长度为10的Object数组。当数组容量不足以容纳更多元素时,ArrayList会创建一个新的数组,长度为原来的1.5...

    我的ArrayList实现

    首先,ArrayList的底层数据结构是基于数组(Object[] elementData)的,这决定了它具有随机访问速度快、插入和删除效率相对较低的特点。数组是一种线性数据结构,通过索引可以快速定位到元素,因此ArrayList支持O(1)...

    聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    在 Java 语言中,ArrayList 是一个非常常用的集合类,它的底层实现是一个动态扩容的数组。当我们向 ArrayList 中添加元素时,如果数组的容量不足以容纳所添加的元素,那么 ArrayList 就会扩容以容纳新的元素。在 JDK...

Global site tag (gtag.js) - Google Analytics