java ArrayList无限添加元素
来源:互联网 发布:mmd走路姿势数据 编辑:程序博客网 时间:2024/06/04 18:54
ArrayList的底层使用数组进行存放元素的,底层实现是通过一个对象数组Object[]来存放元素的,由于是对象数组,所以只能存放对象,并可以存放任何对象。而数组中存放了对象的引用,所以ArrayList中也存放对象的引用,ArrayList只能存放对象。
ArrayList有3个构造函数:
ArrayList()
构造一个初始容量为 10 的空列表。
ArrayList(Collection<? extends E> c)
构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表。
我们通常使用ArrayList时会使用其不带参数的构造函数。源码如下:
private
transient
Object[] elementData;
public
ArrayList(
int
initialCapacity) {
super
();
if
(initialCapacity <
0
)
throw
new
IllegalArgumentException(
"Illegal Capacity: "
+ initialCapacity);
this
.elementData =
new
Object[initialCapacity];
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public
ArrayList() {
this
(
10
);
}
其底层实现是:
不带参数的构造函数会调用带参数的构造函数。
不带参数的构造函数会默认传递一个容量为10参数,在带参数的构造函数中会声明一个长度为10的Object数组,也就是说使用不带参的构造函数时使用this关键字调用有参的构造函数并设置初始容量大小为10。
我们学习到这,细心的读者或者初学者可能会发现一个问题。当我们使用ArrayList时,我们可以无限的往里添加元素,这是为什么呢?它底层不是由数组实现的,使用无参构造方法时系统会默认提供默认参数10,而使用有参构造函数时我们会指定大小,我们都是知道使用数组时当添加的元素个数大于数组的初始化长度时会报数组下标越界异常,那么ArrayList为什么不会呢?说到这里,可能已有读者知道ArrayList可能会自动为其扩容,没错,的确是这样的。我们来看看源码:
ArrayList中常用的add方法:
源码:
public
boolean
add(E e) {
ensureCapacity(size +
1
);
// Increments modCount!!
elementData[size++] = e;
return
true
;
}
使用ensureCapacity(
int
minCapacity)方法简单的理解就是为ArrayList扩容。
java api中这样解释:
public void ensureCapacity(int minCapacity)
- 如有必要,增加此
ArrayList
实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 - 参数:
minCapacity
- 所需的最小容量
public
void
ensureCapacity(
int
minCapacity) {
modCount++;
int
oldCapacity = elementData.length;
if
(minCapacity > oldCapacity) {
Object oldData[] = elementData;
int
newCapacity = (oldCapacity *
3
)/
2
+
1
;
if
(newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
通过以上分析我们得出结论:
ensureCapacity方法
它和底层数组的大小做比较,如果小于底层数组的长度则什么也不做;当大于底层数组长度时,它将原数组的大小进行扩容,大小为原数组的3/2+1;然后使用Arrays.copyOf方法,将原数组的元素拷贝到新指定大小的数组里,实现数组的扩容。 0 0
- java ArrayList无限添加元素
- ArrayList添加元素流程
- ArrayList.add()添加重复元素
- Java ArrayList的元素添加移除之java.util.ConcurrentModificationException异常分析
- ArrayList不能无限度的添加元素
- 使用ArrayList数组动态添加元素
- java ArrayList合并相同元素
- Java List/ArrayList操作示例----添加/排序/取子块/删除/追加元素
- ArrayList在多线程调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
- ArrayList在多线程调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
- 多线程中ArrayList调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
- 集合部分:ArrayList集合添加元素,并遍历元素
- java 中列表元素删除,如ArrayList
- Java集合类ArrayList删除特定元素
- Java集合类ArrayList删除特定元素
- java对ArrayList中的元素自定义排序
- Java集合类ArrayList删除特定元素
- Java ArrayList遍历时删除一个元素
- Gradle Library Module的复用机制
- lua - math【方法】
- SpringIoC依赖注入的过程(一)
- IE6、IE7、IE8的CSS、JS兼容
- php正则技巧,抓取、匹配中文、任意字符
- java ArrayList无限添加元素
- SDWebImage
- call和apply
- 闭包
- SLIC超像素分割
- Image-Loader 图片异步加载类库的使用
- Animation_list动画爆出OOM,你猜怎么着?
- Java容器填充-1
- ZeroMQ(1)——三个基本模型