java源码----集合系列1----ArrayList,linkedList

这篇具有很好参考价值的文章主要介绍了java源码----集合系列1----ArrayList,linkedList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Arraylist

基础信息

底层是一个object数组

Arraylist 是java里面Collection  标准的一个集合,其底层是一个object数组。当new一个空参的ArrayList的时候,会默认生成一个空数组。

java源码----集合系列1----ArrayList,linkedList

java源码----集合系列1----ArrayList,linkedList

Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE  =  2^31-1);

超过上限会报内存溢出

java源码----集合系列1----ArrayList,linkedList

这里为什么是Integer.MAX_VALUE-8  ,源码上的解释就一句话 

Some VMs reserve some header words in an array

 一些虚拟机会在数组中保留一些头字。解释起来就是:

Java对象在堆内存中的存储布局可以分为三部分:对象头(object header),实例数据(Instance Data)和对齐填充(Padding);

对象头包括

Mark Word:用于对象自身的运行时数据存储,如HashCode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID和偏向时间戳等;
Klass Pointer:对象指向它类元数据的指针,JVM通过这个指针长度来确定对象是哪个类的实例。
数组长度(只有数组对象才有):记录数组对象的长度。

java源码----集合系列1----ArrayList,linkedList

8 bytes(Mark Word的最大占用) + 8 bytes(Klass Pointer的最大占用) + 4 bytes(数组长度)+ 8 bytes(引用指针的最大占用:数组中存放的是对象的引用) + 4 bytes(padding:为了方便寻址,JVM要求对象大小要求是8的倍数,不够就填充) ==32 bytes

  而int类型  1位占4个byte, 8 int(整数) 就等于32 bytes(字节),所以是Integer.MAX_VALUE-8。但在实际使用时因为考虑到虚拟机堆大小,实际arraylist大小要远远小于Integer.MAX_VALUE-8 。

ArrayList  默认长度是10,使用Arrays.copyOf()进行扩容,每次=扩容size是 原size的一半  (oldCapacity + (oldCapacity >> 1));

java源码----集合系列1----ArrayList,linkedList

 Arrays.copyOf()源码其实是调用了System.arraycopy 

java源码----集合系列1----ArrayList,linkedList

 System.arraycopy 是原生方法。

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

相当于新建了一个空数组,再用原生方法把老数组的值复制进去。从这一点可以看出ArrayList每次扩容都需要创建新的数组,并且将原数组的值复制进新的数组,新增的速度相对要慢

查询的时候先校验是否存在数组下标越界

java源码----集合系列1----ArrayList,linkedList

然后从数组中获取

java源码----集合系列1----ArrayList,linkedList

LinkeList

LinkeList底层是个链表文章来源地址https://www.toymoban.com/news/detail-438425.html

到了这里,关于java源码----集合系列1----ArrayList,linkedList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(36)
  • Javat集合之Lis---(ArrayList和LinkedList)

    提示:以下是本篇文章正文内容,下面案例可供参考 List是一种常用的集合类型,它可以存储任意类型的对象,也可以结合泛型来存储具体的类型对象, 本质上就是一个容器。 ArrayList和LinkedList通用方法: 以上方法通用且常用的方法其他方法可参考相关的文档进行查询即可,

    2024年01月24日
    浏览(32)
  • 【List】List集合有序测试案例:ArrayList,LinkedList,Vector(123)

    List是有序、可重复的容器。 有序: List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问 元素,从而精确控制这些元素。 可重复: List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。 List接口常用的实现类有3个:

    2024年02月11日
    浏览(34)
  • Java集合框架之ArrayList源码分析

    ArrayList是Java提供的线性集合,本篇笔记将从源码(java SE 17)的角度学习ArrayList: 什么是ArrayList? ArrayList底层数据结构是怎么实现的? 作为一个容器,分析增删改查的过程 ArrayList的扩容机制 由ArrayList的定义可知,ArrayList继承了AbstractList抽象类,实现了List、RandomAccess、Cloneabl

    2024年02月07日
    浏览(44)
  • Java 集合中 ArrayList 的扩容机制原理(面试+读源码)

               在 Java 中,ArrayList 内部是通过一个数组来存储元素的,是一个数组结构的存储容器。当向一个 ArrayList 中添加元素时,如果当前数组已经满了,就需要扩容。          集合的继承关系图  ( ArrayList 的扩容机制原理 )          面试官好,ArrayList 是一个数

    2024年02月07日
    浏览(34)
  • java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

    目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 还记得我们的java集合框架吗, 我们来复习一下, 如图:          可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信学过这个的应该大概有个

    2024年02月12日
    浏览(25)
  • Java链式存储LinkedList----与ArrayList比较

    作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信

    2024年01月23日
    浏览(34)
  • Java ArrayList 与 LinkedList 的灵活选择

    Java ArrayList 类是一个可变大小的数组,位于 java.util 包中。 for 循环: for-each 循环: ArrayList 是 Java 中常用的数据结构,它可以存储各种类型的数据,并且可以根据需要调整大小。 ArrayList 的优势: 可变大小 可以存储各种类型的数据 提供多种方法来访问、修改和删除元素 可以使用

    2024年03月09日
    浏览(43)
  • 【java】LinkedList 和 ArrayList的简介与对比

    Java LinkedList和 ArrayList 在使用上,几乎是一样的。由于LinkedList是基于双向链表的,会多出list.getFirst();获取头部元素等方法 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。 链表可

    2024年02月11日
    浏览(31)
  • java面试基础 -- ArrayList 和 LinkedList有什么区别

    目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 还记得我们的java集合框架吗, 我们来复习一下, 如图:          可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信学过这个的应该大概有个

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包