资讯专栏INFORMATION COLUMN

初探ArrayList之添加

XiNGRZ / 2490人阅读

摘要:如果这个是刚刚初始化好的容量为,则为默认值若容量不固定,则比较与的大小,返回最大值。现在最小容量大小超过现在数组的长度,增长自增倍大于溢出三元表达式,大于取整形最大值用新的长度创建一个新数组把原数组的内容拷贝到新数组中,并返回新数组

一、构造方法 1.创建一个空ArrayList
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

DEFAULTCAPACITY_EMPTY_ELEMENTDATA为private static final的Object[],值为{}

2.创建ArrayList对象的时候,把一个Collection或其子类添加进来
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为初始化容量
EMPTY_ELEMENTDATA也为private static final的Object[],值为{}

3.创建ArrayList对象的时候,把一个Collection或其子类添加进来
public ArrayList(Collection c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray()可能没有正确的返回一个Object数组对象
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // 创建一个空的ArrayList
        this.elementData = EMPTY_ELEMENTDATA;
    }
}
二、添加

添加成功返回boolean类型值

public boolean add(E e) {
    //字面意思:确保容量存在,计算最小初始容量。
    ensureCapacityInternal(size + 1);  
    elementData[size++] = e;
    return true;
}

如果这个ArrayList是刚刚初始化好的(容量为0),则为默认值:10;若容量不固定,则比较size与10的大小,返回最大值。

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    // 现在最小容量大小超过现在数组的长度,增长
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);//自增1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)//大于MAX_ARRAY_SIZE
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // 溢出
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ? //三元表达式,大于MAX_ARRAY_SIZE取整形最大值
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

public static  T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}
public static  T[] copyOf(U[] original, int newLength, Class newType) {
    // 用新的长度创建一个新数组
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    // 把原数组的内容拷贝到新数组中,并返回新数组
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70616.html

相关文章

  • 初探ArrayList删除

    摘要:返回删除元素的删除方法记录修改次数的变量根据数组下标拿到指定元素计算移动位数把中复制到,最后一个元素置为下标检查,如果大于数组的,抛出异常返回一个值的删除方法传进来,删除第一个值为的值注意此时加入了两个值此时执行了一句只删除了 1.返回删除元素的删除方法 public E remove(int index) { rangeCheck(index); modCo...

    wayneli 评论0 收藏0
  • JAVA 持有对象——容器初探(持续补充)

    摘要:类库中提供了一套相当完整的容器类来解决这个问题,其中基本类型有,,,,这些对象类型被称为集合类。但是,类库中使用了来指代集合类中的子集,,,所以集合类也被称为容器。五类型是能够将对象映射到其他对象的一种容器,有区别于的方法。 引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》 了解容器前,先提出一个问题,ArrayL...

    aikin 评论0 收藏0
  • 从SpringBoot到SpringMVC

    摘要:概述用久了,深受其约定大于配置的便利性毒害之后,我想回归到时代,看看开发模式中用户是如何参与的。备注当然本文所使用的全是非注解的配置方法,即需要在中进行配置并且需要遵循各种实现原则。而更加通用主流的基于注解的配置方法将在后续文章中详述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...

    xavier 评论0 收藏0
  • 初探Java类型擦除

    摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...

    DevTalking 评论0 收藏0
  • Elastic Search搜索引擎在SpringBoot中的实践

    摘要:注本文首发于公众号,可长按或扫描下面的小心心来订阅实验环境版本版本首先当然需要安装好环境,最好再安装上可视化插件来便于我们直观地查看数据。 showImg(https://segmentfault.com/img/remote/1460000015723674); 注: 本文首发于 My 公众号 CodeSheep ,可 长按 或 扫描 下面的 小心心 来订阅 ↓ ↓ ↓ showI...

    Me_Kun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<