zoukankan      html  css  js  c++  java
  • ArrayList中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别

    先看声明

    private static final Object[] EMPTY_ELEMENTDATA = {};
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    

    除了名字完全一样,还都被static final修饰了
    那为什么需要两个一样的呢?

    其实要看在刚刚创建的一个ArrayList中添加元素会发生什么
    这里有两种创建方式:

    ArrayList list1= new ArrayList(0);
    ArrayList list2= new ArrayList();
    

    第一种构造函数是这么写的:

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    

    initialCapacity 为0时,elementData 被赋值为EMPTY_ELEMENTDATA

    第二种构造函数是这么写的:

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    

    elementData 直接被赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA



    接下来,我们来看添加元素的操作

    list1.add(1);
    

    数组是空的,肯定不够
    于是便要扩容,在扩容之前,有一个确定增长后的数组大小的函数
    之前的源码不贴了,无论哪种方法,来这里minCapacity都是1

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
    

    鉴于我们只添加了一个元素,可以得出
    如果使用第一个构造函数,添加一个元素后,elementData.length=1
    如果使用第二个构造函数,添加一个元素后,elementData.length=10 (DEFAULT_CAPACITY就是10)

    这就是目前我能看出来的唯一区别。

  • 相关阅读:
    webstorm和git安装后,terminal输入git命令,提示'git' 不是内部或外部命令
    Vue中beforeRouterEnter和beforeRouteLeave的应用
    对象数组,对比多个数组的相同子元素并筛选
    应用canvas绘制动态时钟--每秒自动动态更新时间
    opacity 与rgba区别
    js对象的合并
    小程序wx.navigateTo和wx.redirectTo 都无效
    点赞博客园
    英语学习方法
    JAVA编程思想——分析阅读
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/12488090.html
Copyright © 2011-2022 走看看