通过Collection实现类创建ArrayList(含源码解析)

Jdk源码——ArrayList解析 前言 本文主要针对 JDK1.8 的 ArrayList 源码进行解析,主要看源码注释,代码说明了全部实现细节。 I. 继承结构 ArrayList 的继承结构如下图所示,下面我们进行一一解析。 Serializable Serializable 接口是启用其序列化功能的接口,接口定义如下: public interface Serializable { } 实现 java.io.Serial... 阅读详情

ArrayList(Collection<? extends E> c) 此构造器允许我们方便快捷的将Collection体系下的集合转换成ArrayList.
如下实现类均作为参数(since 1.8):

AbstractCollectionAbstractListAbstractQueueAbstractSequentialList
AbstractSetArrayBlockingQueueArrayDequeArrayList
AttributeListBeanContextServicesSupportBeanContextSupportConcurrentHashMap.KeySetView
ConcurrentLinkedDequeConcurrentLinkedQueueConcurrentSkipListSetCopyOnWriteArrayList
CopyOnWriteArraySetDelayQueueEnumSetHashSet
JobStateReasonsLinkedBlockingDequeLinkedBlockingQueueLinkedHashSet
LinkedListLinkedTransferQueuePriorityBlockingQueuePriorityQueue
RoleListRoleUnresolvedListStackSynchronousQueue
VectorTreeSet

源码如下:

public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // 存在可能获取的数组类型不是Object[]类型,需要判断下,是则进行拷贝一个新的Object[]用于存储
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // size=0则为一个空数组{}
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

elementData :Object[] elementData,是一个ArrayList用于存储元素的数组。toArray是Collection接口的方法,其实现类都重写了这个方法,用于依次的获取容器的元素,例如ArrayList的toArray()方法:

//底层是调用System.arraycopy方法进行拷贝操作
public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

注意存在可能获取的数组类型不是Object[]类型,详见https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652【JDK bug data】,所以需要判断下类型,如果不是Object[]则需要进行拷贝并生成新的Object[]对象,源码如下:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        //如果都是Object[]则新建一个Object[]数组,否则新建一个newType类型的数组
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        //拷贝
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

实战例子:

public class GenericVarargs {

    public static <T> List<T> makeList(T... args){
        List<T> result = new ArrayList<>(Arrays.asList(args));
        return result;
    }

    public static void main(String[] args) {
        List<String> ls = makeList("A","B","C");
        System.out.println(ls);
    }
}

结果:

[A, B, C]
【Java集合夜话】第2篇:Collection家族,一场优雅的探索之约 春风化雨润物无声,知识如泉静水流深。本文是Java集合系列的第二篇,将带您深入探索Collection家族的核心成员。从ArrayList的动态扩容到LinkedList的双向链表,从HashSet的哈希寻址到TreeSet的红黑树实现,从ArrayDeque的循环数组到PriorityQueue的堆排序,我们将逐一揭开这些集合类的神秘面纱。 阅读详情

相关推荐

文献计量VOSviewer分析知网文献基本操作及实用技巧

本教程旨在为读者提供一个关于VOS viewer的初级使用指南。VOS viewer是一个强大的科学研究可视化工具,主要用于构建和可视化科学地图。它能够处理大规模的科研数据,包括文献引用、共引、共词、共作者等信息。无论你是科研人员,还是数据分析师,甚至是研究生,都能在这个教程中找到使用VOS viewer的有效方法。我们将一步步教你如何使用这个软件,以及如何利用它进行科研数据的可视化。

Jia_n的博客 8764

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList

李长渊的博客 1570

antiSMASH安装与使用

antiSMASH本地安装 简要: antiSMASH的本地安装需要安装很多的依赖包,本文章使用conda辅助安装 参考: 官方:https://docs.antismash.secondarymetabolites.org/install/ 文章:http://blog.sciencenet.cn/blog-3416913-1240614.html 依赖包下载 conda install -y diamond=0.8.36 conda install -y fasttree=2.1.9 conda ins

Curry_chenhu的博客 7220

Collection之ArrayList简单使用

