package com.lovo;
import java.util.Arrays;
/**
* 超级数组
* @author XWJ
*
* @param <T> 泛型参数
*/
public class SuperArray<T> {
private T[] array; // 装元素的数组
private int size; // 超级数组中元素的个数
/**
* 超级数组的构造器
*/
public SuperArray() {
this(16); // 调用下面重载的构造器将初始容量设置为16
}
/**
* 超级数组的构造器
* @param capacity 初始容量
*/
public SuperArray(int capacity) {
// Java中不允许new泛型类型 因此要new一个Object类型的数组再强转成T类型的数组
array = (T[]) new Object[capacity];
}
/**
* 添加元素
*/
public void add(T x) {
if(size == array.length) {
array = Arrays.copyOf(array, array.length != 0? array.length * 2 : 1); // 将存储空间扩大一倍
}
array[size++] = x; // 将元素放入数组并将数组大小加1
}
/**
* 删除元素
* @param x 要删除的对象
*/
public void remove(T x) {
for(int i = 0; i < size; i++) {
if(array[i].equals(x)) { // 在数组中找到对象x
for(int j = i; j < size - 1; j++) { // 将后面的元素向前移动覆盖掉x
array[j] = array[j + 1];
}
size -= 1; // 数组大小减1
}
}
}
/**
* 删除元素
* @param index 删除元素的位置
*/
public void removeAt(int index) {
if(index >= size || index < 0) { // 越界就抛出异常
throw new IndexOutOfBoundsException("超级数组下标越界: " + index);
}
for(int i = index; i < size - 1; i++) { // 用后面的元素覆盖index对应位置的元素
array[i] = array[i + 1];
}
size -= 1; // 数组大小减1
}
/**
* 清空超级数组
*/
public void clear() {
for(int i = 0; i < size; i++) {
array[i] = null; // 防止内存泄露
}
size = 0; // 数组大小设置成0就没有元素可以访问相当于清空了数组
}
/**
* 获取元素
* @param index 获取元素的位置
*/
public T get(int index) {
if(index < 0 || index >= size) { // 越界就抛出异常
throw new IndexOutOfBoundsException("超级数组下标越界: " + index);
}
return array[index]; // 返回索引位置的元素
}
/**
* 获得超级数组中元素的个数
*/
public int size() {
return size;
}
/**
* 获得超级数组的容量
*/
public int capacity() {
return array.length;
}
/**
* 超级数组是否没有元素
* @return 没有元素返回true否则返回false
*/
public boolean isEmpty() {
return size == 0;
}
}