java ArrayList源代码实现

简单实现arraylist 面试遇到的一个小的提问,回答的不是很好,自己回来又写了个 立即下载

java ArrayList(线性表)源代码实现:

总结:1.ArrayList类中内置了一个 elementData数组,进行增删改查命令时,对数组进行增删改查。

2.elementData数组容量capacity初始为10,每次容量不够时,容量扩大为2倍。

3.ArrayList对象序列化(实现Serialization接口)时,先序列化数组元素个数size,在遍历序列整个数组元素。反序列化时,先反序列化size,在遍历反序列化所有元素。

4.ArrayList在增删改查时,多次使用System.arraycopy(src,srcPos,dest,destPos,length)方法,功能是实现数组元素的复制。可以通过这个方法实现数组内部元素的复制。

5.sort()排序方法,调用了数组排序Array.sort(elementData)方法.

/*
	public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);  */

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
	private int size;
	transient Object[] elementData;
	//构造函数
	public ArrayList(Collection<? extends E> c) {
		elementData = c.toArray();
		if ((size = elementData.length) != 0) {
			// c.toArray might (incorrectly) not return Object[] (see 6260652)
			if (elementData.getClass() != Object[].class)
				elementData = Arrays.copyOf(elementData, size, Object[].class);
		} else {
			// replace with empty array.
			this.elementData = EMPTY_ELEMENTDATA;
		}
	}
	//把ArrayList列表的长度限制为size
	public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }
	//是否包含o
	public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
	//查看o的下标,没有使用迭代器
	public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }
	//查看o的最后一个下标
	public int lastIndexOf(Object o) {
        if (o == null) {
            for (int i = size-1; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = size-1; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }
	//克隆一个ArrayList
	public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }
	//拷贝一份elementData并返回
	public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
	//拷贝一份elementData到a中
	public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
	//得到第index个元素
	public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
	E elementData(int index) {
        return (E) elementData[index];
    }
	//更改值
	public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }
	//增添值
	public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
	//增添值
	public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }
	//删除值
	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;
    }
	//删除值,首先查找o
	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
    }
	//清空
	public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
    }
	//添加一个Collection
	public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityInternal(size + numNew);  // Increments modCount
        System.arraycopy(a, 0, elementData, size, numNew);
        size += numNew;
        return numNew != 0;
    }
	//删除元素
	protected void removeRange(int fromIndex, int toIndex) {
        modCount++;
        int numMoved = size - toIndex;
        System.arraycopy(elementData, toIndex, elementData, fromIndex,
                         numMoved);

        // clear to let GC do its work
        int newSize = size - (toIndex-fromIndex);
        for (int i = newSize; i < size; i++) {
            elementData[i] = null;
        }
        size = newSize;
    }
	//删除所有c中包含的数据
	public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, false);
    }
	//保留所有c中包含的数据
	public boolean retainAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, true);
    }
	private boolean batchRemove(Collection<?> c, boolean complement) {
        final Object[] elementData = this.elementData;
        int r = 0, w = 0;
        boolean modified = false;
        try {
            for (; r < size; r++)
                if (c.contains(elementData[r]) == complement)
                    elementData[w++] = elementData[r];
        } finally {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            if (r != size) {
                System.arraycopy(elementData, r,
                                 elementData, w,
                                 size - r);
                w += size - r;
            }
            if (w != size) {
                // clear to let GC do its work
                for (int i = w; i < size; i++)
                    elementData[i] = null;
                modCount += size - w;
                size = w;
                modified = true;
            }
        }
        return modified;
    }
	//对象序列化方法
	private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
        // Write out element count, and any hidden stuff
        int expectedModCount = modCount;
        s.defaultWriteObject();

        // 先序列化ArrayList的size
        s.writeInt(size);

        // 后序列化所有元素
        for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }

        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
	//反序列化
	private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        elementData = EMPTY_ELEMENTDATA;

        // Read in size, and any hidden stuff
        s.defaultReadObject();

        // 读取ArrayList的size
        s.readInt(); // ignored

        if (size > 0) {
            // be like clone(), allocate array based upon size not capacity
            ensureCapacityInternal(size);

            Object[] a = elementData;
            // Read in all elements in the proper order.
            for (int i=0; i<size; i++) {
                a[i] = s.readObject();
            }
        }
    }
	//得到迭代器对象
	public ListIterator<E> listIterator(int index) {
        if (index < 0 || index > size)
            throw new IndexOutOfBoundsException("Index: "+index);
        return new ListItr(index);
    }
	public ListIterator<E> listIterator() {
        return new ListItr(0);
    }
	public Iterator<E> iterator() {
        return new Itr();
    }
	//复写了forEach方法
	@Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
	
	@Override
    @SuppressWarnings("unchecked")
    public void replaceAll(UnaryOperator<E> operator) {
        Objects.requireNonNull(operator);
        final int expectedModCount = modCount;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            elementData[i] = operator.apply((E) elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }
	//排序方法,调用了Array.sort()方法
	@Override
    @SuppressWarnings("unchecked")
    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }
}


