b2c信息网

您现在的位置是:首页 > 热点问题 > 正文

热点问题

arraycopy源码(arrayCopy)

hacker2022-07-12 22:48:19热点问题74
本文目录一览:1、java一堆数组的复制为什么数组c输出的是4,6,8,7,9???

本文目录一览:

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;

发表评论

评论列表

  • 掩吻掩吻(2022-07-13 02:17:21)回复取消回复

    对其中的扩容步骤有疑问?答题的都是我爹这确实有点奇葩,要么修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:if(f

  • 只影辞取(2022-07-13 00:13:41)回复取消回复

    ublic static native void arraycopy(Object src, int srcPos,2 Object dest, int destP

  • 离鸢拔弦(2022-07-13 10:08:13)回复取消回复

    修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:if(front  rear ){ //copy from front to rear 这样就可以去除多余的空位

  • 颜于芩酌(2022-07-13 00:08:12)回复取消回复

    低。2.System.arraycopy()方法:通过源码可以看到,其为native方法,即原生态方法。自然效率更高。1 public static native void arrayc

  • 末屿萌懂(2022-07-13 01:23:39)回复取消回复

    int length);3.Arrays.copyOf()方法:同样看源码,它的实现还是基于System.arraycopy(),所以效率自然低于System.arraycpoy()。复制代码1 public static