讲讲ArrayList

HID设备开发避坑指南:如何利用Windows内置驱动快速实现USB键盘模拟 本文详细解析了HID设备开发中的免驱方案与USB键盘模拟技术,重点介绍了HID协议的核心优势、开发基础架构及Windows平台的实现方法。通过实战案例和代码示例,帮助开发者快速掌握USB键盘模拟技术,避免常见开发陷阱,提升设备兼容性和性能。 阅读详情

在之前《Java中的Collection》文章中简单粗略的介绍了Java中Collection前世今生及常用的Collection,这篇文章我们就单独聊聊ArrayList—一个Java开发者开发过程中绕不开的数据结构。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

通过这个可以查看到ArrayList继承了AbstractList并实现List、RandomAccess、Cloneable,Serializable等接口;通过这些接口我们大概知道了ArrayList拥有的基本的特性:
1. 必须保持元素特定的顺序(是一个List)
2. 支持快速(通常是固定时间)随机访问(RandomAccess)
3. 支持对象clone,是浅复制还是深复制,看是如何实现clone()方法(Cloneable)
4. 支持对象序列化(Serializable)

他是List

既然他是List,那么他就应该拥有List的一切特性—add/remove/iterator。
我们先看看ArrayList的构造

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

通过以上代码我们可以发现,当构造一个ArrayList对象时创建了一个initialCapacity大小的数组—一个elementData成员变量。通过这个构造方法我们不会得到太多的信息,我们只知道ArrayList创建了一个指定大小的数组。

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

上面就是List特性之一的add方法,他返回的结果永远都是true,另外执行了ensureCapacityInternal方法接着将e对象塞入elementData数组中。我们知道数组的大小不可变的,但是ArrayList不断的add对象进来,迟早会把elementData数组撑爆的,所以按照这个园里来推算,ArrayList是一个可变的”数组”,那么ensureCapacityInternal方法中应该进行了两个操作:
1. 判断elementData当前的容量是否足够
2. 按照扩容后大小迁移elementData中的数据

那么他是如何进行这些操作呢?看看下面的grow方法

    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:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

从这个方法可以看出elementData新容量永远比老容量要高出1.5倍,扩容后进行copy操作创建新elementData,在这过程中JVM将elementData中的元素进行复制迁移到新的elementData中。

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

grow是一个扩容、复制迁移数组的方法,那么ensureExplicitCapacity方法就是条件—判断是否需要执行grow方法。从条件判断语句我们可以清楚的看出,只要elementData.length比当前要求的最小容量大就足以跳过grow了,这个条件告诉我们设置按业务所需设置elementData的初始大小是非常重要,他可以间接的减少grow方法执行次数—例如你有一个数据流以20的倍数下发,这时候可以使用以20*0.75作为elementData的初始大小(具体根据业务情况而定)。

下面我们看看他的remove方法。

 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;
    }

首先对index进行范围界定,该方法(rangeCheck)会抛出IndexOutOfBoundsException异常,然后通过elementData方法取出index位置上的对象。

 E elementData(int index) {
        return (E) elementData[index];
    }

这是简单不能再简单的取值方法了,所以remove前必须保证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

从以上代码我们可以大概知道他有以下意图:
1. 重组elementData数组(将index对应的value移除)
2. 将重组后的elementData最后一个元素设置为null

例如elementData中有5个元素,remove的index是3,所以numMoved为1,接着代码看就是显示为:

System.arraycopy(elementData, 4, elementData, 3, 1);

意思就是elementData从第4个位置(含)开始移动到elementData第三个位置,有效位置为1。通过 这样的一个copy操作就把需要移除的index对应的elementData元素给移除了(被以前第4个位置的元素替代了),但是我们发现elementData大小没变,并且新的elementData数组第3个元素和第4个元素是一样的,故需要将多余的重复的预算置为null。如下

   elementData[--size] = null; // clear to let GC do its work

ArrayList迭代器

   /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;
        public boolean hasNext() {
            return cursor != size;
        }
        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();
            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }
        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

