一、仿ArrayList代码实现
package array;
import LinkedList.interfaces.List;
import java.util.Collection;
import java.util.Iterator;
public class ArrayList<T> implements List<T> {
private Object[] elements;
private static final int DEFAULT_CAPACITY = 10;
private static final int OBJECT_NOT_FOUND = -1;
private int size;
public ArrayList(){
elements = new Object[DEFAULT_CAPACITY];
}
public ArrayList(int capacity){
if (capacity > 0) elements = new Object[capacity];
else elements = new Object[DEFAULT_CAPACITY];
}
public ArrayList(Collection<T> collection){
if (collection == null){
throw new NullPointerException();
}
elements = collection.toArray();
}
@Override
public int size() {
return size;
}
@Override
@SuppressWarnings("unchecked")
public T get(int i) {
if (indexToCheck(i)) {
throw new IndexOutOfBoundsException("index: " + i);
}
return (T) elements[i];
}
private boolean indexToCheck(int index) {
return index < 0 || index >= size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(T e) {
return indexOf(e) >= 0;
}
@Override
public int indexOf(T e) {
elementsAndValueCheck(e);
int tempIndex = 0;
for (Object element : elements) {
if (element == e || e.equals(element)) {
return tempIndex;
}
tempIndex++;
}
return OBJECT_NOT_FOUND;
}
@Override
public boolean add(int i, T e) {
if (e == null) {
throw new NullPointerException("Value is Null");
}
if (checkCapacity()) {
addCapacity();
}
for (int j = size; j >= i+1 ; j--) {
elements[j] = elements[j-1];
}
elements[i] = e;
size++;
return true;
}
private boolean checkCapacity() {
return size >= (elements.length / 2);
}
private void addCapacity() {
Object[] newElements = new Object[(elements.length + elements.length / 2)];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
@Override
public boolean add(T e) {
if (e == null){
throw new NullPointerException("Value is Null");
}
add(size, e);
return true;
}
@Override
public boolean addBefore(T obj, T e) {
if (size == 0){
throw new IndexOutOfBoundsException();
}
if (obj == null) throw new NullPointerException();
if (e == null) throw new NullPointerException();
int index = indexOf(obj);
if (index == OBJECT_NOT_FOUND) return false;
add(index, e);
return true;
}
@Override
public boolean addAfter(T obj, T e) {
if (size == 0){
throw new IndexOutOfBoundsException();
}
if (obj == null) throw new NullPointerException();
if (e == null) throw new NullPointerException();
for (int i = 0; i < size; i++) {
if (obj == elements[i] || obj.equals(elements[i])){
add(i+1, e);
break;
}
}
return true;
}
@Override
@SuppressWarnings("unchecked")
public T remove(int i) {
if (size == 0 || indexToCheck(i)) {
throw new IndexOutOfBoundsException("index: " + i);
}
T oldObject = (T) elements[i];
for (int j = i; j <= size - 2; j++) {
elements[j] = elements[j + 1];
}
size--;
return oldObject;
}
@Override
public boolean remove(T e) {
elementsAndValueCheck(e);
int tempIndex = 0;
for (Object element : elements) {
if (element == e || e.equals(element)) {
return remove(tempIndex) != null;
}
tempIndex++;
}
size--;
return false;
}
@Override
@SuppressWarnings("unchecked")
public T replace(int i, T e) {
if(indexToCheck(i)){
throw new IndexOutOfBoundsException();
}
if (e == null) throw new NullPointerException();
T oldObject = (T) elements[i];
elements[i] = e;
return oldObject;
}
@Override
public boolean clear() {
if (size == 0) return true;
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
return true;
}
@Override
public Iterator<T> iterator() {
return new MyIterator();
}
class MyIterator implements Iterator<T>{
private int index = 0;
@Override
public boolean hasNext() {
return index != size;
}
@Override
@SuppressWarnings("unchecked")
public T next() {
T object = (T) elements[index];
index++;
return object;
}
}
@SuppressWarnings("unchecked")
public T[] toArray(){
Object[] objects = new Object[size];
for (int i = 0; i < size; i++) {
objects[i] = elements[i];
}
return (T[])objects;
}
private void elementsAndValueCheck(T e) {
if (size == 0) {
throw new IndexOutOfBoundsException();
}
if (e == null) {
throw new NullPointerException("value is null");
}
}
}