import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class CollectionTest { public static void main(String[] args) { // 1.准备一个Collection集合并打印 //Collection c1 = new Collectio.

lvweizhu的专栏 1099

【项目分享】RailTracker: 火车票务数据采集与分析

从12306使用爬虫爬取火车站及车次信息、火车票价 通过本项目,我们将带领访问者手把手完成火车票数据采集、数据清洗、数据集成、可视化的一整个流程!

zhushatong的博客 3343

别再用RIDE了!VSCode+RobotFramework插件打造现代化测试开发环境

本文介绍了如何利用VSCode和RobotFramework插件构建现代化的测试开发环境,替代老旧的RIDE工具。详细讲解了环境配置、插件安装、智能代码补全、测试运行与调试等核心功能,帮助开发者提升自动化测试效率。文章还提供了高级技巧、最佳实践和常见问题解决方案,助力团队实现平滑迁移。

weixin_28829629的博客 480

Collection集合---ArrayList (java)

基本知识 1超级父类:Collection–以单个方式存储单元 2.List存储的特点:有序(存入和取出顺序一样),可重复(集合中可以存储多个相同内容的地址),有下标。 3.ArrayList:底层采用数组进行储存,非限制安全。 4.包含关系 Collection(父类接口)–List(子类接口)–ArrayList(List接口下的类)。 具体功能 实现 public class CollectionTest01 { public static void main(String[] args) { //

weixin_45873089的博客 919

诠视MR眼镜Unity开发设置_Unity2020.3.38

请按照如下设置Android SDK 和 Gradle。打包前先将Unity切换到Android模式。Preferences 设置。

m0_71932574的博客 599

Simple-Java—Collections(二)Java中如何把数组转换为ArrayList

Java中如何把数组转换为ArrayList

大树的学习之路 3271

SAP MM ME21N保存前检查增强

想在ME21N保存前做一些数据检查, 可以做一个增强功能,  运行 CMOD 新增,   增强接口 输入 MM06E005  (  EXIT_SAPMM06E_012 ) ,在 NCLUDE ZXM06U43 .  里写代码功能。  例子如下: *&---------------------------------------------------------------------*

heng0757的专栏 1万+

【时空图神经网络 & 交通】相关模型3:STFGNN | 空间-时间依赖性 | 基于数据驱动的方法来生成“时间图” | 时空融合图模块,门控卷积模块 | 动态时间规整 | 顶会文章解析

STFGNN(时空融合图神经网络)在交通流量预测中的优势主要体现在以下几个方面:首先,它提出了一种数据驱动的方法生成“时间图”,弥补了传统空间图可能无法反映的某些相关性。其次,STFGNN通过并行处理不同时间段的空间图和时间图,有效地学习隐藏的时空依赖关系。此外,它将融合图模块与门控卷积模块整合到一个统一层中,通过层层堆叠处理长序列,进一步增强了模型的表达能力。实验结果表明,STFGNN在多个交通数据集上表现出色,优于其他基准方法,展示了其在实际应用中的强大潜力。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 382

Java学习笔记<五>(Collection:ArrayList)

ArrayList 常见使用 /*Arraylist集合*/ //创建ArrayList容器对象,泛型指定对象(容器)中元素类型 //ArrayList容器基于数组结构 List<String> yy=new ArrayList<>(); //接口声明,面向对象变成又称为面向接口编程 //为容器添加元素,返回Boolean值,true为添加成功,false为添加不成功 boole.

weixin_47269879的博客 658

BlockUI专栏目录

BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际开发中经常被使用。BlockUI可以帮助用户快速创建NX对话框,支持多种控件类型,如按钮、文本框、标签等。通过使用BlockUI,用户可以轻松地自定义对话框的布局、样式和交互行为。此外,BlockUI还提供了一些高级功能,如动态更新、条件显示和事件处理等,以帮助用户创建更加复杂和灵活的对话框。本专栏讲述了使用BlockUI制作NX对话框的方法,介绍了每个控件的功能,并且分享一些常用操作的源码。

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

11 Collection - ArrayList 源码解析

package com.dss.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * 使用字节流读取文件中的内容 */ public class FileInputStreamTest { public static void main(String[] args) {

weixin_39563769的博客 4657

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Collection - ArrayList 源码解析

本文主要对Collection - ArrayList进行源码解析。

qq_63353796的博客 861

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Collection-ArrayList源码解析

ArrayList的一点理解

令狐_JackieHao的博客 1340

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Collection 源码解析总览

Collection 源码解析 一、简介 借用《百度百科》的一段解释:Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子...

TEXOUS的博客 897

【Collection - ArrayList 源码解析】

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。

abclyq的博客 1058

集合框架源码之ArrayList

集合框架源码

andyliu198571的博客 915

Java——ArrayList源码解析

ArrayList源码解析 ArrayList介绍: ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。 ArrayList基于List接口实现的大小可变的数组。其实现了所有可选的List操作,并且元素允许为任意类型,包括null元素。除了实现List接口,此类还提供了操作内部用于存储列表数组大小的方法(这个类除了没有实现同步外,功能基本与Vector一致)。 每个ArrayL

weixin_44502548的博客 184

Java基础学习——Java集合(三)Collection接口、List接口、ArrayList实现类

一、Collection接口 1.常用方法 package com.rzd.no03collection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class Demo01 { public static void main(String[] args) { /*先创建对象,接口是不能创建

skx1102195517的博客 347

Java集合——Collection接口以及ArrayList,Vector,LinkedList的源码剖析——最认真的图解——第一章

文章目录1:集合体系图2:Collection方法2.1 Collection接口和常用方法2.2 Collection接口遍历元素的方式2.2.1 使用Iterator(迭代器)基本介绍2.2.2 for循环增强3:List接口和方法3.1 List接口基本介绍3.2 List接口的常用方法3.3 List接口的三种遍历方式4:ArrayList源码剖析5:Vector源码剖析6:LinkedList源码剖析6.1 LinkedList的全面说明和底层操作机制6.2 LinkedList源码剖析7:Lis

qq_44891295的博客 683

Java集合框架全解析:从Collection到List,附源码剖析

本文摘要: Java集合框架主要介绍了Collection和List两大接口及其实现类。Collection是单例集合顶层接口,包含add、remove等基本操作,遍历方式包括迭代器、增强for和lambda表达式。List接口扩展了有序、可重复集合特性,提供索引操作和五种遍历方式。重点分析了ArrayList(数组实现,查询快)和LinkedList(链表实现,增删快)的底层实现及源码,包括ArrayList的1.5倍扩容机制和LinkedList的双向链表结构。文章还对比了数组与集合的区别,并详细讲解了

sxjaaa的博客 875
上一篇: JSONObject源码解析
下一篇: 查看mysql数据库的所有表
_睶_
博客等级 码龄10年 1685粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值