ArrayList中的添加元素、获取指定元素值、设置指定元素值和获取变长数组的长度
ArrayList是基于数组实现的。
ArrayList里有一个属性,这个属性就是一个数组。这个属性会记录我们放了多少数据,这样我们再向其中放置数据时,就会知道该向这个数组的哪个位置放数据了,但是这个数组也会有长度限制,当超过这个限制时,其内部就会创建一个具有更长的长度的数组,然后把旧数组的数据复制到新的数组里边,这样就可以继续往里边放数据了。
而我们在外部是感觉不到这个ArrayList是有长度限制的,它在内部处理好了。通过下图可以理解这个过程。
下边通过具体的程序进行验证。
package abcabc;
import java.util.Arrays;
public class ArrayList {
private static final int INITIAL_SIZE=10;
private int size=0;
private int[] array;
public ArrayList() {
array=new int[INITIAL_SIZE];
}
public ArrayList(int initial) {
if(initial<=0) {
initial=INITIAL_SIZE;
}
array=new int[initial];
}
/**
* 添加元素
* @param num
*/
public void add(int num) {
if(size==array.length) {
array=Arrays.copyOf(array,size*2);
}
array[size++]=num;
}
/**
* 获取指定位置的元素值
* @param i
* @return
*/
public int get(int i) {
if(i>=size) {
throw new IndexOutOfBoundsException("获取元素位置超过了最大长度");
}
return array[i];
}
/**
* 设置指定位置的元素值
* @param i
* @param num
* @return
*/
public int set(int i,int num) {
int oldNum=get(i);
array[i]=num;
return oldNum;
}
/**
* 获取变更数组的长度
* @return
*/
public int size() {
return size;
}
}
下边为具体的测试程序
package abcabc;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList arrayList=new ArrayList(1);
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
arrayList.add(5);
//获取数组下标为3的值,实际上也就是第4个位置的值,打印出来为4
System.out.println(arrayList.get(3));
arrayList.set(3, 9);
System.out.println(arrayList.get(3));
//变长数组的长度为5,实际上内部数组长度为8,在add(2)和add(5)时,分别进行了数组长度翻倍和数组复制
System.out.println(arrayList.size());
}
}
下边是具体的程序运行结果