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();
}
}