/** * 在此列表中的指定位置插入指定的元素。 * 先調用 rangeCheckForAdd 對index進行界限檢查;而後調用 ensureCapacityInternal 方法保證capacity足夠大; * 再將從index開始以後的全部成員後移一個位置;將element插入index位置;最後size加1。 */ public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); //arraycopy()方法實現數組本身複製本身 //elementData:源數組;index:源數組中的起始位置;elementData:目標數組;index + 1:目標數組中的起始位置; size - index:要複製的數組元素的數量; System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
/** *以正確的順序(從第一個到最後一個元素)返回一個包含此列表中全部元素的數組。 *返回的數組將是「安全的」,由於該列表不保留對它的引用。 (換句話說,這個方法必須分配一個新的數組)。 *所以,調用者能夠自由地修改返回的數組。 此方法充當基於陣列和基於集合的API之間的橋樑。 */ public Object[] toArray() { //elementData:要複製的數組;size:要複製的長度 return Arrays.copyOf(elementData, size); }
copyOf()
內部調用了System.arraycopy()
方法System.arraycopy()和Arrays.copyOf()代碼說明?php
使用System.arraycopy()方法java
public static void main(String[] args) { // TODO Auto-generated method stub int[] a = new int[10]; a[0] = 0; a[1] = 1; a[2] = 2; a[3] = 3; System.arraycopy(a, 2, a, 3, 3); a[2]=99; for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } //結果: //0 1 99 2 3 0 0 0 0 0
public static void main(String[] args) { int[] a = new int[3]; a[0] = 0; a[1] = 1; a[2] = 2; int[] b = Arrays.copyOf(a, 10); System.out.println("b.length"+b.length); //結果: //10 }
arraycopy()
須要目標數組,將原數組拷貝到你本身定義的數組裏或者原數組,並且能夠選擇拷貝的起點和長度以及放入新數組中的位置 copyOf()
是系統自動在內部新建一個數組,並返回該數組。public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
ArrayList如何序列化?android
transient Object[] elementData; // non-private to simplify nested class access
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { elementData = EMPTY_ELEMENTDATA; s.defaultReadObject(); s.readInt(); // ignored if (size > 0) { ensureCapacityInternal(size); Object[] a = elementData; for (int i=0; i<size; i++) { a[i] = s.readObject(); } } }
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
int expectedModCount = modCount;
s.defaultWriteObject();
s.writeInt(size);
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}git
- 序列化時須要使用 ObjectOutputStream 的 writeObject() 將對象轉換爲字節流並輸出。而 writeObject() 方法在傳入的對象存在 writeObject() 的時候會去反射調用該對象的 writeObject() 來實現序列化。反序列化使用的是 ObjectInputStream 的 readObject() 方法,原理相似。
ArrayList list = new ArrayList();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(list);github