public interface MyList < E> {
public int size ( ) ;
public boolean isEmpty ( ) ;
public boolean contains ( Object o) ;
public boolean add ( E e) ;
public boolean remove ( Object o) ;
public void clear ( ) ;
public E get ( int index) ;
public E set ( int index, E element) ;
public void add ( int index, E element) ;
public E remove ( int index) ;
public int indexOf ( Object o) ;
public int lastIndexOf ( Object o) ;
public ListIterator< E> listIterator ( ) ;
public ListIterator< E> listIterator ( int index) ;
}
import java. util. *;
import java. util. function. Consumer;
public class MyArrayList < E> implements MyList < E> {
private Object[ ] elementsObj;
private int size;
private static final int DEFAULT_CAPACITY = 10 ;
private static final Object[ ] DEFAULT_EMPTY_ELEMENTS = { } ;
private static final int MAX_CAPACITY = Integer. MAX_VALUE - 8 ;
private int modCount;
public MyArrayList ( ) {
elementsObj = DEFAULT_EMPTY_ELEMENTS;
}
public MyArrayList ( int capacity) {
elementsObj = new Object [ capacity] ;
}
@Override
public int size ( ) {
return size;
}
@Override
public boolean isEmpty ( ) {
return size == 0 ;
}
@Override
public boolean contains ( Object o) {
if ( indexOf ( o) != - 1 ) {
return true ;
}
return false ;
}
@Override
public boolean add ( E e) {
add ( size , e) ;
return true ;
}
private void ensureElementsCapatity ( int minCapacity) {
int newCapacity = minCapacity;
if ( minCapacity < elementsObj. length) {
return ;
}
newCapacity = minCapacity + ( minCapacity >> 1 ) ;
if ( minCapacity > newCapacity) {
newCapacity = MAX_CAPACITY;
}
grow ( newCapacity) ;
}
private void grow ( int minCapacity) {
Object[ ] newElements = new Object [ minCapacity] ;
for ( int i = 0 ; i < size; i++ ) {
newElements[ i] = elementsObj[ i] ;
}
elementsObj = newElements;
}
@Override
public boolean remove ( Object o) {
int i = indexOf ( o) ;
if ( i != - 1 ) {
remove ( i) ;
return true ;
}
return false ;
}
@Override
public void clear ( ) {
for ( int i = 0 ; i < size; i++ ) {
elementsObj[ i] = null;
}
size = 0 ;
modCount++ ;
}
@Override
public E get ( int index) {
checkIndexRemove ( index) ;
return ( E) elementsObj[ index] ;
}
@Override
public E set ( int index, E element) {
checkIndexRemove ( index) ;
E e = ( E) elementsObj[ index] ;
elementsObj[ index] = element;
return e;
}
@Override
public void add ( int index, E element) {
checkIndex ( index) ;
if ( elementsObj == DEFAULT_EMPTY_ELEMENTS) {
elementsObj = new Object [ DEFAULT_CAPACITY] ;
}
int minCapacity = size + 1 ;
ensureElementsCapatity ( minCapacity) ;
for ( int i = size ; i > index ; i-- ) {
elementsObj[ i] = elementsObj[ i- 1 ] ;
}
elementsObj[ index] = element;
size++ ;
modCount++ ;
}
private void checkIndex ( int index) {
if ( index < 0 || index > size) {
throw new IndexOutOfBoundsException ( "index = " + index) ;
}
}
@Override
public E remove ( int index) {
checkIndexRemove ( index) ;
E e = ( E) elementsObj[ index] ;
for ( int i = index; i < size - 1 ; i++ ) {
elementsObj[ i] = elementsObj[ i + 1 ] ;
}
size-- ;
modCount++ ;
return e;
}
private void checkIndexRemove ( int index) {
if ( index < 0 || index >= size) {
throw new IndexOutOfBoundsException ( "index = " + index) ;
}
}
@Override
public int indexOf ( Object o) {
if ( o == null) {
for ( int i = 0 ; i < size; i++ ) {
if ( elementsObj[ i] == o) {
return i;
}
}
} else {
for ( int i = 0 ; i < size; i++ ) {
if ( o. equals ( elementsObj[ i] ) )
return i;
}
}
return - 1 ;
}
@Override
public int lastIndexOf ( Object o) {
if ( o == null) {
for ( int i = size - 1 ; i > 0 ; i-- ) {
if ( elementsObj[ i] == o) {
return i;
}
}
} else {
for ( int i = size - 1 ; i > 0 ; i-- ) {
if ( o. equals ( elementsObj[ i] ) )
return i;
}
}
return - 1 ;
}
@Override
public ListIterator< E> listIterator ( ) {
return new ListItr ( ) ;
}
@Override
public ListIterator< E> listIterator ( int index) {
return new ListItr ( index) ;
}
@Override
public String toString ( ) {
StringBuffer str = new StringBuffer ( ) ;
str. append ( "[" ) ;
if ( size > 0 ) {
for ( int i = 0 ; i < size - 1 ; i++ ) {
str. append ( ( String) elementsObj[ i] . toString ( ) + "," ) ;
}
str. append ( elementsObj[ size - 1 ] . toString ( ) ) ;
}
str. append ( "]" ) ;
return str. toString ( ) ;
}
private class ListItr implements ListIterator < E> {
private int cursor ;
private int lastRet = - 1 ;
private int expectModCount = modCount;
public ListItr ( ) {
}
public ListItr ( int index) {
cursor = index;
}
@Override
public boolean hasNext ( ) {
return cursor != size;
}
@Override
public E next ( ) {
checkCountIsChanged ( ) ;
int i = cursor;
if ( cursor == size) {
throw new NoSuchElementException ( "没有下一个元素" ) ;
}
lastRet = i;
return ( E) elementsObj[ cursor++ ] ;
}
@Override
public boolean hasPrevious ( ) {
return cursor != 0 ;
}
@Override
public E previous ( ) {
checkCountIsChanged ( ) ;
int i = cursor;
if ( cursor == 0 ) {
throw new NoSuchElementException ( "没有上一个元素" ) ;
}
lastRet = i - 1 ;
return ( E) elementsObj[ -- cursor] ;
}
@Override
public int nextIndex ( ) {
return cursor;
}
@Override
public int previousIndex ( ) {
return cursor - 1 ;
}
@Override
public void remove ( ) {
checkCountIsChanged ( ) ;
checkLastRet ( ) ;
MyArrayList. this . remove ( lastRet) ;
expectModCount = modCount;
cursor = lastRet;
lastRet = - 1 ;
}
private void checkLastRet ( ) {
if ( lastRet < 0 ) {
throw new IllegalStateException ( "lastRet " + lastRet) ;
}
}
private void checkCountIsChanged ( ) {
if ( expectModCount != modCount) {
throw new ConcurrentModificationException ( "集合结构被并发修改" ) ;
}
}
@Override
public void set ( E e) {
checkCountIsChanged ( ) ;
MyArrayList. this . set ( lastRet , e) ;
}
@Override
public void add ( E e) {
checkCountIsChanged ( ) ;
try {
MyArrayList. this . add ( cursor , e) ;
lastRet = - 1 ;
cursor ++ ;
expectModCount = modCount;
} catch ( ConcurrentModificationException ex) {
throw new ConcurrentModificationException ( ) ;
}
}
}
}
import java. util. List;
import java. util. ListIterator;
public class MytArrayTest {
public static void main ( String[ ] args) {
MyArrayList< String> list = new MyArrayList ( ) ;
for ( int i = 0 ; i < 10 ; i++ ) {
list. add ( i , String. valueOf ( i) ) ;
}
ListIterator< String> strlist = list. listIterator ( ) ;
System. out. println ( "向集合中插入十个元素" + list) ;
list. add ( "3" ) ;
System. out. println ( "在末尾插入一个3" + list) ;
list. add ( 1 , "44" ) ;
System. out. println ( "在索引1的位置插入一个44" + list) ;
list. set ( 0 , "00" ) ;
System. out. println ( "将第0个索引的值置为00" + list) ;
String s = list. get ( 1 ) ;
System. out. println ( "获取第1个索引位置的元素" + s) ;
list. remove ( "3" ) ;
System. out. println ( "移除集合中3这个元素之后 " + list) ;
boolean contains = list. contains ( "3" ) ;
System. out. println ( "判断集合中是否含有元素3 " + contains) ;
ListIterator< String> listItr= list. listIterator ( ) ;
while ( listItr. hasNext ( ) ) {
String next = listItr. next ( ) ;
if ( "9" . equals ( next) ) {
listItr. set ( "999" ) ;
}
if ( "8" . equals ( next) ) {
listItr. remove ( ) ;
listItr. add ( "888" ) ;
}
}
System. out. println ( "将集合中元素9 , 置为999 。将集合中元素为8的元素移除并在该位置加上888 " + list) ;
System. out. print ( "向前遍历的结果:" ) ;
while ( listItr. hasPrevious ( ) ) {
String next = listItr. previous ( ) ;
System. out. print ( next + " " ) ;
}
System. out. println ( ) ;
while ( listItr. hasNext ( ) ) {
String next = listItr. next ( ) ;
if ( "888" . equals ( next) ) {
list. remove ( "999" ) ;
list. remove ( "00" ) ;
}
}
System. out. println ( "在迭代器迭代过程中用集合方法删除不会抛异常的情况" + list) ;
}
}