ArrayList相关细节

  • ArrayList是可以为空的
  • ArrayList可以有重复数据
  • ArrayList是有序的
  • ArrayList线程不安全

添加元素

  1. 先判断是否要扩容
  2. 在把元素放进去

ArrayList的底层是基于动态数组实现的原因

那么要扩容的话要扩多少呢?
源码里是在方法(ensureCapacity)里

    int newCapacity = (oldCapacity * 3)/2 + 1;

扩大了-->空间浪费
扩小了-->下一次的扩容来的太快,降低运行效率

然后用copy 方法把数据拷贝到新数组

删除元素

  1. 按照下标删除
  2. 按照元素删除,这会删除ArrayList中与指定要删除的元素匹配的第一个元素

两种方式都是一个删除方法,就是把找到那个位置,然后把后面的数组往前面移一位.
然后把最后一个元素置为null 让GC回收

插入元素
其实做的也是添加元素的做法

从指定位置开始的所有元素利用System,arraycopy方法做一个整体的复制,向后移动一个位置 ,然后要进行扩容判断

ArrayList的优缺点
优点
ArrayList底层以数组实现查询非常快
添加也很快
缺点
删除,插入要移动后面很多元素,性能差

所以,ArrayList比较适合顺序添加、随机访问的场景。

ArrayList和Vector
非常明显的区别就是ArrayList线程不安全和Vector线程安全
那么要ArrayList线程安全的话就要用

List<String> synchronizedList = Collections.synchronizedList(list);

Vector 还有一个区别就是扩容, Vector 可以指定扩容多少, 默认情况下是*2.

为什么ArrayList的elementData是用transient修饰的?
ArrayList 是集成了序列化接口的,但是用transient就是不允许序列化,
因为ArrayList里有如果有很多不要的元素,那么就没有必要全部都序列化,
所以ArrayList 就重写了接口writeObject

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值