ArrayList源码分析与理解

深入解析Incapsula reese84的生成机制与绕过策略 本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。 阅读详情

java.util.ArrayList是最常用的集合类之一,阅读它的源码有助于帮助我们正确的使用它,并且学习它的思想。
在Java中,还有其他的一些集合类,它们的关系如下图
:集合
(图来源:Thinking in Java )
在源码中有一大段注释,介绍了ArrayList的相关信息,总结如下:

  1. 它是List接口的一种可变数组(Resizable-array)的实现
  2. 可以存放任何元素,包括null,可以保存重复的元素
  3. 非线程安全
  4. 可以用for-each遍历集合,但它是快速失效的。
1. ArrayList的类声明
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

RandomAccess, Cloneable, java.io.Serializable为标记接口
RandomAccess:表明其支持随机快速访问
Cloneable:标记其可以调用Object.clone()方法,并按字段复制。ArrayList重写了clone()方法。
Serializable:可以支持序列化。

2. ArrayList中的字段
    // 默认的初始化容量为10
    private static final int DEFAULT_CAPACITY = 10;
    // 空数组,当创建一个容量为0的ArrayList时
    private static final Object[] EMPTY_ELEMENTDATA = {};.
    //默认的空实例数组
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    //元素存储在此数组里,非私有是为了方便内部类访问,使用transient,该字段不会被序列化
    transient Object[] elementData; 
    //元素的实际数量
    private int size;
    //可存储最大容量
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

ArrayList声明了两个空数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA用于使用无参构造器,创建未指明初始容量的集合,另一个用于创建初始容量为0的空数组,这会影响到首次向集合添加元素时的扩容。

3. 创建一个ArrayList

3.1 创建一个默认大小的ArrayList

	//1.无参构造器
	public ArrayList() {
	        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
	    }
	//2.指定初始化容量的构造器
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        }
        //如果初始为0,则将数组初始化为 EMPTY_ELEMENTDATA 
        else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    //3. 根据给定的Collection集合创建
   	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,会初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个空数组,而不是创建一个容量为DEFAULT_CAPACITY的数组,当向ArrayList里添加第一个元素时,会进行扩容,扩容后容量为DEFAULT_CAPACITY,即为10。如果当前容量无法满足需求,会自动扩容。

    //添加铁元素的方法
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);
        elementData[size++] = e;
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {
        //如果为默认创建的空数组,添加一个元素,会初始化为DEFAULT_CAPACITY:10
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
    }
    //根据添加元素后所需的最小容量,判断是否需要扩容
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // 如果所需最小容量大于当前数组的容量,进行扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        //右移一位,即乘以1/2,扩容到原容量1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果扩容后的容量小于所需的最小容量,则将数组扩容为所需的最小容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //如果扩容后大于MAX_ARRAY_SIZE,调用hugeCapacity()可以扩容到Integer.MAX_VALUE
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //将原数组的内容复制到容量为扩容后大小:newCapacity的新数组中,其最终调用的是
        //System.arraycopy方法,这是一个native方法
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

3.2 通过Arrays.asList()方法创建
实际上,Arrays.asList(T…a)返回的并不是java.util.ArrayList,而是Arrays类中的一个静态内部类,它继承了AbstractList,所以它也是一个Collection,因此可以通过java.util.ArrayList的有参构造器public ArrayList(Collection<? extends E> c)创建。
通过Arrays.asList()创建的ArrayList是一个不可变长的数组,它没有重写基类AbstractList的add(Object o),remove(int index)等方法,调用这些方法会抛出UnsupportedOperationException。

4. ArrayList中的方法

ArrayList共有以下public方法
ArrayList的方法
ArrayList的方法
4.1 向集合中添加元素
共有4个添加元素的方法

//在集合最后添加一个元素
boolean add(E e)
//从一个元素添加到指定位置
void add(int index, E element)
//将另一个集合的元素添加到末尾
boolean addAll(Collection<? extends E> c)
//将另一个集合的元素从指定位置开始添加
boolean addAll(int index, Collection<? extends E> c)

