Java Collection框架(三)ArrayList原理浅析

Java 集合框架HashMap 的原理 ArrayList 的原理 LinkedList 的原理 fail-fast 是一种机制,当集合在迭代过程中被修改时,它会立即抛出 ConcurrentModificationException 异常。例如,在使用迭代器遍历集合时,如果集合被修改,迭代器会检测到并发修改,并立即抛出异常。fail-safe 是一种机制,它不会抛出 ConcurrentModificationException 异常。它通过创建集合的副本来进行迭代,因此对原始集合的修改不会影响迭代过程。 阅读详情

​Java Collection框架 ArrayList源码解读 与 实现 原理浅析

2018拍摄于京都智积院

微信公众号

 

王皓的GitHub:https://github.com/TenaciousDWang

 

java.util.List

 

 

List集合是线性数据结构的主要实现。List本身是Collection接口的子接口,具备了Collection的所有方法。

 

List有三个主要实现:

 

ArrayList:底层的数据结构是数组,非线程安全,ArrayList替代了Vector,查询元素的速度非常快。默认大小10,每次扩容1.5倍。

 

LinkedList:底层的数据结构是链表,非线程安全,增删元素的速度非常快。

 

Vector:底层的数据结构就是数组,线程安全,Vector无论查询和增删都巨慢。默认大小10,2倍长度扩容(已经基本弃用)。

 

本篇我们来看一下ArrayList的源码和实现原理。

 

 

位于package java.util; 继承了AbstractList并实现了List接口。

 

主要成员变量

 

 

主要成员变量:

 

serialVersionUID,序列化版本号。

 

DEFAULT_CAPACITY,默认初始化容量,为10,如果没有使用显式容量创建ArrayList,那么ArrayList底层数组初始化容量为10.

 

EMPTY_ELEMENTDATA,如果在创建ArrayList时指定容量为0时,ArrayList内部会将这个空数据赋给elementData。

 

DEFAULTCAPACITY_EMPTY_ELEMENTDATA,如果没有用显式容量创建ArrayList,ArrayList内部会将这个空数据赋给elementData。

 

elementData,ArrayList的底层数据结构,一个对象数组,用于存放实际元素,并且标记transient关键字,在序列化的时候此字段是不会被序列化的。

 

size,ArrayList中包含元素的数量,默认为0。

 

 

MAX_ARRAY_SIZE,数组最大容量为Integer.MAX_VALUE - 8。

 

构造器

 

接下来我们看一下ArrayList的构造函数,就可以更好的理解上面的成员变量。

 

 

第一个为显式容量构造函数,在创建ArrayList时指定初始化容量,当initialCapacity>0时,创建一个数组并指定数组容量为initialCapacity,赋值给elementData。

 

如果initialCapacity==0时,将成员变量EMPTY_ELEMENTDATA这个空数组赋值给elementData。

 

如果initialCapacity<0时,会抛出IllegalArgumentException异常,非法容量。

 

 

无参数构造函数直接将成员变量DEFAULTCAPACITY_EMPTY_ELEMENTDATA(空数组)赋值给elementData。

 

 

第三个构造函数是将入参结合转化为数组,赋值给ArrayList的底层数组elementData,然后将elementData数组长度赋值给size,并判断是否不等于0,且判断elementData.getClass不等于Object[].class,使用数组的copyOf方法重新给elementData赋值,c.toArray 可能 (不正确) 不返回Object[]。如果size等于0,则将空数组EMPTY_ELEMENTDATA赋值给elementData。

 

public boolean add(E e)

 

下面我来分析一下ArrayList的add方法,看一下ArrayList是如何实现数组结构扩容的,ArrayList核心思想的体现。

 

 

当我们调用add(E e)时,首先执行ensureCapacityInternal(size + 1);进行增量。

 

 

ensureCapacityInternal内首先调用calculateCapacity进行比较,如果elementData为空数组,则使用默认数组容量大小10与size+1进行比较,返回大的,如果elementData不为空,则直接返回size+1.

 

 

接下来ensureExplicitCapacity判断size+1减去当前elementData数组长度是否大于0,如果大于0则开始执行grow方法。

 

 

增加容量,以确保它至少可以容纳由最小容量参数(size+1)指定的元素数目。

 

int oldCapacity = elementData.length;首先给oldCapacity赋值当前elementData的长度,然后用oldCapacity>>1带符号右移(除以2)加上oldCapacity为原数组elementData长度1.5倍。

 

最后判断1.5倍长度减去minCapacity(size+1)如果小于0则将minCapacity当做新的扩容大小,如果newCapacity大于MAX_ARRAY_SIZE(数组最大容量)则执行hugeCapacity操作。

 

 

