本实例基于学习ArrayList的实现原理,实例代码毫无使用价值,供学习使用
具体详情参考如下代码:
package com.yanxun.MyArraylist;
public class SxtArrayList<E> {
private Object[] elementData;
private int size;
public static final int DEFALT_CAPACITY = 10;
public SxtArrayList() {
elementData = new Object[DEFALT_CAPACITY];
}
//构造传参构造大小
public SxtArrayList(int capacity) {
if(capacity < 0)
throw new RuntimeException("这个容器的容量不能为负数");
else if(capacity == 0)
elementData = new Object[DEFALT_CAPACITY];
else
elementData = new Object[capacity];
}
//想容器末尾添加元素
public void add(E element) {
//扩容操作
if(size == elementData.length) {
//申请一个新的大的数组
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
//将原数组拷贝到新数组中,并将索引应用到新数组,好像java会自动回收0引用的对象,所以不用释放之前的申请的内存
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
//获取对应的索引的值
public E get(int index) {
checkRange(index);
return (E)elementData[index];
}
//修改对应位置的索引值
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
//返回当前容器元素个数
public int size() {
return size;
}
//判断当前容器是否为空
public boolean isEmpty() {
return size == 0? true : false;
}
//检查数组下标是否合法,索引下标是否越界
public void checkRange(int index) {
if(index < 0 || index > size - 1) {
//不合法
throw new RuntimeException("索引值不合法" + index);//手动抛出异常
}
}
//移除容器中对应的元素
public void remove(E element) {
//element,将它和所有元素比较,
for(int i = 0; i < size; ++ i){
if(element == elementData[i]) {
//将该元素移除容器
remove(i);
}
}
}
//移除容器中对应索引的元素
public void remove(int index) {
int numMoved = elementData.length - index - 1;
if(numMoved>0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[-- size] = null;
}
//将容器转化成字符串输出,在输出容器时自动调用
public String toString() {
StringBuilder sb = new StringBuilder();//申请一个动态字符串
sb.append('[');
for(int i = 0; i < size; ++ i){//将数组中的对象添加到里面
sb.append(elementData[i] + ",");
}
sb.setCharAt(sb.length()-1,']');//修改最后一个逗号
return sb.toString();//返回字符串
}
public static void main(String[] args) {
SxtArrayList<String> s1 = new SxtArrayList(20);
for(int i = 0; i < 40; ++ i) {
s1.add("gao" + i);
}
System.out.println(s1.get(39));
s1.set("dfs", 10);
s1.remove(3);
System.out.println(s1);
}
}