System.arraycopy

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 共享库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值