18:ArrayList 集合 JDK1.7 及 JDK1.8 版本的 扩容机制 、Vector 扩容机制 解读 及它们之间的区别总结:

目录

说明:

ArrayList JDK1.7 版本底层扩容机制 实现源码解读:

ps:JDK1.7的ArrayList 的 ArrayList(Collection c) 构造器 源码解读:

ArrayList JDK1.8 版本底层扩容机制 实现源码解读:

ps:JDK1.8的ArrayList 的 ArrayList(Collection c) 构造器 源码解读:

Vector :

说明:

Vector 有且ArrayList没有的API基本使用:

 Vector 扩容机制 实现源码解读:

JDK1.7 、JDK1.8 的ArrayList 和 Vector 区别总结:

ArrayList 与 Vector 的相同点:

ArrayList 与 Vector 的不同点:


说明:

  1. ArrayList 、Vectory 的底层是通过 Object的 数组 来 实现的。
  2. 数组:在Java中是一种引用类型。在数据结构中,数组就是一种 紧密结构 之一的 一种数据结构!
  3. ArrayList 、Vector 底层的算法,就是 通过数组的 copy 来实现的。巧妙的结合了 很多编程思想在里面。
  4. 数组的表现形式:如图所示: 

数组的优缺点:

数组的优点:

    (1)相对于变量来说,数组可以存放大量的数据。
    (2)按照索引查询元素 速度快。
    (3)数组存储是:是有序的,可重复的。
    (4)按照索引遍历数组方便。数组定义简单。并且访问也方便。可以随机访问其中的元素。

数据的缺点:

    (1)一旦指定了长度,那么数组长度就被确定了,不可以更改,不适合动态存储。
    (2)只能存储一种数据类型的数据。
    (3)增加、删除元素效率慢。
    (4)官方 只提供了一个 length 属性能够获取数组中应该存储多少个元素,
        而 数组中实际元素的数量 是没有办法获取的,没有提供对应的方法 或者是属性 来获取。
    (5)数组的空间必须是连续的。造成数组在内存中分配空间时 必须找到一块连续的内存空间。
           所以说数组不可能定义得太大。因为内存中不可能有那么多 大的连续的内存空间来供数组使用。
             解决这个问题的办法 就是使用链表。

ArrayList JDK1.7 版本底层扩容机制 实现源码解读:

(源码和StringBuilder 以及 StringBuffer 及其相似)

(以JDK1.7.0_21为例:)

(JDK1.7.0_79 这是JDK1.7的最后一个小版本,源码和JDK1.8差不多,所以直接读 1.8)

无参构造器创建ArrayList对象:


ArrayList中两个重要的属性:

跟进:

step 1:

step 2:

调用add方法,查看ArrayList集合中的 扩容机制:此时 ArrayList 中 elementDate 数组的初始化长度 为 10:

跟进:

step  1 :

step 2:

 step 3:


再次添加执行触发数组的扩容:

step 1:

step 2

step 3:

step 4:

step 5:

step 6: (debug时不会进来)

step 7 :一直 return,return到没有执行的代码位置:

step 8:一路 结束方法弹栈消失 , 回到 add方法中:

 step 9: 添加元素完毕,add方法弹栈。回到调用 add 方法的地方。


ps:JDK1.7的ArrayList 的 ArrayList(

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值