boolean addAll(int index, Collection<? extends E> c)方法的源码如下:

public boolean addAll(int index, Collection<? extends E> c) {
		//边界检查,index应在[0,size]范围
        rangeCheckForAdd(index);
        //将集合转为数组,最终通过System.arraycopy实现
        Object[] a = c.toArray();
        int numNew = a.length;
        //确认所需容量
        ensureCapacityInternal(size + numNew);  
        //确定需要移动元素的数量
        int numMoved = size - index;
        //如果需要移动元素,就把原数组从index开始,复制numMoved个元素,保存到目标数组elementData中,将原数组index后的元素一次保存在目标数组的index + numNew后。
        if (numMoved > 0)
            System.arraycopy(elementData, index, elementData, index + numNew,
                             numMoved);
        //将新添加的全部元素依次放入elementData中index到index+numNew的位置上
        System.arraycopy(a, 0, elementData, index, numNew);
        size += numNew;
        return numNew != 0;
    }

4.2 清空集合

    public void clear() {
        modCount++;
        //引用指向null,交由gc负责回收
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
    }

4.3 扩容
当容量不足时,会调用内部的private ensureCapacityInternal方法自动完成扩容。我们也可以进行手动扩容。

 	//手动扩容
    public void ensureCapacity(int minCapacity) {
    //如果当前数组是默认空数组,则minExpand 设为10,用户指定的容量minCapacity>10,会按用户指定的容量扩容
    //如果当前数组不是默认空数组,即数组中有元素,或创建了容量为0的list,则用户指定的容量大于0才会执行后续语句。
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            ? 0: DEFAULT_CAPACITY;
        if (minCapacity > minExpand) {
    //在ensureExplicitCapacity还会进行检查,minCapacity大于当前保存元素数组的长度才会扩容
            ensureExplicitCapacity(minCapacity);
        }
    }

4.4 缩容
ArrayList的容量是大于等于其中保存元素的数量,可以把它的容量缩减到和保存的元素数量相同,以节省内存空间。尽量确保不再向其添加元素,避免缩容再扩容这种操作。

    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }

4.5 从集合中获取元素
ArrayList是基于数组实现的,可以通过索引直接取得该位置的元素,时间复杂度O(1),ArrayList在随机访问有较好的性能,但是在中插入或移除元素,需要进行元素的移动,所以性能较差。LinkedList是由双链表实现的容器,在其中插入或移除元素性能较好,随机访问性能较差。

    public E get(int index) {
        rangeCheck(index);
        return elementData(index);
    }

