http://blog.csdn.net/shijinupc/article/details/7827507 首先觀察先System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)的聲明:
- public static native void arraycopy(Object src, int srcPos,
- Object dest, int destPos,
- int length);
src - 源數(shù)組。
srcPos - 源數(shù)組中的起始位置。
dest - 目標(biāo)數(shù)組。
destPos - 目標(biāo)數(shù)據(jù)中的起始位置。
length - 要復(fù)制的數(shù)組元素的數(shù)量。
該方法是用了native關(guān)鍵字,調(diào)用的為C++編寫(xiě)的底層函數(shù),可見(jiàn)其為JDK中的底層函數(shù)。
再來(lái)看看Arrays.copyOf();該方法對(duì)于不同的數(shù)據(jù)類(lèi)型都有相應(yīng)的方法重載。
- //復(fù)雜數(shù)據(jù)類(lèi)型
- 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;
- }
- public static <T> T[] copyOf(T[] original, int newLength) {
- return (T[]) copyOf(original, newLength, original.getClass());
- }
由U類(lèi)型復(fù)制為T(mén)類(lèi)型?
original - 要復(fù)制的數(shù)組
newLength - 要返回的副本的長(zhǎng)度
newType - 要返回的副本的類(lèi)型
- //基本數(shù)據(jù)類(lèi)型(其他類(lèi)似byte,short···)
- public static int[] copyOf(int[] original, int newLength) {
- int[] copy = new int[newLength];
- System.arraycopy(original, 0, copy, 0,
- Math.min(original.length, newLength));
- return copy;
- }
觀察其源代碼發(fā)現(xiàn)copyOf(),在其內(nèi)部創(chuàng)建了一個(gè)新的數(shù)組,然后調(diào)用arrayCopy()向其復(fù)制內(nèi)容,返回出去。
總結(jié):
1.copyOf()的實(shí)現(xiàn)是用的是arrayCopy();
2.arrayCopy()需要目標(biāo)數(shù)組,對(duì)兩個(gè)數(shù)組的內(nèi)容進(jìn)行可能不完全的合并操作。
3.copyOf()在內(nèi)部新建一個(gè)數(shù)組,調(diào)用arrayCopy()將original內(nèi)容復(fù)制到copy中去,并且長(zhǎng)度為newLength。返回copy;
|