用java實現棧 和隊列,,並查看java源碼
動態數組容器ArrayList(泛型容器)
1. 對於主要方法,不在這贅述
2. 基本原理
對於基本原理類似於 動態數組DynamicArray
public class DynamicArray < E> {
private static final int DEFAULT_CAPACITY = 10 ;
private int size;
private Object[ ] elementData;
public DynamicArray ( ) {
this . elementData = new Object [ DEFAULT_CAPACITY] ;
}
private void ensureCapacity ( int minCapacity) {
int oldCapacity = elementData. length;
if ( oldCapacity >= minCapacity) {
return ;
}
int newCapacity = oldCapacity * 2 ;
if ( newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays. copyOf ( elementData, newCapacity) ;
}
public void add ( E e) {
ensureCapacity ( size + 1 ) ;
elementData[ size++ ] = e;
}
public E get ( int index) {
return ( E) elementData[ index] ;
}
public int size ( ) {
return size;
}
public E set ( int index, E element) {
E oldValue = get ( index) ;
elementData[ index] = element;
return oldValue;
}
}
3. 在ArrayList 的接口 實現 了迭代的接口(Iterable)
實現了迭代就可以使用更加的簡化的foreach 語法,
iterable 和 iterator 是不一樣的,
Iterable 表示 對象可以被迭代,他有一個方法iterator 返回iterator對象,實際是對iterator接口的方法進行遍歷
如果對象實現了iterable,就可以創建foreach語法
類可以不實現iterable ,也可以創建iterator 對象
迭代的陷進
就是 不能在迭代的過程中調用容器的刪除方法public void remove ( ArrayList< Integer> list) {
for ( Integer a : list) {
if ( a <= 100 ) {
list. remove ( a) ;
}
}
}
但是如果改成 這樣 ,就不會報錯 public void remove ( ArrayList< Integer> list) {
for ( Integer a : list) {
if ( a <= 100 ) {
list. remove ( ) ;
}
}
}
ArrayList 的迭代原理 public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
使用迭代器 表示的是一種關注點分離的思想,將數據的實際組織方式與數據的迭代遍歷相分離,這是一種常見的設計模式
4. ArrayList實現的接口
三個主要的接口: collection, List, RandomAccess
1. collection
表示一個數據集合,數據間沒有位置和順序的概念
主要的方法 可以通過點擊查看源碼,更加有深刻的認識
2. List
表示有順序或位置的數據集合,它更是擴展了Collection
3. RandomAccess
這個定義是空的 public iterface RandomAccess{
}
這種沒有任何代碼的接口在java 中被稱為標記接口 ,用於聲明類的一種屬性
這里實現,接口表示,可以隨機訪問,可隨機訪問就是具備類似數組那樣的特性
5. 總結ArrayList
對於ArrayList 他的特點就是內部采用動態隨機數組實現,
可以隨機訪問,按照索引位置進行訪問效率高,O(1)
除非數組已經排序,不然按照內容排序,效率低O(n)
添加N個元素的效率為O(n)
插入和刪除元素的效率比較低,因為要移動元素O(n)