您好,登錄后才能下訂單哦!
/**
* 在此列表中的指定位置插入指定的元素。
* 先調(diào)用 rangeCheckForAdd 對index進行界限檢查;然后調(diào)用 ensureCapacityInternal 方法保證capacity足夠大;
* 再將從index開始之后的所有成員后移一個位置;將element插入index位置;最后size加1。
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1);
//arraycopy()方法實現(xiàn)數(shù)組自己復制自己
//elementData:源數(shù)組;index:源數(shù)組中的起始位置;elementData:目標數(shù)組;index + 1:目標數(shù)組中的起始位置; size - index:要復制的數(shù)組元素的數(shù)量;
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
/**
*以正確的順序(從第一個到最后一個元素)返回一個包含此列表中所有元素的數(shù)組。
*返回的數(shù)組將是“安全的”,因為該列表不保留對它的引用。 (換句話說,這個方法必須分配一個新的數(shù)組)。
*因此,調(diào)用者可以自由地修改返回的數(shù)組。 此方法充當基于陣列和基于集合的API之間的橋梁。
*/
public Object[] toArray() {
//elementData:要復制的數(shù)組;size:要復制的長度
return Arrays.copyOf(elementData, size);
}
copyOf()
內(nèi)部調(diào)用了System.arraycopy()
方法System.arraycopy()和Arrays.copyOf()代碼說明?
使用System.arraycopy()方法
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]);
}
}
//結(jié)果:
//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);
//結(jié)果:
//10
}
arraycopy()
需要目標數(shù)組,將原數(shù)組拷貝到你自己定義的數(shù)組里或者原數(shù)組,而且可以選擇拷貝的起點和長度以及放入新數(shù)組中的位置 copyOf()
是系統(tǒng)自動在內(nèi)部新建一個數(shù)組,并返回該數(shù)組。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如何序列化?
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();
}
}
- 序列化時需要使用 ObjectOutputStream 的 writeObject() 將對象轉(zhuǎn)換為字節(jié)流并輸出。而 writeObject() 方法在傳入的對象存在 writeObject() 的時候會去反射調(diào)用該對象的 writeObject() 來實現(xiàn)序列化。反序列化使用的是 ObjectInputStream 的 readObject() 方法,原理類似。
ArrayList list = new ArrayList();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(list);
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。