/*
* created by Harry 2017-2-20 18:53:38
* 实现简单的ArrayList,具有基本的增删改查功能
*/
package com.github.HarryHook.coding2017.basic;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class MyArrayList implements List {
private int size = 0; // 数组元素个数
private Object[] elementData = new Object[10]; // 初始化数组大小为10
// 将元素添加到数组尾部
public void add(Object o) { // 需要判断数组空间是否够用
ensureCapacity(size + 1);
elementData[size++] = o;
}
// 在指定位置添加元素
public void add(int index, Object o) {
// 判断下标记是否越界
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
ensureCapacity(size + 1);
// 判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移
if (elementData[index] == null) {
elementData[index] = o;
} else {
for (int i = elementData.length - 1; i > index; i--) {
elementData[i] = elementData[i - 1];
}
elementData[index] = o;
}
size++;
/*
* //判断索引位置是否正确 if (index > size || index < 0) throw new
* IndexOutOfBoundsException( "Index: " + index + ", Size: " + size);
* //扩容检测 ensureCapacity(size+1); /* 对源数组进行复制处理(位移),从index +
* 1到size-index。 主要目的就是空出index位置供数据插入, 即向右移动当前位于该位置的元素以及所有后续元素。
*
* System.arraycopy(elementData, index, elementData, index + 1, size -
* index); //在指定位置赋值 elementData[index] = 0; size++;
*
*/
}
public Object get(int index) {
// 若index超出size应该抛出异常
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
return elementData[index];
}
public Object remove(int index) { // 涉及到元素移位
Object oldValue = elementData[index];
for (int i = index; i < elementData.length - 1; i++)
elementData[i] = elementData[i + 1];
elementData[--size] = null;
return oldValue;
}
// 判断是否需要给数组扩容
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
// Object oldData[] = elementData;
// //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存
int newCapacity = (oldCapacity * 3) / 2 + 1; // 增加50%+1
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
// 返回数组的大小
public int size() {
return size;
}
public Iterator iterator() {
return new MyArrayListIterator();
}
private class MyArrayListIterator implements Iterator {
private int cursor = 0; // 记录索引位置
public boolean hasNext() {
return cursor != size;
}
public Object next() {
try {
Object next = get(cursor);
cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
}
public static void main(String[] args) {
MyArrayList myArrays = new MyArrayList();
myArrays.add(3);
myArrays.add(0, 11);
myArrays.add(1, 2);
myArrays.add(3, 5);
myArrays.add(2, 1);
myArrays.add(7);
Print(myArrays);
for (int i = 0; i < 19; i++)
myArrays.add(i, 55);
System.out.println("获取指定位置元素: " + myArrays.get(2));
System.out.println("删除指定位置元素: " + myArrays.remove(1));
System.out.println("当前元素个数:" + myArrays.size());
Print(myArrays);
}
public static void Print(MyArrayList myArrays) {
Iterator it = myArrays.iterator();
System.out.println("对链表中的元素进行打印:");
while (it.hasNext())
System.out.print(it.next() + " ");
System.out.println("");
System.out.println("当前元素个数: " + myArrays.size());
}
}