用java自己实现的arrayList 用java自己实现的arrayList,比较详细,有助于初学者理解arrayList的基本概念和基础用法 立即下载

相关推荐

基于紫光展锐平台的音频调用到hal层逻辑

基于紫光展锐平台的音频调用到hal层逻辑 1、数据流程图 AudioPolicyService和AudioFlinger的创建: 这两个服务都在audioserver中启动,文件路径: frameworks/av/media/audioserver/main_audioserver.cpp 从AudioFlinger和AudioPolicyService的创建,到output的打开,以及AudioFlinger开始往底层写入数据的具体流程如下图: #mermaid-svg-kjHL4XWwkQXN6NdA

weixin_55053963的博客 1355

【数据结构Java版】自定义ArrayList实现的完整代码

自定义ArrayLis实现的完整代码如下所示,其中包含用主函数测试,可以自行运行。

m0_63372226的博客 600

Win10系统VS2019+Cmake+qhull_8.0.0环境配置

1 qhull 1.1 简要介绍 qhull是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等。 1.2 依赖库 qhull不依赖其他库。 1.3 源码包下载 qhull源码地址:github:https://github.com/qhull/qhull.git 2 Cmake构建项目 2.1 路径 源代码路径:D:/ThirdParty/qhull/qhull_8.0.0构建项目路径:D:/Thi.

wangchenxue的博客 2490

java arraylist 函数_Java Extend ArrayList函数

让我说我有class Dummy {String a, b;public Dummy(String a, String b) {this.a = a;this.b = b;}public String toString(){return a+b;}public String getA() {return a;}public String getB() {return b;}}我想拥有List my...

weixin_39650745的博客 250

从ATE到ATPG:基于Scan Chain的芯片制造缺陷定位实战解析

本文深入解析了从ATE到ATPG的芯片制造缺陷定位实战技术,重点介绍了Scan Chain的工作原理、异步复位触发器处理技巧以及Design Compiler中的DFT实现方法。通过实际案例展示了如何利用ATE测试数据和ATPG工具进行精确的缺陷定位,并分享了提升测试覆盖率和优化测试成本的专业技巧,为芯片测试工程师提供了宝贵的实战经验。

weixin_42527160的博客 380

基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告

目录一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究目标与内容二、大模型技术原理与应用概述2.1 大模型的基本原理2.2 大模型在医疗领域的应用进展2.3 适用于肾结石预测的大模型选择与依据三、术前风险预测与准备3.1 患者身体状况评估3.2 结石情况分析3.3 术前准备方案制定四、术中风险预测与应对4.1 出血风险预测与处理4.2 脏器损伤风险预测与预防4.3 实时监测与决策支持五、术后恢复预测与护理5.1 恢复时间预测5.2 护理要点与措施5.3 并发症预防与处理六、并发症风险预测与管理

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1147

【JAVA集合篇】ArrayList源码详解

ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。在ArrayList集合里面可以存储任何类型的数据, 而且它是一个顺序容器,存放的数据顺序就是和我们放入的顺序是一致的,而且它还允许我们放入null元素。

初念初恋的博客 1730

基于八叉树的k近邻搜索

在八叉树中,每个节点都表示一个正方体的体积元素(体素),并且每个节点都有八个子节点(在不为空的情况下)。搜索最近邻点:一旦确定了查询点在八叉树中的位置,就可以开始搜索最近邻点了。搜索过程通常从查询点所在的叶节点开始,并逐步扩展到相邻的叶节点和父节点,直到找到k个最近邻点为止。k近邻搜索的目标是在给定的点云数据中,找到一个查询点的k个最近邻点。定位查询点:在搜索过程中,首先需要确定查询点在八叉树中的位置。返回结果:最后,搜索算法会返回找到的k个最近邻点的索引和它们与查询点之间的距离。

twnkie的博客 674

Java集合之ArrayList(含源码解析 超详细)

ArrayList的底层是数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。ArrayList继承于AbstructList,实现了List,RandomAccess,Cloneable,Java.io.Serializable这些接口。RandomAccess是一个标志接口,表明实现这个接口的List集合是支持快速随机访问的。

rc1596919047的博客 1585

【数据集】中国区域地面气象要素驱动数据集(CMFD)2.0

中国区域地面气象要素驱动数据集(CMFD)2.0

WW、forever的博客 2978

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

JDK17:Java ArrayList源码解读

JDK17:Java ArrayList源码解读。 ArrayList是List接口的实现类,底层基于数组实现,容量可根据需要动态增加,相当于动态数组。ArrayList继承于AbstractList,并且还实现了Cloneable、Serializable、RandomAccess接口。List:表明是列表数据结构,可以通过下标对元素进行添加删除或查找。Serializable:表示可以进行序列化和反序列化操作,可以把对象与字节流相互转换。

