arraycopy源码(arrayCopy)
本文目录一览:
- 1、java 一堆数组的复制 为什么数组c输出的是4,6,8,7,9???
- 2、数据结构:关于Java实现的一个队列,对其中的扩容步骤有疑问?答题的都是我爹
- 3、如何查看java源码中的native方法源码
- 4、java中数组复制的方法有几种
java 一堆数组的复制 为什么数组c输出的是4,6,8,7,9???
这个问题首先你需要看arraycopy方法的源码,
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
从方法可以看到5个参数,这5个参数分别代表的意思如下:
参数 说明
src 原数组
srcPos 原数组的起始位置
dest 目标数组
destPos 目标数组的起始位置
length 要复制的数组元素的数目
那么你的System.arraycopy(a, 1, c, 0, 3);这个表示的意思是 从a数据的下标1(即4)开始,复制3位(即4,6,8),复制到c数组,c数组从下标0(即1)开始替换3位,所以是4,6,8,7,9。如果System.arraycopy(a, 1, c, 0, 3);的3改为4,则会报数组越界异常,因为a数组从下标1往后只有3位,如果将System.arraycopy(a, 1, c, 0, 3);的0改为1,则结果为1,4,6,8,9,运行结果依次如下:
数据结构:关于Java实现的一个队列,对其中的扩容步骤有疑问?答题的都是我爹
这确实有点奇葩,要么修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:
if(front rear ){ //copy from front to rear 这样就可以去除多余的空位置,让front从0开始}
if(front rear ){
//先复制后半段到新的数组,然后复制前半段到新数组的后面,这就保证0位置的就是队列的头
}
这样的话,就可以理解为什么resize之后将front置为0,。
不知道这样的解释对不对,我看完上面的代码觉得就是这样的。
如何查看java源码中的native方法源码
下载JDK源代码啊,openJDK上有完整的JDK源代码,JDK源代码由C++、Java、C、汇编 这四种语言组成。JVM主体是C++写的,JNI部分是C,工具类是Java写的,JVM里混有汇编代码。路径:openjdk-7-fcs-src-b147\jdk\src\share\native\java\lang\System.c 找到这个
/* Only register the performance-critical methods */
static JNINativeMethod methods[] = {
{"currentTimeMillis", "()J", (void *)JVM_CurrentTimeMillis},
{"nanoTime", "()J", (void *)JVM_NanoTime},
{"arraycopy", "(" OBJ "I" OBJ "II)V", (void *)JVM_ArrayCopy},
};
方法的实现应该在JVM部分,路径openjdk-7-fcs-src-b147\hotspot\src\share,不同的操作系统实现不一样,应该是在对应的操作系统的包下
java中数组复制的方法有几种
1.for循环方法:
代码灵活,但效率低。
2.System.arraycopy()方法:
通过源码可以看到,其为native方法,即原生态方法。自然效率更高。
1 public static native void arraycopy(Object src, int srcPos,
2 Object dest, int destPos,
3 int length);
3.Arrays.copyOf()方法:
同样看源码,它的实现还是基于System.arraycopy(),所以效率自然低于System.arraycpoy()。
复制代码
1 public static int[] copyOf(int[] original, int newLength) {
2 int[] copy = new int[newLength];
3 System.arraycopy(original, 0, copy, 0,
4 Math.min(original.length, newLength));
5 return copy;
6 }
复制代码
4.Object.clone()方法:
从源码来看同样也是native方法,但返回为Object类型,所以赋值时将发生强转,所以效率不如之前两种。
1 protected native Object clone() throws CloneNotSupportedException;