ArrayList有两个私有属性:
1、存储数据的数组elementData
2、记录已有数据内容数目的int size
数组elementData的初始容量是可以通过构造函数int 类型参数指定的,默认长度为10,
如果构造参数是Collection集合,容量为集合size的1.1倍与Integer.MAX_VALUE中较小者。
向ArrayList集合末尾中添加元素的方法
public boolean add(E o) {
ensureCapacity(size + 1);
elementData[size++] = o;
return true;
}
在每次添加元素之前都会调用ensureCapacity方法,这个方法是调整数组大小的一个方法。
具体代码如下
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;
elementData = (E[])new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}
其中的modCount是ArrayList父类AbstractList中的int属性,初始为0,目的是记录此集合被修改的次数。
if (minCapacity > oldCapacity) {}比较数组所需长度和数组实际长度,当所需长度大于实际长度时,
int newCapacity = (oldCapacity * 3)/2 + 1;
扩展实际长度,数组最终长度为,扩展后实际长度与所需长度中较大者。
以最终数组长度创建新的数组,然后进行内容的复制。
所以在知道集合要添加很多数据时,最好在构造集合时,指定到估计值附近,便可节省复制时间。
自己重构下这个方法,感觉看起来会更加明确
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
elementData = (E[])new Object[((oldCapacity * 3)/2 + 1)<minCapacity?minCapacity:((oldCapacity * 3)/2 + 1)];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}
向ArrayList集合指定位置添加元素的方法
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
ensureCapacity(size+1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
方法和简单,扩一下数组容量,将索引后的数据都向后移一位,最后在索引处添加内容,最后将实际数据数量加一。
删除ArrayList指定位置元素的方法
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;//这里我认为改为--size;也不会影响集合的使用。
return oldValue;
}
RangeCheck(index);只是检查索引是否越界,
相对于添加,删除简单多了,只要将索引后数据都向前移一位,将原先有数据存储时最后一位变为null。实际数据量减一。
分享到:
相关推荐
在Android开发中,ArrayList是一个非常基础且常用的集合类,它继承自Java的AbstractList,并实现了List接口。ArrayList主要用于存储和管理有序的元素序列,它的核心特点是动态扩容,可以在运行时根据需要自动增加...
Arraylist 学习讲义,可以供java初学者查看学习。在观看本讲义的过程中,能较好的理解java中Arraylist的使用
Java集合框架中,ArrayList是一种常见的集合实现类,用于存储和操作对象集合。ArrayList基于动态数组的数据结构,因此它能够提供自动扩容的功能,同时也能够快速地进行随机访问。本篇文档将深入探讨ArrayList的内部...
《深入Java集合学习系列:ArrayList的实现原理》 在Java编程中,ArrayList是集合框架中一个重要的类,属于List接口的实现,它提供了动态数组的功能,允许我们在集合中存储、添加、删除元素,并且可以按索引访问。这...
通过学习ArrayList类的这些操作和特性,你可以更好地理解和使用ArrayList来处理数据。在实际编程中,根据需求选择合适的数据结构,比如如果频繁进行插入和删除操作,考虑使用LinkedList;如果需要快速访问且元素数量...
详细的学习可以通过搜索“ArrayList的动态扩容”来深入了解。 ArrayList的一个重要特性是其非线程安全。这意味着在多线程环境中,多个线程同时修改ArrayList可能会导致数据不一致或异常。为了在多线程环境下安全地...
在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问...通过学习和理解这个实现,开发者可以更好地理解和运用C语言的数据结构和内存管理技巧。
在编程领域,尤其是在C#语言中,数组和ArrayList是两种常用的数据存储结构。...在实际编程中,我们应根据需求选择最合适的解决方案,同时,随着技术的发展,不断学习新的数据结构和算法,以适应不断变化的编程环境。
C++ArrayList类的实现是一个很好的学习和实践C++面向对象编程、内存管理和容器设计的机会。通过这种方式,我们可以深入理解数据结构和算法,并为未来更复杂的数据结构和程序设计打下坚实的基础。在实际项目中,通常...
总的来说,这个资源提供了学习和实践Iterator设计模式的机会,加深了对Java集合框架的理解。通过模拟ArrayList的Iterator实现,我们可以更深入地掌握如何在实际编程中利用这一强大的工具。同时,这也为我们设计自己...
告诉我们如何来学习将arrayList进行运用,这是关于C#的程序
通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...
在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能...通过深入学习和实践,可以更好地利用这些数据结构提升程序效率和质量。
ArrayList是Java编程语言中一种常用的动态数组,它属于Java集合框架的一部分,位于`java.util`包下。ArrayList类实现了List接口,提供了可变...通过学习和实践这些例子,你可以更熟练地处理基于数组的动态列表需求。
ListView显示单列ArrayList_demo ...在这个示例程序中,我们学习了如何使用 ArrayList 将数据显示在 ListView 中。我们还学习了 ListView、ArrayList 和 ArrayAdapter 的使用。这些知识点对于 Android 开发非常重要。
在这个Java demo中,我们可以学习到ArrayList的基本操作。 1. **创建ArrayList** 创建ArrayList对象时,我们可以指定初始容量,或者不指定,Java会自动设置一个默认值。例如: ```java ArrayList<String> list =...
此外,通过实践这个项目,你还可以学习如何使用OOP原则,如封装和继承,来构建更复杂的系统。 总之,理解并熟练运用ArrayList的CRUD操作是每个Java开发者的基本技能。这个项目提供了一个很好的起点,帮助初学者巩固...
ArrayList是Java集合框架中的一员,它是List...通过深入学习ArrayList的源码,我们可以更好地理解其工作原理,从而在实际开发中做出更优的选择,提升程序的效率和稳定性。同时,这也是提升Java编程技能的一个重要步骤。