自己实现ArrayList
Java中有一个ArrayList和C++中Vector非常的相似。
/*
* 自己实现ArrayList
*/
public class SxtArrayList {
private Object[] elementData;
private int size;
public int size(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public SxtArrayList(){
this(10); // 默认数组的长度是10
}
public SxtArrayList(int initialCapacity){
if(initialCapacity < 0){//鲁棒性
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity]; //创建大小为in...的数组
}
public void add(Object obj){
//数组扩容
ensureCapacity();
elementData[size] = obj;
size++;
}
public void add(int index, Object obj){
rangeCheck(index);
//数组扩容
ensureCapacity();
System.arraycopy(elementData, index,
elementData, index+1, size - index);//copy
elementData[index] = obj;
size++;
}
/*
* 数组扩充函数
*/
public void ensureCapacity(){
//数组扩容
if(size >= elementData.length){
Object [] newArray = new Object[size*2 + 1];
System.arraycopy(elementData,
0, newArray, 0, elementData.length);//copy
elementData = newArray;
}
}
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
public Object set(int index, Object obj){
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
public void remove(int index){
rangeCheck(index);
int oldMoved = size - index - 1;
if(oldMoved > 0){
System.arraycopy(elementData, index+1, elementData, index, oldMoved);
}
elementData[--size] = null;//不在后边是防止越界
}
public void remove(Object obj){
for(int i = 0; i< size; i++){
if(get(i).equals(obj)){
remove(i);
}
}
}
private void rangeCheck(int index){
if(index <0 || index >= size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
SxtArrayList list = new SxtArrayList(3);
list.add("111");
list.add("222");
list.add("33");
list.add("1");
list.add("555");
list.remove("555");
list.set(0, "不是111");
list.add(0, "是000");
System.out.println(list.get(0));//get获取的是数组中的值所以是"是000"
System.out.println(list.size());
}
}
SxtArrayList相当于一个动态数组,可以在一定条件下自动变大。
其中有一个基础的数组容器是Object类型的elementData[]。
int变量size用来记录SxtArrayList中有效值的个数。
public boolean isEmpty(){
return size == 0;
}
判断SxtArrayList对象是否为空。
public SxtArrayList(){
this(10); // 默认数组的长度是10
}
public SxtArrayList(int initialCapacity){
if(initialCapacity < 0){//鲁棒性
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity]; //创建大小为in...的数组
}
带参数的构造函数和不带参数的构造函数。不带参数的构造函数会使用默认值通过this方式调用带参构造函数。SxtArrayList() -> SxtArrayList(int initialCapacity)。
public void add(Object obj){
//数组扩容
ensureCapacity();
elementData[size] = obj;
size++;
}
public void add(int index, Object obj){
rangeCheck(index);
//数组扩容
ensureCapacity();
System.arraycopy(elementData, index,
elementData, index+1, size - index);//copy
elementData[index] = obj;
size++;
}
/*
* 数组扩充函数
*/
public void ensureCapacity(){
//数组扩容
if(size >= elementData.length){
Object [] newArray = new Object[size*2 + 1];
System.arraycopy(elementData,
0, newArray, 0, elementData.length);//copy
elementData = newArray;
}
}
add是SxtArrayList的增加数据的方法。
由于参数中都为Object类型,所以SxtArrayList存放地可以是任意类型。
在添加数据之前进行判断是否现有的elementData[]数组是否可以放下新添加的数据(已经装满没)。若不能添加,则调用ensureCapacity()函数“扩大”数组elementData[]的大小。
private void rangeCheck(int index){
if(index <0 || index >= size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
对于数组的操作是不能离开下标的,而下标常常会产生运行时错误,rangeCheck()是用来判断下标是否越界的。
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
public Object set(int index, Object obj){
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
修改elementData[]数组位置index中存放的值,获取elementData[]数组位置index中存放的值。
public void remove(int index){
rangeCheck(index);
int oldMoved = size - index - 1;
if(oldMoved > 0){
System.arraycopy(elementData, index+1, elementData, index, oldMoved);
}
elementData[--size] = null;//不在后边是防止越界
}
public void remove(Object obj){
for(int i = 0; i< size; i++){
if(get(i).equals(obj)){
remove(i);
}
}
}
移除特定的对象,可以通过下标和Object对象方式进行查找,equals只是值判断。