时代各有不同,青春一脉相承。 795

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1309

详解Java中的ArrayList源代码实现和特征,Object类

ArrayList源代码实现和特征,Object类 1. ArrayList可变长数组【重点】 1.1 需要完成的方法 使用到泛型 底层存储数据的数组对应数据类型为 Object类型 增 boolean add(E e); boolean add(int index, E e); 删 remove(Object obj); remove(int index); 改 E set(int ...

猪猪 594

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java源代码阅读——ArrayList实现原理

一  概述 public class ArrayList&lt;E&gt; extends AbstractList&lt;E&gt; implements List&lt;E&gt;, RandomAccess, Cloneable, java.io.Serializable 可见它实现List接口,其底层使用数组保存所有元素,其操作基本上是对数组的操作。 此实现不是同步的。如果多个线程...

xiaowang627的博客 551

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java编程题---List列表之底层实现ArrayList源代码(全)

package cn.tedu.collection.list; import java.util.Arrays; public class ListText { public static void main(String[] args) { } } //实现ArrayList class ListArray { //声明数组存储元素 String[] data; //定义一个变量代表数组下标/代表元素个数 int size = 0; //

张艳霞 299

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java SE 040 ArrayList源代码深入剖析

(1)一个人只要自己不放弃自己,整个世界也不会放弃你. (2)天生我才必有大用 (3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟. (4)做难事必有所得 (5)精神乃真正的刀锋 (6)战胜对手有两次,第一次在内心中. (7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~ Java SE 040 ArrayList源代码深入剖析 文章目录Java SE 040 ArrayList源代码深入剖析1.ArrayList2.ArrayList的实现方式 1.ArrayList .

青风百草 304

史上最详细的Java集合类ArrayList源代码逐行深入解读

(转载请附上链接:https://blog.youkuaiyun.com/brucexiajun/article/details/101209837) 前言:ArrayList是Java集合类中非常常见的一个类,而且比较基本,不会太难,源代码1500行左右,非常适合新手开始练习源代码的阅读能力。 本文将会尽可能详细的剖析ArrayList类的源代码,文章会陆续更新。 一 注释 我们先从注释开始 ...

brucexiajun的博客 617

手写ArrayList源代码

手写ArrayList源代码 我们为什么要使用集合collection,因为仅仅使用数组不能满足日常生活中的需求,数组固定数据类型的,不可变长度的,许多操作数组的方法需要我们自己写出来,很不利于编程使用,复用性很差。在集合中有很多种自带的方法,帮助我们完成数据的增删改查。 java中集合的总接口是Collection.java中所有和集合有关的内容,都是collection的接口或者子接口,或者实...

Lu_QQ的博客 299

ArrayList源代码分析

本源代码来自JDK1.8  与1.7、1.6 略有不同 1 ArrayList中的属性 1 初始容量 初始大小为10 /** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {};

惟愿无事 2460

java ArrayList排序

常常遇到数组排序的问题.比如我有一个Person类,它的实例对象存储在ArrayList数组中,现在要把ArrayList数组中的Person对象按照年龄排序.其实这种情况经常遇到.下面给出源代码:1:Person.java文件:-------------------------------public class Person{     String name;     int age;  pu

wiregate的专栏 1万+

Java容器ArrayList源代码解析

ArrayList是很常用的一个容器,它的底层是用动态数组实现的,可以根据数据量大小自动扩容。它支持很多操作,比如向容器中添加、删除、查找数据,返回容器的大小等等。

Kevin_zhai的博客 1057

Java中ArrayList的底层实现

List接口中的子类ArrayList底层实现是数组,因此本文我们通过阅读源代码,来自己实现ArraylList,以帮助更好的理解。 所有ArrayList中的方法,都可以归结为对数组的操作。 在对数组进行操作时,需要重点考虑数组越界以及数组扩容问题。Java中提供了arraycopy()很方便的实现了数组的扩容。 本文未能全部实现List中的所有接口,主要实现了以下方法: 构造方法 i...

zxjzxj1234的专栏 519

Java源代码走读--ArrayList

public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /**

为你撑伞的专栏 968

纯手写ArrayList集合

说明: 要想深度学习JavaSE基础知识,阅读源码是必不可少的事情,光看源码也许还不能真正的去理解记忆,去发现底层到底是如何实现的,为了加深自己的记忆就需要自己去手写实现。 底层源码新型Api.底层数组扩容技术System.arraycory(原数组,原数组开始位置,目标数组,目标数组开始位置,复制的长度) package org.robert.keyv8.hashmap; /** * @D...

qq_41342776的博客 331
上一篇: java nio的使用
下一篇: java Stack源代码实现
classify233
博客等级 码龄10年 3粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值