Java集合框架
自己定义一个类,实现集合的增删改查
import java.util.Arrays;
//将arraylist中的方法写一遍
public class MyPrcatice {
//存储数据的数组
private Object[] data;
//记录元素个数
private int size;
//初始容量
public MyPrcatice() {
data = new Object[0];
}
public MyPrcatice(int capcity) {
if (capcity <= 0) {
data = new Object[0];
} else {
data = new Object[capcity];
}
}
// 扩容方法,当前类中其他方法的辅助,所以不需要为外界提供该功能
private void grow() {
/*
* 先需要扩容 容量最小需要size+1
*/
if (data.length <= size + 1) {
int newCapcity = data.length * 2 + 10; // 首次扩容防止为0
if (newCapcity < size + 1) {
newCapcity = size + 1;
}
// 将数组扩容为新容量
data = Arrays.copyOf(data, newCapcity);
}
}
// 向末尾添加元素
public void add(Object element) {
grow();
data[size] = element; // o- size-1 都有元素 size 空着
size++;
}
// 向指定位置添加元素
public void add(int index, Object element) {
if (index < 0 || index > size) { // 判断下标是否合理
// 抛出异常
throw new IndexOutOfBoundsException("index的范围需要在[0 " + size + "]");
}
// 向末尾添加,直接调
if (index == size) {
add(element);
}
// 扩容
grow();
/*
* 将index位置挪出 size -1 (最后一个元素) size size -2 size -1
*
* ... index index + 1
*/
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
// 将新元素放到index处
data[index] = element;
size++;
}
// 判断下标是否在[0 size-1]之间
public void indexCheck(int index) {
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException("下标越界,index = " + index);
}
}
// 根据下标获取元素
public Object get(int index) {
indexCheck(index);
return data[index];
}
// 修改元素,返回值为修改之前的值
public Object set(int index, Object newElement) {
indexCheck(index);
Object old = data[index];
data[index] = newElement;
return old;
}
// 按照下标删除元素,把旧值保存起来
public Object remove(int index) {
indexCheck(index);
// 从index+1 到size-1集体向前挪动一格
/*
* index + 1 size -1 1 2 1 9 10 20
*
* 需要挪动的元素个数: (size - 1 ) - (index + 1) + 1 size - index - 1
*
* 如果要删除的最后一个元素,算出来挪动的元素个数为0
*
*/
Object old = data[index];
int moved = size - index - 1;
if (moved > 0) {
System.arraycopy(data, index + 1, data, index, moved);
}
// 将最后一个元素赋值为null
data[size - 1] = null;
// 将元素个数减1
size--;
return old;
}
// 获取元素个数
public int getSize() {
return size;
}
// 根据元素获取第一次出现的位置,需要下标就用for循环
public int indexOf(Object element) {
if (element == null) {
for (int i = 0; i < size; i++) {
if (data[i] == element) {
return i;
}
}
}else {
for (int i = 0; i < size; i++) {
if (element.equals(data[i])) {
return i;
}
}
}
return -1;
}
//找最后一次出现的位置
public int lastIndexOf(Object element) {
if (element == null) {
for (int i = size -1; i >=0 ; i--) {
if (data[i] == element) {
return i;
}
}
}else {
for (int i = size -1; i >=0 ; i--) {
if (element.equals(data[i])) {
return i;
}
}
}
return -1;
}
//将数组的长度变的和元素个数一样多
public void trimSize() {
data = Arrays.copyOf(data, size);
}
}