JAVA中数组复制几种方法:
1.使用FOR循环,将数组的每个元素复制或者复制指定元素,不过效率差一点。
2.使用clone方法,得到数组的值,而不是引用,不能复制指定元素,灵活性差一点。
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = arr1.clone(); // {1, 2, 3, 4}
3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推荐使用。
/**
* System.arraycopy(src, srcPos, dest, destPos, length);
* src:源数组; srcPos:源数组要复制的起始位置;dest:目的数组; destPos:目的数组放置的起始位置;length:复制的长度.
*/
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = new int[6];
System.arraycopy(arr1, 1, arr2, 0, 3);
for(int i=0; i<arr2.length; i++){
System.out.println(arr2[i]); // 2 3 4 0 0 0
}
再看相关联的ArrayList,其实ArrayList 就是一个数组的形式存放数据的. 没有高深的地方.他的性能在于他的索引能力, 正因为他是数组形式,所以索引元素的时候他表现得非常的快速成,所以查找的时候是非常快的,但是插入或者删除一条记录就比较慢了,试想一下, 只要知道这个元素的索引,E[2] 你看对像就出来了.这就是ArrayList 最突出的地方.
让我们来看下ArrayList 内部数组是如何自我Copy的.要想深入的了解他就必需要看他的API,add 方法与remove 方式.
看完后你就会对它有一个深刻的理解了.如下原码:
//Add
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
// Remove
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
上述两个方法足以让你认识他们了。他的主要执行过程就在于数组对像的自我复制.System.arrayCopy。这个方法是System类中的一个JNI方式实现类。(JNI , Java Native Interface 故名思意,就是java 语言调其它语言的一个接口)
这个JNI的底层在不同的平台上不一样。打个比方,windows中,其实java的JNI就是调了.dll 。而Unix 中,其实就是调了.so 共享库。