java声明一个无参数组,ArrayList构造方法详解-使用无参构造方法创建对象

使用无参构造方法创建对象

package com.jettyw.arraylist;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author jettyw

* 2017-05-25

* 使用无参构造方法创建ArrayList对象

*/

public class ArrayListConstructorTest {

public static void main(String[] args) {

List list=new ArrayList();

}

}

从上一节我们知道使用无参构造时this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;数组初始化为一个长度为0的空数组。那么在我们第一次添加元素的时候,elementData的长度是如何实现扩展的。

我们调用ArrayList的添加元素的方法add(E e)

public boolean add(E e) {

//先确保数组的长度够用,否则进行扩展

//size=0

ensureCapacityInternal(size + 1);

//添加元素,将元素添加到数组中

elementData[size++] = e;

return true;

}

此时的size为0,调用ensureCapacityInternal(int minCapacity)方法这是一个私有方法。

private void ensureCapacityInternal(int minCapacity) {

//如果使用无参构造方法创建对象,第一次添加元素,数组最小的长度为默认长度10

//DEFAULT_CAPACITY为ArrayList声明的常量为10

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

//使用无参构造方法minCapacity=10

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

}

//如果不是第一次添加元素,不使用无参构造方法创建对象,走下一步确定一下是否要扩展数组

ensureExplicitCapacity(minCapacity);

}

调用ensureExplicitCapacity(minCapacity)方法进行最终的确认是否要扩展数组长度。

private void ensureExplicitCapacity(int minCapacity) {

modCount++;

//如果最小长度比数组的长度大,则扩展数组长度,否则不扩展,直接添加元素

//使用无参构造方法第一次minCapacity=10 数组长度为0,需要扩展调用grow()

if (minCapacity - elementData.length > 0)

grow(minCapacity);

}

接着调用grow(minCapacity)进行元素的扩展。

private void grow(int minCapacity) {

//当前数组的长度

//使用无参构造方法第一次添加元素oldCapacity=0

int oldCapacity = elementData.length;

//将要将数组扩展到的长度,如果要扩展,数组的新长度总是原来长度的1.5倍

//使用无参构造方法第一次添加元素 newCapacity=0

int newCapacity = oldCapacity + (oldCapacity >> 1);

//如果新长度小于最小长度,说明目前数组的长度够用,不需要扩展

//使用无参构造方法newCapacity=10

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

//如果要扩展的长度比默认最大长度要打,则使用调用hugeCapacity()方法获取长度

if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

//扩展数组之后进行数组的复制,将原来数组复制到扩展后的数组里面

//使用无参构造方法第一次添加元素扩展之后的数组长度为10

elementData = Arrays.copyOf(elementData, newCapacity);

}

不需要扩展的直接走elementData[size++] = e;否则扩展数组之后才走elementData[size++] = e;添加元素。在分析完源码之后我们可以得出结论,使用无参构造方法第一次添加元素产生一个长度为10的数组,在后续的添加过程中依然按照这个流程进行确定是否进行扩展数组长度。并且在扩展数组长度的时候再一次使用了Arrays.copyOf(elementData, newCapacity)方法进行数组的复制

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第6章 数组与字符串 96 6.1 数组基础 96 6.2 一维数组与多维数组 96 6.2.1 一维数组 97 6.2.2 二维与多维数组 99 6.2.3 可变长度参数列表 101 6.3 字符串类 102 6.3.1 Java字符串是一种引用数据类型 103 6.3.2 字符串处理 103 6.3.3 StringBuffer类 107 6.4 字符串与数值的转换 109 6.4.1 将字符串转换成数值 109 6.4.2 将数值转换成字符串 110 6.5 对象数组 112 6.6 查找与排序 112 6.6.1 排序与查找的基础 113 6.6.2 冒泡排序法 113 6.6.3 顺序查找法 115 6.6.4 二分查找法 116 习题 117 第7章 类与对象 119 7.1 面向对象的应用程序开发 119 7.1.1 传统的应用程序开发 119 7.1.2 面向对象的应用程序开发 120 7.2 面向对象基础 120 7.2.1 对象基础 121 7.2.2 面向对象程序语言 121 7.3 类与对象 122 7.3.1 类与对象 122 7.3.2 成员变量的访问 126 7.3.3 成员方法的使用 128 7.3.4 重载方法 130 7.4 类的构造函数 132 7.4.1 类的构造函数 132 7.4.2 使用this引用对象本身 134 7.5 对象成员 136 7.6 对象使用类变量与方法 137 习题 140 第8章 继承、抽象类与接口 142 8.1 类的继承 142 8.1.1 类层次结构 142 8.1.2 类的继承 143 8.1.3 重写和隐藏父类的方法 145 8.1.4 隐藏父类的成员变量 147 8.1.5 使用父类的构造函数 149 8.2 接口 151 8.2.1 接口简介 151 8.2.2 创建与使用接口 152 8.2.3 在类实现多个接口 154 8.3 接口的继承 155 8.3.1 继承接口 156 8.3.2 接口的多重继承 157 8.4 抽象类 160 8.5 抽象类与接口 163 8.6 常量类 166 习题 168 第9章 嵌套类、多态与包 170 9.1 嵌套类 170 9.1.1 嵌套类 170 9.1.2 嵌套类的使用 173 9.2 匿名嵌套类 175 9.2.1 类继承的匿名内层类 175 9.2.2 实现接口的匿名内层类 176 9.2.3 匿名内层类与this和final键字 178 9.3 多态基础 180 9.3.1 静态绑定与动态绑定 180 9.3.2 Java语言支持的多态 181 9.4 多态的实现 181 9.4.1 使用类继承来实现多态 181 9.4.2 使用接口来实现多态 184 9.5 包 186 9.5.1 Java包基础 186 9.5.2 package和import命令语句的使用 187 习题 190 第10章 异常处理、线程与泛型集合对象 191 10.1 Java的异常处理 191 10.1.1 异常处理的架构 191 10.1.2 Throwable类 191 10.1.3 异常处理语句 192 10.1.4 同时处理多种异常 194 10.2 抛出异常与自定义Exception类 196 10.2.1 使用throw键字 196 10.2.2 在方法抛出异常 197 10.2.3 自定义Exception类 199 10.3 线程的基础知识 200 10.4 创建Java的线程 201 10.4.1 实现Runnable接口来创建线程 201 10.4.2 继承Thread类来创建线程 204 10.5 集合对象简介 205 10.5.1 Java Collections Framework 206 10.5.2 集合接口 206 10.5.3 泛型集合类概述 207 10.6 泛型集合类 208 10.6.1 HashSet类 208 10.6.2 ArrayList类 210 10.6.3 Iterator接口 211 10.6.4 ListIterator接口 213

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值