版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hekai7217/article/details/78834736
自己简单的实现ArrayList的代码,代码注解很清楚了,写了ArrayList的add(obj)方法
remove(index)方法,get(index)方法, 自己定义迭代器,自己进行迭代:
迭代器接口:
public interface Iterator {
/**
* 判断是否有下一个
*/
boolean hasNext();
/**
* 下一个返回的元素
*/
Object next();
/**
* 是否是第一个元素
*/
boolean isFirst(Object obj);
}
集合代码的实现
/**
* @version
* @description 自己实现 集合
*/
public class MyListArrayList{
// ArrayList 的实现原理 是数组
private Object[] elementData;
// 集合中有几个元素
private int size;
/**
* 集合中 有几个 元素
*/
public int size() {
return size;
}
// 构造
public MyListArrayList() {
this(10);
}
public MyListArrayList(int initialCapacity) {
this.elementData = new Object[initialCapacity];
}
/**
* 添加元素的方法
*/
public void add(Object obj) {
gorw(size + 1);
elementData[size++] = obj;
}
public boolean isEmpty() {
return size == 0;
}
/**
* 通过 下标 来返回 集合中对应 的 下标的 元素
*
*/
public Object get(int index) {
rangeCheck(index); // 检查 下标是否 越界没有
return elementData[index];
}
/**
* 通过 下标来移除对应的元素
*/
public void remove(int index) {
rangeCheck(index);
// 删除 之前的
// a b c d e 移除下标为 2 的元素
// 5 - 2 - 1 = 2
// 删除 移动之后的 数组
// a b d e(移动的个数)
int numMoved = size - index - 1;
// index + 1
/**
* src -源数组
* srcPos -源数组中的起始位置。
* dest -目标数组。
* destPos在目标数据的起始位置。 l
* ength-数组元素的数目被复制。
*/
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
// 把最后的 位置 给空 长度 减一
elementData[--size] = null;
}
/**
* 通过 obj移除
*/
public void remove(Object obj) {
for (int i = 0; i < elementData.length; i++) {
if (obj.equals(elementData[i])) {
remove(i);
}
}
}
/**
* 是否包含
*/
public boolean contain(Object obj) {
for (int i = 0; i < elementData.length; i++) {
if (obj.equals(elementData[i])) {
return true;
}
}
return false;
}
/**
* 下标 越界 抛出异常
*/
private void rangeCheck(int index) {
if (index >= size) {
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
/**
* 超过 下标 越界 给出的 信息
*/
private String outOfBoundsMsg(int index) {
// TODO Auto-generated method stub
return "Index: " + index + ", Size: " + size;
}
/**
* 数组的自动扩容
*/
private void gorw(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);
}
/**
* 获取 迭代器
*/
public Iterator iterator() {
return new Itr();
}
/**
* 自己定义的迭代器
* @version
* @description
*/
private class Itr implements Iterator{
int cursor; // index of next element to return
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
int i = cursor;
Object[] elementData = MyListArrayList.this.elementData;
cursor = i + 1;
return elementData[i];
}
@Override
public boolean isFirst(Object obj) {
Object[] elementData = MyListArrayList.this.elementData;
return elementData[0].equals(obj);
}
}
}
测试类代码实现:
/**
* @version
* @description 测试自己定义的 集合类
*/
public class MyListTest {
public static void main(String[] args) {
MyListArrayList myListArrayList = new MyListArrayList(4);
//添加方法
myListArrayList.add("aa");
myListArrayList.add("11");
myListArrayList.add("cc");
myListArrayList.add("22");
myListArrayList.add("小马哥");
//移除方法
myListArrayList.remove("aa");
myListArrayList.remove("11");
//是否包含
System.out.println(myListArrayList.contain("222"));
System.out.println(myListArrayList.size());
//获取元素方法
System.out.println(myListArrayList.get(2));
System.out.println("*******遍历************");
for (int i = 0; i < myListArrayList.size(); i++) {
System.out.println(myListArrayList.get(i));
}
System.out.println("*******iterator*******");
Iterator iterator = myListArrayList.iterator();
//是否为第一个
boolean flag = iterator.isFirst("cc");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}