Java 数组与ArrayList

本文探讨了Java中的数组,包括其作为JVM原生数据结构的特性,以及为何在虚拟机层面没有定义数组类。接着转向ArrayList,指出ArrayList基于数组实现,并详细分析了其查找(O(1))、插入(O(n))和删除(O(n))的时间复杂度。此外,还介绍了ArrayList的扩容机制以及源码中的关键方法。最后,讨论了RandomAccess标记接口及其在Java中的应用。
摘要由CSDN通过智能技术生成

数组

什么是数组?

JVM原生提供的定长数据结构,类型安全的

为什么没有看见定义?

JVM提供了虚拟机级别的支持,有对应的字节码.
相当于虚拟机层面定义了一个数组类,限制了类型,有插入和获取指定位置元素的方法.(可以这样子理解但是不存在这个类)
有专门指令来操作数组.
JVM中"["表示数组
在这里插入图片描述
在这里插入图片描述

ArrayList

基于什么实现?

数组

查找/插入/删除时间复杂度

  • 查找:O(1) 可以实现随机查找,查找任何一个数都是常数时间
    • 数组的寻址操作时间复杂度是O(1)的.因为内存中这是硬件电路实现的,可以无视数据量,直接定位到一个内存单元.
  • 插入:O(n) 往头插一个元素,需要把原有这个位置的元素及之后的所有元素往后移动一位.
  • 删除:O(n) 删除也类似,删除一个要将后面的元素往前移动
  • 扩容是如何实现的?
    • X1.5倍
    • 拷贝 例子:电话本满了,买一本大1.5倍的然后把旧的和新增加的抄写进去.
    • 执行add方法的时候判断

源码:

添加/删除/扩容/并发访问
add 添加元素,扩容操作(*1.5)
remove 删除元素,删除中间一个元素,要把后面往前补,如果删除最后一个,就只减一下下标.然后将最后一个空间设置成null(用于去除强引用,让无用的最后一个元素被GC)
checkForComodification() 检查并发访问的方法.用于操作集合过程中检查是否被并发访问的方法.防止出现并发操作集合.现在操作的数量和预期的不一致就表示出现并发访问.

add源码:

/**
 * Appends the specified element to the end of this list.
 * (将指定的元素附加到此列表的末尾)
 *
 * @param e element to be appended to this list(要附加到此列表的元素)
 * @return <tt>true</tt> (as specified by {@link Collection#add})
 */
public boolean add(E e) {
   
    // 确保数组容量足够方法
    ensureCapacityInternal(size + 1);  // Increments modCount!!  (modCount计数增加 用于并发修改判断)
    // 将元素添加进数组最后一个位置
    elementData[size++] = e;
    return true;
}
private
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值