public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object var1);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] var1);
boolean add(E var1);
boolean remove(Object var1);
boolean containsAll(Collection<?> var1);
boolean addAll(Collection<? extends E> var1);
boolean addAll(int var1, Collection<? extends E> var2);
boolean removeAll(Collection<?> var1);
boolean retainAll(Collection<?> var1);
default void replaceAll(UnaryOperator<E> var1) {
Objects.requireNonNull(var1);
ListIterator var2 = this.listIterator();
while(var2.hasNext()) {
var2.set(var1.apply(var2.next()));
}
}
default void sort(Comparator<? super E> var1) {
Object[] var2 = this.toArray();
Arrays.sort(var2, var1);
ListIterator var3 = this.listIterator();
Object[] var4 = var2;
int var5 = var2.length;
for(int var6 = 0; var6 < var5; ++var6) {
Object var7 = var4[var6];
var3.next();
var3.set(var7);
}
}
void clear();
boolean equals(Object var1);
int hashCode();
E get(int var1);
E set(int var1, E var2);
void add(int var1, E var2);
E remove(int var1);
int indexOf(Object var1);
int lastIndexOf(Object var1);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int var1);
List<E> subList(int var1, int var2);
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 16);
}
}
接下來看看ArrayList的實現方式。看名字就知道離不開數組,原理大致的描述爲:它實現List接口、底層使用數組保存所有元素。其操作基本上是對數組的操作,是List接口的可變數組的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。每個ArrayList實例都有一個容量,該容量是指用來存儲列表元素的數組的大小。它總是至少等於列表的大小。隨着向ArrayList中不斷添加元素,其容量也自動增長。自動增長會帶來數據向新數組的重新拷貝,因此,如果可預知數據量的多少,可在構造ArrayList時指定其容量。在添加大量元素前,應用程序也可以使用ensureCapacity操作來增加ArrayList實例的容量,這可以減少遞增式再分配的數量。
注意,此實現不是同步的。如果多個線程同時訪問一個ArrayList實例,而其中至少一個線程從結構上修改了列表,那麼它必須保持外部同步。最好的原理就是看源碼的實現方式:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
public ArrayList(int var1) {
if(var1 > 0) {
this.elementData = new Object[var1];
} else {
if(var1 != 0) {
throw new IllegalArgumentException("Illegal Capacity: " + var1);
}
this.elementData = EMPTY_ELEMENTDATA;
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> var1) {
this.elementData = var1.toArray();
if((this.size = this.elementData.length) != 0) {
if(this.elementData.getClass() != Object[].class) {
this.elementData = Arrays.copyOf(this.elementData, this.size, Object[].class);
}
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = new Object[0];
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
transient Object[] elementData;
private int size;
private static final int MAX_ARRAY_SIZE = 2147483639;
public void ensureCapacity(int var1) {
int var2 = this.elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA?0:10;
if(var1 > var2) {
this.ensureExplicitCapacity(var1);
}
}
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable {
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E, Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
this.map = new HashMap();
}
public HashSet(Collection<? extends E> var1) {
this.map = new HashMap(Math.max((int)((float)var1.size() / 0.75F) + 1, 16));
this.addAll(var1);
}
public HashSet(int var1, float var2) {
this.map = new HashMap(var1, var2);
}
public HashSet(int var1) {
this.map = new HashMap(var1);
}
HashSet(int var1, float var2, boolean var3) {
this.map = new LinkedHashMap(var1, var2);
}
public Iterator<E> iterator() {
return this.map.keySet().iterator();
}
public int size() {
return this.map.size();
}
public boolean isEmpty() {
return this.map.isEmpty();
}
public boolean contains(Object var1) {
return this.map.containsKey(var1);
}
public boolean add(E var1) {
return this.map.put(var1, PRESENT) == null;
}
public boolean remove(Object var1) {
return this.map.remove(var1) == PRESENT;
}
public void clear() {
this.map.clear();
}
public Object clone() {
try {
HashSet var1 = (HashSet)super.clone();
var1.map = (HashMap)this.map.clone();
return var1;
} catch (CloneNotSupportedException var2) {
throw new InternalError(var2);
}
}
private void writeObject(ObjectOutputStream var1) throws IOException {
var1.defaultWriteObject();
var1.writeInt(this.map.capacity());
var1.writeFloat(this.map.loadFactor());
var1.writeInt(this.map.size());
Iterator var2 = this.map.keySet().iterator();
while(var2.hasNext()) {
Object var3 = var2.next();
var1.writeObject(var3);
}
}
private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
var1.defaultReadObject();
int var2 = var1.readInt();
if(var2 < 0) {
throw new InvalidObjectException("Illegal capacity: " + var2);
} else {
float var3 = var1.readFloat();
if(var3 > 0.0F && !Float.isNaN(var3)) {
int var4 = var1.readInt();
if(var4 < 0) {
throw new InvalidObjectException("Illegal size: " + var4);
} else {
var2 = (int)Math.min((float)var4 * Math.min(1.0F / var3, 4.0F), 1.07374182E9F);
this.map = (HashMap)(this instanceof LinkedHashSet?new LinkedHashMap(var2, var3):new HashMap(var2, var3));
for(int var5 = 0; var5 < var4; ++var5) {
Object var6 = var1.readObject();
this.map.put(var6, PRESENT);
}
}
} else {
throw new InvalidObjectException("Illegal load factor: " + var3);
}
}
}
public Spliterator<E> spliterator() {
return new KeySpliterator(this.map, 0, -1, 0, 0);
}
}
serialVersionUID 是序列化需要的,我們這裏不用關心。如果前面看的懂HashMap的話,再回頭看這個應該是很輕鬆的事情。底層使用HashMap來保存HashSet中所有元素,接着定義一個虛擬的Object對象作爲HashMap的value,將此對象定義爲static final。實際底層會初始化一個空的HashMap,並使用默認初始容量爲16和加載因子0.75。也就說,當容量達到上一次設置的0.75大小時就會擴容,不是非要等到超過,這裏筆試題就會經常性的來考,擴容的次數等等。public interface Observer {
void update(Observable var1, Object var2);
}
public class Observable {
private boolean changed = false;
private Vector<Observer> obs = new Vector();//兼顧線程安全,所以沒用list
public Observable() {
}
public synchronized void addObserver(Observer var1) {
if(var1 == null) {
throw new NullPointerException();
} else {
if(!this.obs.contains(var1)) {
this.obs.addElement(var1);
}
}
}
public synchronized void deleteObserver(Observer var1) {
this.obs.removeElement(var1);
}
public void notifyObservers() {
this.notifyObservers((Object)null);
}
public void notifyObservers(Object var1) {
Object[] var2;
synchronized(this) {
if(!this.changed) {
return;
}
var2 = this.obs.toArray();
this.clearChanged();
}
for(int var3 = var2.length - 1; var3 >= 0; --var3) {
((Observer)var2[var3]).update(this, var1);
}
}
public synchronized void deleteObservers() {
this.obs.removeAllElements();
}
protected synchronized void setChanged() {
this.changed = true;
}
protected synchronized void clearChanged() {
this.changed = false;
}
public synchronized boolean hasChanged() {
return this.changed;
}
public synchronized int countObservers() {
return this.obs.size();
}
}