由于java不熟悉,可能有些地方写的不太好,希望各位大神指点,如果有任何疑问欢迎来探讨。
目标只有代码的部分,之后有时间会补充图文。
一个很蛋疼的问题,java居然不支持泛型数组实例化,这个在c#中轻松编译通过的。
package ListExercise;
import java.util.Arrays;
public class ArrayList<T> {
// 当前数据域
private Object[] datas = null;
// 链表的长度
private int length;
// 当前下标
private int curSize;
// 初始化数组长度,默认值为20
public ArrayList() {
this(20);
}
// 初始化数组长度
public ArrayList(int initialSize) {
if (initialSize >= 0) {
this.length = initialSize;
this.datas = new Object[initialSize];
this.curSize = 0;
} else {
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
}
// 添加元素
public boolean add(T data) {
return add(curSize, data);
}
// 按照位置添加元素
public boolean add(int index, T data) {
boolean ret = false;
checkArrayBorder(index);
if (isFull()) {
trimSize();
}
for (int i = curSize; i > index; i--) {
datas[i] = datas[i - 1];
}
datas[index] = data;
curSize++;
ret = true;
return ret;
}
// 删除元素T
public boolean remove(T t) {
int index = 0;
for (int i = 0; i < datas.length; i++) {
if (datas[i] == t) {
index = i;
break;
}
}
return removeAt(index);
}
// 检车数组是否越界
private void checkArrayBorder(int index) {
if (index < 0 || index > curSize) {
throw new RuntimeException("插入的长度超出数据范围:" + index);
}
}
// 删除第index个元素 ,下标从0开始
public boolean removeAt(int index) {
boolean ret = false;
checkArrayBorder(index);
for (int i = index; i < curSize; i++) {
datas[i] = datas[i + 1];
}
datas[curSize] = null;
ret = true;
curSize--;
return ret;
}
// 获取第index个元素
@SuppressWarnings("unchecked")
public T get(int index) {
return (T) datas[index];
}
// 监测是否满
public boolean isFull() {
return curSize == length;
}
// 当前长度
public int size() {
return curSize;
}
// 当前数组是否为空
public boolean isEmpty() {
return curSize == 0;
}
// 数组扩容
public void trimSize() {
length = length * 2;
datas = Arrays.copyOf(datas, length);
}
// 获取总容量
public int getLength() {
return length;
}
// 打印当前信息
public void print() {
for (int i = 0; i < curSize; i++) {
System.err.println(datas[i]);
}
}
}