ArrayList扩容规则

1----ArrayList

1.1—ArrayList如何扩容?

  • 第一次扩容10,以后每次都扩容原容量的1.5倍,扩容通过位运算右移动1位。

1.2—ArrayList 频繁扩容导致添加性能急剧下降,如何处理?

  • 如果在大量数据需要添加到集合中的时候,提前定义ArrayList集合的初始容量,从而不用花费大量时间在自动扩容上

1.3—ArrayList插入或删除元素是否一定比LinkedList慢?

  • 在集合里面插入元素速度比对结果是:首部插入,LinkedList更快;中间和尾部插入,ArrayList更快;
  • 在集合里面删除元素类似,首部删除,LinkedList更快;中间删除和尾部删除,ArrayList更快;

1.4— ArrayList 是线程安全的吗?

  • 因此,得出结论,ArrayList并不是线程安全的集合!如果需要保证线程安全,建议使用Vector集合,其是线程安全的,但是相对于ArrayList来说,效率比较低。

  • 而Vector相对于ArrayList之所以是线程安全的,就在于其add()为集合添加元素的方法:

    // 可以看出Vector的add方法加上了synchronized 同步关键字
    public synchronized void addElement(E obj) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = obj;
    }
    

1.5–ArrayList如何做到并发修改,而不出现并发修改异常?

为解决此问题呢,java引入了一个可以保证读和写都是线程安全的集合(读写分离集合):CopyOnWriteArrayList

所以解决方案就是:

// private static ArrayList<String> list = new ArrayList<>();
    // 使用读写分离集合替换掉原来的ArrayList
    private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
    static {
        list.add("Jack");
        list.add("Amy");
        list.add("Lucy");
    }

1.6—ArrayList和LinkedList 的区别?

  • ArrayList

    • 基于动态数组的数据结构
    • 对于随机访问的get和set,其效率优于LinkedList
    • 对于随机操作的add和remove,ArrayList不一定比LinkedList慢(ArrayList底层由于是动态数组,因此并不是每一次add和remove都需要创建新数组)
  • LinkedList

    • 基于链表的数据结构
    • 对于顺序操作,LinkedList 不一定比ArrayList慢
    • 对于随机操作,LinkedList 效率明显低于LinkedList
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值