副本第六关:ArrayList的扩容策略?删除ArrayList里的重复元素实现?

ArrayList的扩容策略?

ArrayList的底层是一个Object数组elementData,扩容是基于内部的grow()方法实现的。

  1. 当我们要add进第一个元素到ArrayList时,elementData.length为0(因为还是一个空的list,里面还没有数据,所以没有进行扩容,默认扩容10),因为执行了ensureCapacityInternal()方法,所以minCapacity此时为10。此时,minCapacity - elementData.length > 0(minCapacity = 10,elementData.length = 0)成立,所以会进入==grow(minCapacity)==方法,将数组扩容为10;
  2. 当add第2个元素时,minCapacity为2,此时elementData.length(容量)在添加第一个元素后扩容成10了。此时,minCapacity - elementData.length > 0不成立,所以不会进入(执行)==grow(minCapacity)==方法;
  3. 添加第3、4…到第10个元素时,依然不会执行==grow(minCapacity)==方法,数组容量都为10;
  4. 直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大,所以进行grow方法去扩容,扩容为 原先数组长度 + 原先数组长度>>1(效果相当于原先数组长度/2),即新容量为旧容量的1.5倍,然后用Arrays.copyOf()将新添加的元素连同elementData数组的元素一起复制到一个新的数组中,新数组的容量就是elementData的1.5倍。
ArrayList元素去重实现?
  1. 双重for循环:

    • 外层for循环从头开始遍历,定义i = 0, i < list.size() - 1, i++;
    • 内存for循环从尾开始遍历,定义j = list.size() - 1, j > i, j–;
    • 然后判断list.get(i)是否跟list.get(j)相等,相等的话就list.remove(j)删除重复元素。
  2. 利用HashSet去重,但是无序:

    • HashSet set = new HashSet(list);
    • list.clear();
    • list.addAll(set);
  3. 利用LinkedHashSet去重,可以保证输入顺序:

    • 与HashSet实现一样。
  4. 利用list的contains()方法去重:

    • 新定义一个list集合,然后for循环遍历要去重的list,然后用contains()方法判断新list是否包含这个list的当前下标的元素,不包含的话就把这个下标对应元素添加到新list集合中,包含的话不做任何处理。
  5. 利用lambda表达式去重:

    • List collect = list.stream().distinct().collect(Collectors.toList());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值