查找某个对象在集合中的位置

    public int indexOf(Object o) {
    	//ArrayList允许加入null,并且允许重复的元素,此方法会从前向后遍历,返回第一个该元素的索引,lastIndexOf会从后向前遍历,返回该元素出现的最后位置,
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
        //线性查找,根据equals方法判断是否为同一个对象
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

4.6 迭代器 iterator
ArrayList 实现了List接口,List继承Collection接口,collection继承了Iterable接口,实现Iterable接口的类都要实现一个能够返回迭代器对象Iterator的iterator();方法。Iterator接口有4个方法
Itertor
forEachRemaining 是jdk1.8中的新增方法,具有默认实现。
remove方法的默认实现会抛出UnsupportedOperationException(“remove”);。
hasNext():判断是否还有下一个元素。
next():返回下一个元素。
首先看ArrayList中对Iterable接口iterator()的实现,它返回了Itr对象,这是ArrayList的内部类,实现了Iterator接口。通过这个方法返回的迭代器是fail-fast快速失效的,并且它只能单向移动。ListIterator listIterator()返回一个双向移动的迭代器。

	public Iterator<E> iterator() {
        return new Itr();
    }

Itr的代码如下:

    private class Itr implements Iterator<E> {
        int cursor;       // 下一个待返回元素索引
        // 返回的最后的元素的索引,初始化为-1,可以理解为指向第一个元素之前
        int lastRet = -1; 
        int expectedModCount = modCount;//将预期修改计数初始化为modCount
        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
        //在获取下个元素是,会进行modCount==expectedModCount的检查,为false会抛出ConcurrentModificationException(),
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            //cursor后移
            cursor = i + 1;
            //返回元素
            return (E) elementData[lastRet = i];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();
            try {
            	//移除最新返回的元素,即最后调用next()之后的那个元素
                ArrayList.this.remove(lastRet);
                //索引lastRet位置的元素已被删除,后面的元素会依次前移,下一个待返回的索引是lastRet
                cursor = lastRet;
                //最新返回的元素已不存在,设为-1
                lastRet = -1;
                //删除会修改modCount,需要同步,避免迭代器失效
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

在ArrayList中,modCount属性用来实现fail-fast,当一个方法会对ArrayList的数组的容量进行改变,如trimToSize,ensureExplicitCapacity,或使存储结构发生改变,如add,remove,clear,modCount都会自增,替换操作set方法没有改变结构,所以modCount不会改变。
在for-each语句中,做出会修改modCount的操作,迭代器会失效,抛出ConcurrentModificationException()。

阅读完源码之后,应该知道在什么情况下使用ArrayList集合,在什么情况下使用其他集合,记忆如何正确的使用其中的方法。

新手必看!一步步教您如何获取可用的D音Cookie(为什么我复制的D音Cookie无法正常使用?) 新手必看!一步步教您如何获取可用的抖音Cookie(为什么我复制的抖音Cookie无法正常使用,无法下载无水印视频?) 阅读详情

相关推荐

powerdesigner导出sql将name放到comment注释上

【代码】powerdesigner导出sql将name放到comment注释上。

weixin_45947759的博客 1352

Java基础知识2:集合扩容机制(1)

1. ArrayList源码&扩容机制分析 2. HashMap源码&底层数据结构分析 3. ConcurrentHashMap源码&底层数据结构分析

须臾徐的博客 740

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3320

Java高全级别灰色_Java 集合深入理解(7):ArrayList

什么是 ArrayListArrayList 是 Java 集合框架中List接口的一个实现类。可以说 ArrayList 是我们使用最多的 List 集合,它有以下特点:容量不固定,想放多少放多少(当然有最大阈值,但一般达不到)有序的(元素输出顺序与输入顺序一致)元素可以为 null效率高size(), isEmpty(), get(), set() iterator(), ListIte...

weixin_33303595的博客 224

MySQL表名大小写敏感问题终极解决:lower_case_table_names=1不生效的3个隐藏坑

本文深入剖析了MySQL表名大小写敏感问题中,设置lower_case_table_names=1参数不生效的三个核心原因。关键在于理解该参数只能在数据库初始化前设置,并需排查配置文件优先级与正确停止服务的顺序。文章提供了从Windows迁移到Linux的完整避坑指南与验证方法,帮助DBA和开发者彻底解决这一跨平台兼容性难题。

weixin_29229055的博客 392

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

java继承原理内存角度_Java基础知识巩固

最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习。其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Java这块的基础还是重中之重,可以多去学习一下Java各种类和数据结构的写法,进行学习!基础正确使用 equals 方法尽量使用 "字符串".equals(变量)方法,推荐使用java.util.Obj...

weixin_30424461的博客 216

MySQL安装配置教程(超级详细)

一、 下载MySQL Mysql官网下载地址:MySQL :: Download MySQL Installer (Archived Versions) 1. 选择要安装的版本,本篇文章选择的是5.7.31版本,点击Download下载 正在上传…重新上传取消 二、 安装MySQL 1. 选择设置类型双击运行mysql-installer-community-5.7.31.0.msi 这里选择是自定义安装,所以直接选择“Custom”,点击“Next” “Developer Default”是

m0_67322837的博客 5万+

ArrayList源码学习-常用方法

1、ArrayLis的几个申明 ArrayLis初始化容量为10 private static final int DEFAULT_CAPACITY = 10; 空的数组实例 private static final Object[] EMPTY_ELEMENTDATA = {}; 也是一个空的数组实例,与EMPTY_ELEMENTDATA不同的是DEFAULTCA...

xuewenyong的博客 260

Palantir 凭什么两年涨 20 倍?深度解析解决 AI 幻觉的 “本体论“ 核心原理

本文深度解析了Palantir本体(Ontology)的核心原理及其在企业AI应用中的革命性价值。本体通过构建结构化的语义层与动态执行层,将企业分散的数字资产(数据集、虚拟表、模型)映射为现实世界的数字孪生,使大模型能够在**严格的业务规则与数据边界内**进行推理与决策,从而从架构层面彻底解决AI幻觉问题。这一技术架构不仅帮助Palantir实现股价两年增长20倍、市值突破4000亿美金的商业成功,更成为SAP、Salesforce等ERP巨头争相模仿的下一代企业智能标准范式。通过航空业飞机故障应急处理等实

program哲学 227

UG\NX二次开发 一个创建小平面体的例子

介绍。

王牌飞行员_里海的博客 445

【ArrayList】——java.util.ArrayList源码分析

一、ArrayList类 这里分析jdk 1.8,包含一些1.8新特性的源码 继承树如下: 宏观上说,ArrayList是基于动态数组实现的,数组具有按索引查找的特性,所以访问很快,适合经常查询的数据。 public class ArrayList<E> extends AbstractList<E> implements List<...

我爱吃土豆 9378

6、高通8155座舱平台--摄像头系统

在项目中遇到过,很多从手机转过来的工程师,上来就按手机那套调Camera,结果发现根本跑不通——为什么?我踩过这个坑——一开始想靠软件打时间戳来对齐,结果发现两个sensor的曝光时间不一样,时间戳根本对不上。我记得第一次调AWB时,怎么调颜色都不对,后来发现是BLC的参数没配好——黑电平偏了,后面所有颜色校正都是错的。上层应用说「我要拍张照」,HAL把它翻译成「ISP你给我处理这帧数据,sensor你给我曝光一次」。8155上推荐用camx,它是高通新一代的Camera框架,性能更好,而且支持多路同步。

woailuojp的博客 59

一篇文章让你理解ArrayList:ArrayList源码分析

ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。

qq_53438100的博客 933

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入理解 ArrayList 及底层源码分析

1、什么是 ArrayList可以简单的认为是一个动态数组;实际上 ArrayList 就是用数组实现的,长度不够时,调用 Arrays.copyOf 方法,拷贝当前数组到一个新的长度更大的数组;ArrayList 是可调整大小的数组,实现了 List 接口。实现所有可选列表操作,并允许所有元素包括 null。除了实现 List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。(这个类是大致相当于 Vector,不同之处在于它是不同步的)。

好好学java 1856

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ArrayList 源码分析:深入理解其底层实现

在这篇博客中,我们将对 ArrayList 的源码进行深入剖析。这对于理解 ArrayList 的工作原理、优化使用以及应对相关面试问题都有着重要意义。

m0_57836225的博客 1053

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JDK源码分析--ArrayList深入理解

一、实现原理 以JDK1.8.0_74源码为基础进行分析。 1、基于数组的实现,是一个容量能自动增长的动态数组。 2、ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。 3、随着向ArrayList中不断添加元素,其容量...

WolfShadow的博客 1万+

一篇文章带你理解ArrayList扩容——源码分析

原文链接:https://zeroclian.github.io/posts/c352a0f3.html ArrayList源码分析 总所周知,ArrayList的数据结构是基于数组实现,其底层是一个Object数组列表,与我们普通定义的数组不同,它具有动态扩容、数据拷贝等操作。 接下来从初始化、插入、删除等源码来分析ArrayList是如何具体实现这些操作的 初始化 //默认容量 private static final int DEFAULT_CAPACITY = 10; private stat.

零栀 235

深入理解 Java ArrayList 扩缩容机制(含源码分析)

会导致扩容操作更频繁,虽然单次复制的元素相对较少,但总体的调用次数增多,时间开销增大。可以减少扩容次数,但可能导致容量长期远大于实际size,造成更大的内存空间浪费。1.5 倍被认为是在扩容频率(时间成本)和空间利用率之间的一个比较好的折中点。ArrayList使用动态数组实现,通过扩容机制来支持动态添加元素。扩容通常在add()addAll()等操作导致容量不足时触发。核心扩容逻辑在grow()方法中,策略是增长为原容量的 1.5 倍扩容的主要成本在于,需要创建新数组并。

weixin_52568491的博客 1542

arraylist下标从几开始_深入理解 ArrayList 及底层源码分析

ArrayList 可能是 Java 数据结构中最简单的一种了,即使一个非 Java 程序员可能也知道这个数据结构,因为所有的语言中都有这样的类似的数据结构。但是在面试中很多人又对它又爱又恨,你真的了解 ArrayList 吗?一、ArrayList 介绍及其源码剖析1、什么是 ArrayList 可以简单的认为是一个动态数组;实际上 ArrayList 就是用数组实现的...

weixin_39828847的博客 305

源码分析-----ArrayList初始化为10的理解

看过很多文章,都说ArrayList初始大小为10.但是看了源码发现构造方法中并不是这么回事,令我产生了怀疑。我一直坚信计算机是门科学,是有科学依据的。下面是我对ArrayList的源码收获。 首先看下两个初始化构造方法 public ArrayList(int initialCapacity) { if (initialCapacity &gt; 0) { ...

qq314499182的博客 1077

arraylist扩容是创建新数组吗 java_深入理解 ArrayList 及底层源码分析

ArrayList 可能是 Java 数据结构中最简单的一种了,即使一个非 Java 程序员可能也知道这个数据结构,因为所有的语言中都有这样的类似的数据结构。但是在面试中很多人又对它又爱又恨,你真的了解 ArrayList 吗?一、ArrayList 介绍及其源码剖析1、什么是 ArrayList 可以简单的认为是一个动态数组;实际上 ArrayList 就是用数组实现的...

weixin_34442215的博客 161

ArrayList源码分析(JDK1.8 个人理解)

ArrayList 源码手记 ​ 从大学到现在ArrayList源码看了忘忘了看,今天有空记录下自己看的东西以加深印象。下面开始按照自己的想法开始分析ArrayList源码。 ​ 1、先记录下ArrayList的类继承关系图 ​ 2、下面记录下ArrayList所实现接口中的三个标签接口,大部分人只熟悉第一个标签接口 //先看下ArrayList的定义形式,实现了四个接口,其中后三个为标签...

fh667788123的博客 471

集合之ArrayList的底层扩容机制源码分析(详细理解)

集合之ArrayList的底层扩容机制源码分析(详细理解) 1.在进入源码前需要了解到的结论 (1)ArrayList中维护了一个Object类型的数组elementData(transient Object[]Data),其中的transient修饰符表示该属性不能被序列化。 (2)当创建ArrayList对象时,使用的是无参构造,则初始elementData容量为0,第一次加入数据元素后,则扩容element容量为 10,如果需要再次扩容,则扩容elementData容量的1.5倍 (3)如果使用

qq_45868911的博客 472

Java ArrayList源码分析(有助于理解数据结构)

arraylist源码分析 1.数组介绍 数组是数据结构中很基本的结构,很多编程语言都内置数组,类似于数据结构中的线性表 在java中当创建数组时会在内存中划分出一块连续的内存,然后当有数据进入的时候会将数据按顺序的存储在这块连续的内存中。当需要读取数组中的数据时,需要提供数组中的索引,然后数组根据索引将内 存中的数据取出来,返回给读取程序。在Java中并不是所有的数据都能存储到...

ayuo44400001的博客 156

深入理解ArrayList与LinkedList,源码分析与性能测试

剧透:ArrayList的插入操作与查询操作都比LinkedList快很多 ArrayList 特点 底层使用数组实现,查询速度快,增删改速度慢(理论上) 线程不安全 ArrayList常用方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author 张宝旭 */ public class ArrayListTest { public static voi..

她的坏机器人 314
上一篇: 单链表反转
peng月月
博客等级 码龄9年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值