一、功能接口:
![功能](https://i-blog.csdnimg.cn/blog_migrate/297e47bd96b121a0cc8b9965a6031b7d.png)
package com.ckw.test.arraylist;
/**
* @author ckw
* @version 1.0
* @date 2020/6/3 15:01
* @description: TestArrayList功能封装
*/
public interface TestArrayListInterface {
//添加元素
void add(Object object);
//添加指定索引位置
void add(int index,Object object);
//移除第一次出现元素
void remove(Object object);
//根据索引移除元素
Object remove(int index);
//获取大小
int getSize();
//根据索引获取元素
Object get(int index);
//根据索引修改元素
void set(int index,Object object);
//获取元素第一次出现的位置
int indexOf(Object o);
//判断是否为空
boolean isEmpty();
//判断元素是否存在
boolean contains(Object o);
//将集合转换成Array
Object[] toArray();
//清空
void clear();
}
二、功能实现:
package com.ckw.test.arraylist;
import java.util.Arrays;
/**
* @author ckw
* @version 1.0
* @date 2020/6/3 14:53
* @description: ArrayList、
* 数组来实现一个简易版的ArrayList
*/
public class TestArrayListInterfaceImpl implements TestArrayListInterface{
//存储数据
private Object[] elementData;
// 记录存储的元素个数
private int size = 0;
//构造方法
public TestArrayListInterfaceImpl() {
this(10);
}
public TestArrayListInterfaceImpl(int initialCapacity) {
//当传入非法参数时,使用默认容量
if( initialCapacity < 0)
initialCapacity = 10;
elementData = new Object[initialCapacity];
}
//扩容
private void grow() {
if (elementData.length <= 1) {
elementData = Arrays.copyOf(elementData, elementData.length + 1);
} else {
//每次扩容一半
elementData = Arrays.copyOf(elementData, elementData.length + (elementData.length >> 1));
}
}
//添加元素
@Override
public void add(Object object) {
// 判断是否需要扩容
if (size >= elementData.length) {
this.grow();
}
// 添加元素
elementData[size] = object;
// 个数+1
size++;
}
@Override
public void add(int index, Object object) {
// 判断是否越界
if (index > size) {
throw new IndexOutOfBoundsException("Index: " + index + " , Size: " + size);
}
// 判断扩容
if (size >= elementData.length) {
this.grow();
}
/*
参数1 :原素组
参数2 : 从元数据的起始位置开始
参数3 : 目标数组
参数4 : 目标数组的开始起始位置
参数5 : 要copy的数组的长度
*/
System.arraycopy(elementData, index, elementData, index + 1, size - index);
// 插入元素
elementData[index] = object;
// 个数+1
size++;
}
//移除元素第一次出现位置
@Override
public void remove(Object object) {
// 获取这个元素的下标
int index = this.indexOf(object);
if (index != -1) {
this.remove(index);
}
}
// 判断下标越界的
private void out(int index) {
if (index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + " , Size: " + size);
}
}
//根据索引移除元素
@Override
public Object remove(int index) {
// 判断下标是否越界
this.out(index);
Object o = this.get(index);
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
// 个数-1
size--;
return o;
}
//获取集合大小
@Override
public int getSize() {
return this.size;
}
@Override
public Object get(int index) {
// 判断越界
this.out(index);
return elementData[index];
}
@Override
public void set(int index, Object object) {
// 判断越界
this.out(index);
elementData[index] = object;
}
//找出元素第一次出现位置
@Override
public int indexOf(Object o) {
for (int i = 0; i < size; i++) {
if (o != null && elementData[i] == o) {
return i;
}
}
return -1;
}
@Override
public boolean isEmpty() {
return size <= 0;
}
@Override
public boolean contains(Object o) {
return this.indexOf(o) != -1;
}
@Override
public Object[] toArray() {
return elementData;
}
@Override
public void clear() {
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i]).append(", ");
}
String str = sb.toString();
if (str.length() > 1)
str = str.substring(0, str.length() - 2);
return str += "]";
}
}
三、测试
package com.ckw.test.arraylist;
/**
* @author ckw
* @version 1.0
* @date 2020/6/3 15:58
* @description:
*/
public class Test {
public static void main(String[] args) {
TestArrayListInterface testArrayListInterface = new TestArrayListInterfaceImpl();
testArrayListInterface.add("1");
testArrayListInterface.add("2");
System.out.println(testArrayListInterface.remove(1).toString());
System.out.println(testArrayListInterface.toString());
}
}