1.5倍扩容后容量超过MAX_ARRAY_SIZE都返回Integer.MAX_VALUE,小于则继续按照MAX_ARRAY_SIZE当做当前elementData的容量即ArrayList容量,如此往复直到minCapacity < 0,抛出OutOfMemoryError(OOM异常)。

 

elementData = Arrays.copyOf(elementData, newCapacity);复制指定的数组,截断或用空填充(如有必要),以便复制具有指定的长度。

 

到此,ArrayList内部数组结构扩容完毕。

 

最后执行赋值操作elementData[size++] = e;返回true,return true;

 

在这里我们需要思考一下,当我们使用无参数构造一个ArrayList时,初始化数组大小为10,后续扩容每次都会调用Arrays.copyOf方法,反复复制数组创建数组,假设需要将1000个元素存入ArrayList中时,如果采用无参数构造,至少需要扩容13次,如果开始就指定容量直接分配1000容量的数组,可以避免扩容和数组复制的额外开销,但是如果初始化容量过大,也会由于数组体积过大导致性能消耗,且容易造成OOM风险,所以实际生产中,我们要根据实际情况来评估初始化容器的大小,尽可能的减少损耗和风险。

 

public void add(int index, E element)

 

接下来看一下add的一个重载方法,在指定index插入元素。

 

 

首先调用rangeCheckForAdd方法校验index的合法性。

 

 

接下来执行ensureCapacityInternal扩容。

 

然后使用System.arraycopy(elementData, index, elementData, index + 1,size - index);复制数组。

 

arraycopy() 方法位于 java.lang.System 类中,其语法形式如下

 

 

System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)

 

其中,srcArray 表示源数组;srcIndex 表示源数组中的起始索引;destArray 表示目标数组;destIndex 表示目标数组中的起始索引;length 表示要复制的数组长度。

使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,同时 length+destIndex 必须小于等于 destArray.length。

 

然后赋值elementData[index] = element; 尺寸size++。

 

public void ensureCapacity(int minCapacity)

 

 

这里有一个与扩容相关的方法一起看看,用来直接指定容量大小,只有当指定容量大于默认大小时才会执行ensureExplicitCapacity方法去直接扩容。

 

public void trimToSize()

 

 

这里是一个修剪尺寸的操作修剪List的容量至size大小,其实就是给elementData赋值一个复制的指定size容量的数组。只有当size小于ArrayList中Object[]的大小时才会设置。用来释放ArrayList未使用的内存。

 

public E set(int index, E element)

 

接下来看一下我们常用的set方法。

 

 

首先检查index是否合法,然后取根据index取出旧元素返回,新元素赋值给数组原index指针位置。

 

public int indexOf(Object o)

 

 

根据元素返回该元素在ArrayList集合中的指针位置。实际上是数组循环遍历查找。

 

public E get(int index)

 

 

最常用的get元素实际上就是返回elementData底层数组中指针index对应的元素。

 

public E remove(int index)

 

 

remove方法删除一个元素,然后将该元素后的所有元素向前移动一个位置。

 

以上就是ArrayList的实现原理浅析,除了上述主要使用的方法外还有很多别的方法,大家感兴趣也可以自行查看源码。下一篇我们来分析LinkedList的实现原理。

 

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码 动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码1.Win10系统配置OpenPose1.7.0的Python API 本人最近在研究基于骨架的动作识别方法,有幸看到端到端的ST-GCN算法,于是决定自己复现一下。(具体原理这里不介绍,大家自行查阅,比如Openpose是个啥?ST-GCN又是个啥?) 1.Win10系统配置OpenPose1.7.0的Python API 安装步骤: (1) ... 阅读详情

相关推荐

深度学习分类任务中,正负样本比例失衡的5种实战解决方案(附代码)

本文深入探讨了深度学习分类任务中正负样本比例失衡的5种实战解决方案,包括智能采样技术、动态数据增强、损失函数工程、模型架构创新和训练策略优化。针对信用卡欺诈检测、医疗诊断等场景,提供了详细的代码实现和评估方法,帮助开发者有效解决样本不平衡问题,提升模型在真实场景中的表现。

h9j8k7l6m5n的博客 424

关于ArrayList构造函数ArrayList(Collection c);

源码: public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray might (incorrectly) not re...

weixin_33935777的博客 461

2025年VSCode AI插件实战:如何用Devika+Continue+Tabby三件套10倍提升开发效率

本文详细介绍了2025年VSCode AI插件Devika、Continue和Tabby的三件套组合,如何通过智能开发工作流10倍提升开发效率。从项目架构生成到上下文感知辅助,再到本地化智能编码,这套方案实现了从需求分析到代码生成的全流程自动化,特别适合中大型项目开发。

weixin_26911099的博客 269

Java集合Collection之实现原理解读(ArrayList)

