說明:https://mp.csdn.net/mdeditor/94589662#
自己嘗試寫一個ArrayList。寫的方法都是一些基本方法,沒有很花裏胡哨。ArrayList和下一篇的LinkedList是鏈表類中兩個核心。這篇主要是ArrayList,個人感覺ArrayList好像比LinkedList難寫一些。有一些迷。
下面是代碼:
/*
真正的ArrayList是有modCount進行記錄是否更改的
但是這個程序並沒有。ArrayList是線程不安全的。
故這個程序中的迭代器實現是存在問題的,因爲它無法發現ArrayList是否已經更改,但是如果有modCount通過一些手段發現。
ArrayList和LinkedList都是線程不安全的,都有modCount(這個值在他們的父類中定義)記錄是否已經更改
*/
package code.hc.util;
import java.util.Arrays;
public class HArrayList<E> implements HList<E> {
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENT_DATA = {};
private Object[] elementData;
private int size;
public HArrayList(){
elementData = new Object[DEFAULT_CAPACITY];
size = 0;
}
public HArrayList(int initial_capacity){
if(initial_capacity < 0) throw new IllegalArgumentException("initial_capacity : " + initial_capacity);
if(initial_capacity == 0){
elementData = EMPTY_ELEMENT_DATA;
}else {
this.elementData = new Object[initial_capacity];
}
size = 0;
}
public void ensureCapacity(int minCapacity){
int oldCapacity = elementData.length;
if(minCapacity > oldCapacity){
int newCapacity = oldCapacity + (oldCapacity >> 1);
if(newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
public void trimToSize(){
if(size < elementData.length){
elementData = (size == 0)?EMPTY_ELEMENT_DATA: Arrays.copyOf(elementData,size);
}
}
public int indexOf(Object o){
if(o == null)return -1;
for(int index = 0; index < size; index++){
if(o.equals(elementData[index])){
return index;
}
}return -1;
}
public int lastIndexOf(Object o){
if(o == null) return -1;
for (int index = size-1; index >= 0; index--){
if(o.equals(elementData[index])){
return index;
}
}
return -1;
}
@SuppressWarnings("unchecked")
public E get(int index){
return (E)elementData[index];
}
@Override
public HListIterator<E> listIterator() {
return new HArrayListIterator();
}
@Override
public void add(E e) {
if(e == null)return ;
ensureCapacity(size + 1);
elementData[size++] = e;
}
public void add(int index, E e){
if(e == null)return ;
if(checkIndex(index)){
ensureCapacity(size + 1);
System.arraycopy(elementData, index, elementData, index + 1,size - index);
elementData[index] = e;
size++;
}
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public HIterator<E> iterator() {
return new HCollectionIterator();
}
@Override
public boolean contain(E e) {
return indexOf(e) >= 0;
}
@Override
public void remove(E e) {
if(e == null)return ;
for(int index = 0; index < size; index++){
if(e.equals(elementData[index])){
remove(index);
return;
}
}
}
@Override
public boolean remove(int index) {
if(!checkIndex(index))return false;
int number = size - index - 1;
if(number > 0){
System.arraycopy(elementData,index+1,elementData,index,number);
}elementData[--size] = null;
return true;
}
@Override
public void clear() {
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
@Override
public int size() {
return size;
}
public void set(int index, E e){
boolean bool = checkIndex(index);
if(bool){
elementData[index] = e;
}
}
private boolean checkIndex(int index){
return index >= 0 && index < size;
}
private class HCollectionIterator implements HIterator<E>{
private int cursor;
HCollectionIterator(){
cursor = 0;
}
@Override
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
@Override
public E next() {
E retVal = (E)elementData[cursor];
cursor++;
return retVal;
}
}
private class HArrayListIterator implements HListIterator<E> {
private int cursor;
HArrayListIterator(){
cursor = 0;
}
@Override
public boolean hasPrevious() {
return false;
}
@Override
public E previous() {
return null;
}
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
}