【构造方法】
ArrayList通过数组来存储对象,构造ArrayList会新建一个数组。默认情况下这个数组的初始化大小是10,可通过传入参数initialCapacity修改它的初始化大小。(See Code)
private transient Object[] elementData;
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
public ArrayList() {
this(10);
}
HashSet通过HashMap来存储对象,构造HashSet时会新建一个HashMap作为成员属性。(See Code)
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<E,Object>();
}
【添加元素】
ArrayList添加元素时,会对数组的容量大小作判断并根据ArrayList容量的增长策略作调整。ArrayList提供两个方法来添加元素,分别是直接将新元素添加到数组第一个空位置上和添加数组的指定位置,若是添加到指定的位置,则原来该位置上的元素及其后的元素都要往后移动一个位置。(See Code)
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
值得注意的,是ArrayList的数组存储容量的增长策略。通过公式:(原来的容量大小*3)/2+1求得新的容量值newCapacity,将newCapacity与所要求的最小容量minCapacity进行比较,若比minCapacity大的话,则取newCapacity作为扩大后的容量大小,若比minCapacity小的话,则取minCapacity作为扩大后的大小。(See Code)
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);
}
}
HashSet添加新对象时, 将新对象作为Map的Key,将常量对象PRESENT作为Value,以标识这个新对象已被添加。(See Code)
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
值得注意的是,Set不存储重复的对象,它是通过equals方法来判断的。(若是null,通过==来判断)
【移除元素】
跟add方法一样,ArrayList的remove方法也提供两种重载的方式。remove(int index)方法移除数组某个位置上的对象,移除之后,index位置后面的所有元素都前移一个位置。而原来的最后的位置上则置空。remove(Object o)方法有所不同,它选遍历数组,通过equals方法来找到与o匹配的对象的位置,再根据位置来移除。所以,后者比前者多了一个查找的过程。
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
HashSet的remove(Object o)方法,是通过HashMap的remove(Object o)方法来移除元素的。(代码略)
【查找元素】
ArrayList通过E get(int index)方法返回数组指定位置的对象。在此过程中,会作一个范围检查,若index大于或等于数组的长度,则抛IndexOutOfBoundsException异常。(代码略)
HashSet因为是无序的,所以不具有根据位置获取元素的方法。
此外,java.lang.System类的arraycopy方法常常在集合类中出现,它实现的功能是将某数组连续位置上的若干元素复制到另一数组的某段连续位置上。它是一个native的方法,我们来看一下它的声明。(See Code)
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
arraycopy方法的5个参数分别表示什么?src指原数组,srcPos是从原数组的什么位置开始复制,dest复制的若干元素放置的目的地数组,destPos是将复制的数组元素放置不目标数组的什么位置上,length指复制的长度,即复制多少个连续的元素。
分享到:
相关推荐
本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...
图文并茂,能让大家很好的理解java中这个重要的知识点。 此文档需要wps或者office软件来查看,如果你没有此软件,到http://www.wps.com.cn 下载wps即可查看此文档。 注:本人所有资源都是共享的,的资源分都是0!
HashSet<T> 类,算法、存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。 Queue 队列,Queue<T> 泛型队列,大学都学过...
编写一个查询类,输入学生学号,若该生在数据文件(test.txt)中存在,在JTextArea中显示该生信息 若该生在数据文件(test.txt)中不存在,显示”查无此人”,可反复查找.在输出中,能显示该生的总成绩和平均成绩,将显示结果...
ArrayList是Java集合框架中的一种动态数组,它提供了方便的数据存储和操作功能,特别适合用于小型数据集的存储。 在Java中,ArrayList类位于`java.util`包下,它是List接口的一个具体实现。ArrayList底层使用数组...
本文将详细探讨Array和ArrayList的异同点,帮助读者更好地理解这两种集合类型的特点及适用场景。 ### Array #### 定义: Array是最基础的数组类型,它是一种固定大小的数据结构,用于存储相同类型的元素集合。...
day07_16_ArrayList练习一_存储随机数字
day07_17_ArrayList练习二_存储自定义对象
day07_15_ArrayList集合存储基本数据类型
ArrayList是Java集合框架中常用的动态数组,它是List接口的一个实现,允许存储包括null在内的所有元素。ArrayList的主要特点是通过数组来存储元素,提供了丰富的操作方法,包括添加、删除、修改和查询等。下面是...
总的来说,理解和运用数组与ArrayList是C#程序员的基本功。在不同的应用场景下选择合适的数据结构,可以显著提高代码的效率和质量。在实际编程中,我们应根据需求选择最合适的解决方案,同时,随着技术的发展,不断...
ArrayList作为数据源,存储了Spinner菜单项,而Widget(Spinner)通过Adapter与ArrayList建立联系。当ArrayList的数据发生变化时,通过Adapter通知Widget更新界面,这就是所谓的数据绑定。 五、Spinner的事件监听 ...
1. **无序性**:`HashSet`中的元素是无序的,即不能保证元素的存储顺序与插入顺序一致。 2. **非同步性**:`HashSet`不是线程安全的。如果多个线程同时对一个`HashSet`进行修改操作,那么必须采取额外措施(如使用`...
在Java编程语言中,集合框架是处理对象组的重要工具,ArrayList是其中的一种。...此外,了解和掌握ArrayList与其他集合类(如LinkedList、HashSet、HashMap等)的区别和应用场景,对于提升编程能力至关重要。
在Java编程语言中,ArrayList、LinkedList、HashMap和HashSet是四个非常重要的集合类,它们分别代表了不同类型的数据结构。这篇文章将深入探讨这些类的源码,以帮助我们更好地理解和运用它们。 首先,ArrayList是一...
`ArrayList`是`List`接口的一个实现,这意味着它可以存储一系列有序的元素,并提供了添加、删除、修改和遍历元素的方法。在深入讨论`ArrayList`之前,让我们先明确一下`集合`的概念。 集合是Java中用于存储多个对象...