一、简介 在项目中,相信大家都已经用过集合List,它提供了一系列的API,方便我们使用。今天有空去看了下ArrayList的源码,本章将会模仿源码实现一个简单的ArrayList,只是帮助理解ArrayList底层是怎么实现的,并没有必要去自定义ArrayList。 二、实现原理 ArrayList底层是通过数组实现的,所有对数据的操作其实底层都是对Object[]数组的操作, 具体的增删...

weixiaohuai的博客 638

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 561

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 173

Java集合系列之ArrayList底层实现原理

  1. ArrayList是一个动态数组,实现了List&lt;E&gt;, RandomAccess, Cloneable, java.io.Serializable,并允许包括null在内的所有元素。 1.1,实现了RandomAccess接口标识着其支持随机快速访问,实际上,我们查看RandomAccess源码可以看到,其实里面什么都没有定义.因为ArrayList底层是数组,那么...

xujing_2017的博客 7514

如何判断一个程序员的技术比你强?

技术大佬与普通程序员之间存在明显的认知差异:前者善于将复杂问题抽象为经典计算机科学问题,用声明式代码替代过程式逻辑;对异常和边界条件极度敏感,具备系统化的排查方法论;代码追求高可读性而非炫技,且执着于底层原理研究。这种技术压制体现在解决问题的确定性上——通过扎实的理论功底和工程直觉,快速定位问题本质,而非依赖试错或搜索。真正的技术实力源于对底层逻辑的深刻理解和对系统稳定性的敬畏。

wldtzzming的专栏 1088

java arraylist底层实现原理_Java Collection框架(三)ArrayList原理浅析

2018拍摄于京都智积院王皓的GitHub:https://github.com/TenaciousDWangjava.util.ListList集合是线性数据结构的主要实现。List本身是Collection接口的子接口,具备了Collection的所有方法。List有三个主要实现:ArrayList:底层的数据结构是数组,非线程安全,ArrayList替代了Vector,查询元素的速度非常快。...

weixin_30194029的博客 219

Windows 11 WSL2环境下OpenClaw部署的兼容性问题分析与解决方案研究

