ArrayList总结

jdk怎么说?

在这里插入图片描述
简介明了啊…

优缺点

jdk已经描述了,自己总结一下。可以从两个方面考虑:一是底层依赖的数据结构,二是自身实现机制。

  1. ArrayList和Vector的大小基于可变数组的实现,所以对于数据的随机读取存在极大的优势,但是对于除了尾部数据插入和删除性能相对较差,对于随机的插入和删除可以选择 AbstractSequentialList
  2. ArrayList是非线程安全的,如果有线程安全可以使用Vector,或者使用 Collections.synchronizedList 方法将该列表“包装”起来,或CopyOnWriteArrayList
  3. “随着向 ArrayList 中不断添加元素,其容量也自动增长”,也说明了ArrayList不要频繁和大量的插入数据,数组的扩容和数据的拷贝都比较消耗性能
  4. ArrayList是按照被插入的顺序保存元素,很多时候项目编码时,是个不错的选择

源码分析

ArrayList本身源码比较简单,在使用是最好可以提前预估数据的大小,在创建ArrayList的时候分配合适的初始化大小。
这里主要看一下ArrayList的扩容机制,其实也比较简单,在插入数据都会先检查一下此时的数据容量是否已经达到列表大小,如果达到则进行扩容和数据拷贝,如下面代码,其中oldCapacity >> 1代表着oldCapacity的二分之一大小。

/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

函数式编程

Java8之后支持了Lambda和Stream,对应集合的操作也有了相应的扩展,比如集合可以创建相应的Steam和ParallelStream的方法实现。简单列子:

public static void main(String[] args) {
        List<String> list = Arrays.asList("王一一","","张三","李四","王五","赵六","刘七");
        System.out.println("列表值:" + list);

        long count = list.stream().filter(data -> data.isEmpty()).count();
        System.out.println("空字符串的数量:" + count);

        List<String> newList = list.stream().map(data -> data+"+1").collect(Collectors.toList());;
        System.out.println("每个元素都+1 :" + newList);

        String strs = list.stream().filter(data -> !data.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("合并集合中非空字符串:" + strs);

        //输出每个元素
        list.stream().sorted().forEach(System.out :: println);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值