上面就是ArrayList实现Iterator接口实现的next、forEachRemaining等特性。这篇文章我们也主要针对next方法进行探讨。

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

从上面next方法可以看出,诸多index的if判断语句并且这些判断语句都有抛出异常的可能,这对于应用或者系统来说这是致命的。因此在执行迭代器操作的过程中一定要保证elementData 数组的数据完整性(禁忌对elementData 数组进行增删改操作)[此处在应用的过程中出现的问题比较多]。那如何避免呢?
1. 在创建迭代器后,使用迭代器内部的增删改方法。
2.  使用Collections.synchronizedList 方法将该列表“包装”起来,达到同步效果。
3. 创建的ArrayList创建一个副本,clone出一个副本。

支持快速随机访问

我们可以打开RandomAccess这个接口发现,发现他是一个空接口,那么他有什么用呢?
答案是他肯定有用的,不然Java不会设计这么个接口,他一般给一些Collections工具提供了判断依据,例如Collections的shuffle方法。

   public static void shuffle(List<?> list, Random rnd) {
        int size = list.size();
        if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
            for (int i=size; i>1; i--)
                swap(list, i-1, rnd.nextInt(i));
        } else {
            Object arr[] = list.toArray();

            // Shuffle array
            for (int i=size; i>1; i--)
                swap(arr, i-1, rnd.nextInt(i));

            // Dump array back into list
            // instead of using a raw type here, it's possible to capture
            // the wildcard but it will require a call to a supplementary
            // private method
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
    }

可以看出,当你实现了RandomAccess时,他会调用另外一套代码块而达到区分。同理copy方法也是同样的道理。

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
        int srcSize = src.size();
        if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");

        if (srcSize < COPY_THRESHOLD ||
            (src instanceof RandomAccess && dest instanceof RandomAccess)) {
            for (int i=0; i<srcSize; i++)
                dest.set(i, src.get(i));
        } else {
            ListIterator<? super T> di=dest.listIterator();
            ListIterator<? extends T> si=src.listIterator();
            for (int i=0; i<srcSize; i++) {
                di.next();
                di.set(si.next());
            }
        }
    }

另外我们可以发现ArrayList的兄弟类LinkedList没有实现RandomAccess,一个实现了一个没实现,在算法上使用肯定有区别的,具体我们在以后的文章细说。

支持对象clone

clone方法是Object的方法,我们都知道一切皆是对象,那么世界万物都是Object的子类,所以clone方法也就被传下来的了。那么仅仅重写clone()方法就可以达到复制效果么?

答案肯定是错误的。我们知道clone()是伴有CloneNotSupportedException异常的—Object的clone()方法是一个native方法,当你调用它的clone的方法,发现这个对象时不支持clone就会抛出异常,详细后面的文章细讲。

    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);
        }
    }

从上面代码可以看出,ArrayList的clone是一种浅拷贝,关于对象的拷贝方式(浅拷贝、深拷贝),在后面的文章细讲

对象序列化

这个话题比较大,可以单独用一篇文章讲解,这里我就简单说明下—看看ArrayList如何实现的。

一个对象序列化(serialize)肯定必然出现反序列化(deserialize),他们所对应的方法writeObject和readObject。

   private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
        // Write out element count, and any hidden stuff
        int expectedModCount = modCount;
        s.defaultWriteObject();
        // Write out size as capacity for behavioural compatibility with clone()
        s.writeInt(size);
        // Write out all elements in the proper order.
        for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

上面是序列化方法,也就是Object to byte[]的过程,我们可以看出,他是先将size写入,然后依次转换数组中的各个Object。

   private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        elementData = EMPTY_ELEMENTDATA;
        // Read in size, and any hidden stuff
        s.defaultReadObject();
        // Read in capacity
        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();
            }
        }
    }

上面是反序列化的方法,首先可以看出发序列化先确定size,然后通过size确定当前size的大小,然后再反序列化各个Object。并且谁先write ,就先read谁,write的什么样的类型,read的也就是什么样的类型。关于序列化,我们在后面的文章详细讲到。