本文研究了OpenClaw在Windows 11 WSL2环境下的部署方案。WSL2通过无缝集成Linux与Windows系统,为OpenClaw提供了良好的运行环境,支持GPU加速和跨平台开发。文章详细分析了硬件配置要求(推荐8核CPU/16GB内存/NVMe SSD)、系统选择(Windows 11 Pro+Ubuntu 22.04)以及部署步骤,包括WSL2启用、Linux发行版安装、Python/Node.js/Redis等依赖配置。通过优化.wslconfig文件参数(如内存分

博客 2279

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn‘t retrieve inbound binding

错误消息:错误截图:该错误通常表示在集成配置中,未找到与特定消息匹配的入站绑定(Inbound Binding)。具体而言,错误消息中的 P/S/A(Party/Service/Action)值未在配置中找到对应的入站绑定。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

Java 集合框架(Collection)

这个方法允许你指定数组的类型,并且可以避免类型转换的开销。相关的方法,当然,Collection的功能List也都继承了。1.LinkedList集合的底层是基于什么实现的?① 如果集合支持索引,可以使用for循环遍历,每删除数据后做。获取集合的迭代器对象,对迭代器对象使用.next()方法。基于双链表的这种特点,LinkedList新增了很多。写累了,承受了这个年纪不该承受的(惆怅脸)…函数式接口的实现,这个实现可以是一个。就是removeFirst方法的套皮,来实现的,但隐藏了迭代器的实现细节。

m0_70484213的博客 1169

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 590

Java集合框架、Collection体系的单列集合

Java集合框架是用于存储和操作对象的容器体系,主要分为和两大根接口。其中接口用于存储单个元素的集合,接口用于存储键值对映射关系。

FUYY'S BLOG 874

android 蓝牙通讯demo

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

浅谈Java中Collection、Iterable、List、ArrayList间的关系

Java是一个高级语言,它提供了很多现成的数据结构,给我们的编程带来了极大的遍历。这都是由Java编程的高手给出的,学习这里面的实现方式无论是对于我们使用这些工具还是对于掌握Java的编程之道都是很有帮助的。本文主要讲述Java中的表的实现方式。         首先来介绍Collection接口:Collection位于Java的java.util包中。顾名思义,Collection就是用来实

Judy_c的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Collection 和 List 及实现类ArrayList和LinkedList的常用方法

Java集合框架中Collection是单列集合的根接口,List是其子接口。ArrayList和LinkedList作为List的主要实现类,分别基于动态数组和双向链表实现。 ArrayList 查询效率高,但增删效率低,适合频繁查询场景; LinkedList 增删效率高,尤其是首尾操作,但查询效率低,适合频繁增删场景。

m0_74004373的博客 1098

JAVA之Collection 集合容器框架(LinkedList,ArrayList,Map等解析)

Java中的集合框架(Collections framework)包含两个组成:Collection 和Map一.CollectionCollection是一个继承于Iterable的接口 Collection接口中主要定义了以下常见方法: int size(); //集合的长度 isEnmty();//是否为空 boolean contains(Object o); //否含有某个

蔷薇_wendy的博客 1178

六 Java 集合框架 Collection接口 ArrayList Set Map

对象存入集合都会变成Object类型,取出时需要类型转换。 Java集合框架体系结构 根接口 子接口 特点 接口的实现类 Collection List 排列有序,可重复(序列) ArrayList 数组序列 LinkedList Queue LinkedList 链表 Set 元素无序,不可重复 HashSet 哈希集 Map 以<Key,Value>两个对象为一...

打工人 打工魂 195

Java集合框架Collection

1.List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据索引访问List中元素。常用的实现List的类有LinkedList,ArrayList,Vector,Stack。ArrayList 是容量可变的非线程安全列表,其底层使用数组实现。当集合扩容时,会创建更大的数组,并把原数组复制到新数组。ArrayList 支持对元素的快速随机访问,在尾部追加/删除元素效率很高,但在中间位置插入/删除需要搬移元素,代价较高。

m0_58970439的博客 193

Java 集合框架之Collection集合:List、ArrayList、LinkedList、Vector、Set、HashSet、LinkedHashSet、TreeSet集合

文章目录集合框架Collection集合框架 常用关系结构图1、Collection\ 接口集合 JDK 1.2常用方法2、List\ 接口集合 JDK 1.2常用方法 (特有)3、ArrayList\集合 JDK 1.2常用方法4、LinkedList\集合 JDK 1.2常用方法5、Vector\ 集合 JDK 1.06、Set\ 接口集合 JDK 1.2HashSet、LinkedHashSet、TreeSet底层 源码7、HashSet\ 集合 JDK 1.2HashSet存储数据的结构(哈希表)s

阿星小天地 727

容器二Collection_ArrayList

容器框架 Java的容器框架提供了一套性能优良、使用方便的接口和类,他们位于java.util包中。 存放在集合中的数组,被称为元素(element) Collection接口 Collection接口中的方法 他有两个子接口:List和Set。 各个接口的特点: Collection接口存储一组不唯一,无序的对象 List接口存储一组不唯一,可重复的有序(索引顺序)的对象 Se...

xjion的博客 205

Java集合框架深度解析:Collection接口与Map接口全面指南

Java集合框架深度解析:Collection接口与Map接口全面指南。

2301_81701361的博客 1242

Java 集合框架(Collection+Map)

1. 什么是Collection?            

qq_40668700的博客 1005

Java基础:Collection集合框架体系

Collection集合体系

2301_79690805的博客 1206

6000字粗讲让你彻底明白Java集合框架的使用逻辑(Collection、List、Set、Map)

Map集合也被叫做“键值对”集合,格式:{key1=value1,key2=value2,key3=value3...}Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。Map集合在什么业务场景下使用?比如说购物车场景{商品1=2,商品2=3,商品3=2,商品4=3}需要存储一一对应的数据时,就可以考虑使用Map集合来做。Map集合的体系MapTreeMapMap集合体系的特点。

Bew1tch的博客 1073

蹊源的Java笔记—集合之Collection接口

溪源的Java笔记—集合 前言 在java中我们最常的数据接口就是集合,在面试的时候最常问的问题也是集合相关的问题,结合自己的面试经验,我做了简单地整理,希望可以能够帮助小伙伴们一二。 正文 集合 集合有两个接口组成:Collection和Map Collection接口 Collection接口有3个子接口分别是: List:有序且元素是可重复的 Set:无序并元素是不可重复的 Queue:先进先出的线性数据结构,并且只能观察到队首元素. List接口 List的常用实现类有: ArrayList

蹊源的奇思妙想的博客 5620

集合Collection接口与ArrayList与及其背后的数据结构

文章目录一、Collection接口下的集合关系图二、包装类1.基本数据类型和包装类直接的对应关系2.包装类的装包(装箱)、拆包(拆箱)3.Integer包装类中特殊的valueOf方法三、ArrayList1.ArrayList简介2.ArrayList的使用2.1 ArrayList的构造方法2.2 ArrayList常见操作2.3 ArrayList的遍历2.4 迭代器ListIterator的ArrayList中add的关系3.ArrayList的扩容机制 一、Collection接口下的集合关系

ZJRUIII的博客 1568
上一篇: Java Collection框架(二)Collection与Stream
下一篇: Java Collection框架(四)LinkedList原理浅析
JavaBoy王皓
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值