从上面的代码中我们可以看出,在序列化的过程中,如果执行了elementData 数组的数据完整
性的操作,将会抛出异常,这和在迭代的过程中,不能进行操作是一致的。执行完序列化后,再进行增删改操作,接着反序列化,中途的操作将会被反序列化操作所覆盖。

CXL协议-第三章 CXL事务层 CXL.io为I/O设备提供了一个非一致的负载/存储接口。图3-1显示了Flex总线分层层次结构中的位置。事务类型、事务分组格式、基于信用的流量控制、虚拟通道管理和事务排序规则遵循PCIe*定义,详情请参考PCIe基础规范的“事务层规范”章节。本章重点介绍了用于CXL.io的著名的PCIe操作模式或特性。 阅读详情

相关推荐

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 377

List集合之ArrayList(三)ArrayList总结

Iterator迭代器代码练习 import java.util.ArrayList; import java.util.Iterator; public class ArrayListIteratorTest { public static void main(String[] args) { /** ArrayList集合对象的Iterator迭代器对象的基本用法 */ ArrayList list = new ArrayList(); list.add(1); list.add(2); list

m0_70274796的博客 499

营销反作弊之 异常行为分析模型(一),附带python代码

通过对用户行为进行深入的分析,识别出与常规模式不符的异常行为,可以有效检测并阻止虚假广告点击、刷单、点击欺诈等欺诈行为。本文将详细探讨营销反欺诈中异常行为分析的方法,介绍如何通过数据采集、清洗、行为建模与异常检测,准确识别潜在的欺诈行为,并提供 Python 实现代码示例。**监督学习 (Supervised Learning):**在标注数据的帮助下,训练机器学习模型使其能预测未知数据的结果。营销反欺诈异常行为分析的整体流程涉及多个环节,确保通过对用户行为的深入分析,及时识别潜在的欺诈行为。

viviwiky的博客 1231

ArrayList的使用详解

ArrayList的使用场景

2201_75452232的博客 2065

3个国产AI大模型实战:如何用DeepSeek+豆包+千问批量生成高质量测试用例(附完整代码)

本文详细介绍了如何利用DeepSeek、豆包和千问三大国产AI大模型批量生成高质量测试用例的实战方法。通过Python环境配置、多模型SDK安装和统一接口封装,实现高效测试用例生成,并结合结构化提示词设计和多模型结果对比分析,显著提升测试效率和覆盖率。

weixin_29197699的博客 713

【智能体】零代码实战:Coze多智能体协作开发全流程解析

本文详细解析了Coze平台的多智能体协作开发全流程,从入门指南到实战技巧,帮助用户零代码构建高效AI团队。通过模块化设计和专业分工,多智能体系统能显著提升任务处理速度和准确率,适用于客服、内容创作、教育培训等多个场景。文章还提供了性能优化和常见问题解决方案,助力开发者快速掌握Multi-Agent技术。

weixin_29239279的博客 336

forEach()与forEachRemaining()区别

Iterator的实现为集合的一个内部类,对于不同的集合其内部数据结构不同,但Iterator的效果是类似的,都可以实现迭代,以ArrayList为例: ArrayList其内部数据结构为数组,而ArrayList的Iterator则维护两个指针(指向下标): 1、cursor指向下一个元素; 2、lastRet指向最后一个元素,没有则为-1 hasNext 方法返回 cursor...

renhq 9710

在 Windows 10 中通过 WSL2 安装 vLLM 部署本地大模型的方法和步骤

通过 WSL2 在 Windows 10 中部署 vLLM 的核心优势是兼顾 Windows 生态与 Linux 环境的 GPU 加速能力,适合需要在 Windows 下开发但依赖 vLLM 高性能推理的场景。相比原生 Windows 部署(Ollama 等工具),该方案性能更优(接近原生 Ubuntu),且支持更大模型和量化优化。若追求极致性能,建议直接使用 Ubuntu 系统;若必须依赖 Windows 工具链,WSL2 + vLLM 是当前最优选择。

当 AI 开始写文章、绘星空,甚至预测未来,您还在旁观吗?这里将剖开人工智能的思考逻辑,拆解 AI 创作的底层密码,也聊聊人工智能里的人文温度。每篇都有让你拍案的细节,快来解锁 AI 时代的神奇世界! 3756

ArrayList循环删除元素的方法总结

一、遍历List集合的三种方式 JAVA中循环遍历list有三种方式:for循环、增强for循环(即foreach循环)、iterator遍历。 普通的for循环 foreach循环(增强的for循环) 迭代器Iterator 二、循环删除元素问题及比较分析 创建ArrayList: List&lt;String&gt; list = new ArrayList&lt;String&g...

qq_29545781的博客 6752

OpenCV-Python图形图像处理:自用的一些工具函数源代码

本文为《OpenCV-Python图形图像处理:博主自用的一些工具函数功能及调用语法介绍》内容配套函数的源代码。

老猿Python 2495

逻辑回归:利用Python实现二分类算法

通过使用Python编写的代码,我们可以训练逻辑回归模型并进行预测。接下来,我们将实现逻辑回归算法的训练函数。训练函数将接受训练数据集X和对应的标签y,以及学习率alpha和迭代次数num_iterations。训练完成后,我们可以使用训练得到的参数theta来进行预测。在这个例子中,我们有一个包含4个样本的训练数据集X,每个样本有两个特征。在这个例子中,如果预测概率大于等于0.5,则预测为类别1,否则预测为类别0。现在,我们可以使用训练函数来训练模型。根据给定的样本x_new,预测函数将返回相应的类别。

XlltEditor的博客 326

ArrayList 详解

ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。 成员变量 ArrayList 底层是基于数组来实现容量大小动态变化的。 /** * The size of the ArrayList (the number of element

Harbour_zhang的博客 2万+

YOLOv13有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv13改进专栏重磅更新》推出500+创新改进方案,涵盖卷积、主干网络、注意力机制、检测头等核心模块优化。专栏提供完整项目代码及答疑服务,包含YOLOv13网络结构解析、环境配置、模型训练全流程指导。内容分为八大模块:卷积优化、注意力机制、细节涨点、主干网络改进、特征融合、检测头优化、小目标检测及Mamba联合改进等,支持多种创新点组合应用,助力科研论文发表。现开放限时订阅,提供试读章节和详细技术解析。

Ai缝合怪、助力小伙伴高效发论文 3399

讲讲数组、List和ArrayList、LinkedList 的区别

一直以来,我对集合这些东西只是会用,但是不知道为什么这么用,终于在工作中发现了问题,然后深入研究了一下。 问题来源:List&lt;QueryScriptManageEntity&gt; list = new ArrayList&lt;&gt;(); 本来我想用的是 List&lt;QueryScriptManageEntity&gt; list = new List&lt;&gt;() ...

怕秃头的潘s的博客 300

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

以纯文字的形式讲讲ArrayList 与 LinkedList 的区别

在 Java 编程中,ArrayList 和 LinkedList 都是常用的集合类,它们都实现了 List 接口,但在内部结构、性能特点、适用场景等方面存在着诸多差异。深入理解它们的区别,有助于我们在实际开发中根据具体需求选择合适的集合类型,从而提高程序的效率和可维护性。ArrayList 是基于动态数组实现的。它在底层使用一个数组来存储元素。当向 ArrayList 中添加元素时,它会将元素存储到数组的末尾。如果数组的空间不足以容纳新的元素,ArrayList 会自动扩容,即创建一个新的更大的数组,并将

helloworld工程师的博客 956

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java集合类 arraylist_讲讲java集合类中ArrayList的用法

声明:内容部分来自博客园盆古博客内容。刚刚学了一下java中ArrayList的简单用法。ArrayList类在Java.util包中。是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征。可以随时从链表中添加或删除一个元素。ArrayList实现了List接口。数组是静态的,数组被初始化之后,数组长度就不能再改变了。ArrayList是可以动态改变大小的。那么,什么...

weixin_42298068的博客 186

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

简单讲讲ArrayList 和Vetor的区别有哪些

ArrayList 和Vetor的区别有哪些 这两个类都实现了List接口(list接口继承了Collection接口),它们都是有序集合,即储存在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的问题与HashSet 没有任何关系,但是为了说清楚ArrayList和Vector的功能,我们使用对比方式,

weixin_45712075的博客 275

让面试官喝碗鸡汤,给他讲讲ArrayList和LinkedList的区别

⭐️引言⭐️ 大家好啊,我是执梗。ArrayList和LinkedList作为我们Java中最常使用的集合类,很多人在被问到他们的区别时,憋了半天仅仅冒出一句:一个是数组一个是链表。这样的回答简直让面试官当场吐血。为了和兄弟们一起打好基础,我们通过实际的使用测试,来好好说一下ArrayList和LinkedList的区别这道经典的面试题。 ????博客首页:执梗的博客 ????欢迎关注????点赞????收藏⭐️留言???? ❤️ :热爱Java学习,期待一起交流! ????作者水

执梗的博客 6663

讲讲java集合类中ArrayList的用法

声明:内容部分来自博客园盆古博客内容。 刚刚学了一下java中ArrayList的简单用法。 具体源码见https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html ArrayList类在Java.util包中。是...

weixin_30808575的博客 142

[JAVA] 请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?

Array和ArrayList的不同点: Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。 Array大小是固定的,ArrayList的大小是动态变化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方...

疯 2092

2024年最新让面试官喝碗鸡汤,给他讲讲ArrayList和LinkedList的区别,2024年大厂程序员进阶宝典

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取56452814)]

2401_84103844的博客 481

2024年最新让面试官喝碗鸡汤,给他讲讲ArrayList和LinkedList的区别(1),五分钟搞懂MySQL主从复制原理

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2401_84103844的博客 259

【ArrayList】白话文源码分析

【ArrayList】白话文源码分析ArrayList类解析全局变/常量构造方法无参构造:有参构造(参数为int)有参构造(参数为Collection集合其他方法add() 打好基础,再说其他的,不要整天好高骛远。 希望我的分享能帮到一样迷茫但努力的同学。 ArrayList类解析 首先我想对一些基础不好同学说一句。ArrayList是一个类,不是你们认为的就直接操作内存了。 既然ArrayList是一个类,那么类就有类的规则,有规则我们就能学习。我们来看看这个类的结构: public class Ar

易柏州的博客 463

ArrayList与LinkedList使用原理与区别

ArrayList & LinkedList的使用原理与区别1 两种List的使用原理1.1 ArrayList使用原理1.2 LinkedList使用原理2 ArrayList与LinkedList区别2.1 查找效率2.2 插入/删除效率 1 两种List的使用原理 ArrayList与LinkedList都是List接口的实现类,因此都实现了List(List接口继承了Collection接口代表其为有序队列,Collection接口又继承了Iterable接口,如fig.1所示)所有未实现的

thewangnextthedoor的博客 567

说一下ArrayList和和LinkedList区别

首先,它们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层基于双向链表实现的。 由于底层数据结构不同,它们所适应的场景也不同,ArrayList更适合随机查找,LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同。 另外ArrayList和LinkedList欧实现了List接口,但是LinkedList还额外实现了Deque接口,所以LinkedList还可以当做队列来使用。 ...

奋斗的新丁 148

数组转ArrayList的正确方式

一、简介 今天,我们讲讲开发中常见的错误之一 - 数组转ArrayList的正确方式。 二、数组转ArrayList 项目中难免会有数组对象转换为List对象的需求,很多小伙伴们可能会这样写: String[] array = new String[]{"a", "b", "c"}; //数组转List List<String> list = Arrays.asList(ar...

weixiaohuai的博客 4036
上一篇: Java中的Collection
下一篇: Android性能优化—线程管理
码农驿站
博客等级 码龄10年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值