Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同数组复制方法之间的差异_Java_Arrays - Fatal编程技术网

Java 不同数组复制方法之间的差异

Java 不同数组复制方法之间的差异,java,arrays,Java,Arrays,两者的区别是什么 System.arraycopy() clone() 通过迭代元素进行手动复制 Arrays.copyOf() 而仅仅是做arraynew=arrayold System.arraycopy()使用JNI(Java本机接口)进行复制 数组(或其一部分),因此 如你所证实的,速度惊人 ; clone()创建一个新的数组,该数组具有与旧数组相同的特征,即相同的大小、相同的类型和相同的内容。有关克隆的一些示例,请参阅 手动复制就是手动复制。关于这种方法没有什么可说的,只是很多人发

两者的区别是什么

  • System.arraycopy()
  • clone()
  • 通过迭代元素进行手动复制
  • Arrays.copyOf()
  • 而仅仅是做
    arraynew=arrayold
      • System.arraycopy()
        使用JNI(Java本机接口)进行复制 数组(或其一部分),因此 如你所证实的,速度惊人 ;
      • clone()
        创建一个新的数组,该数组具有与旧数组相同的特征,即相同的大小、相同的类型和相同的内容。有关
        克隆的一些示例,请参阅
        
      • 手动复制
        就是手动复制。关于这种方法没有什么可说的,只是很多人发现它是最有效的
      • arraynew=arrayold
        不复制数组;它只是将
        arraynew
        指向
        arrayold
        的内存地址,或者换句话说,您只是将引用分配给旧数组
          • 将数据从一个现有数组复制到另一个数组中,并根据参数仅复制其中的一部分
          • clone()
            分配一个类型和大小与原始数组相同的新数组,并确保其内容相同
          • 手动复制通常与
            System.arraycopy()
            做的事情几乎相同,但它是更多的代码,因此是更大的错误源
          • arraynew=arrayold
            仅将对数组的引用复制到新变量,不影响数组本身
          还有一个更有用的选项:

          可用于创建另一个大小不同的阵列的副本。这意味着新数组可以大于或大于原始数组,并且公共大小的内容将是源数组的内容。甚至有一个版本可以创建不同类型的数组,还有一个版本可以指定要复制的元素范围()


          请注意,所有这些方法都会生成浅拷贝。这意味着只复制存储在数组中的引用,而不复制引用的对象。

          数组。copyOf(..)在内部使用System.arrayCopy(..)方法。

          有答案,但不完整

          考虑的方案有:

          • Arrays.copyOf()
          • System.arraycopy()
          下面是Arrays.copyOf()的java实现。

          如您所见,copyOf在内部使用System.arraycopy

          • 如果已经创建了数组,请使用System.arraycopy()进行复制
          • 如果需要新数组中的结果,请使用Arrays.copyOf()进行复制

          注意:由于它们的功能不同,因此没有必要对速度进行明显的比较。

          那篇关于
          arraycopy
          的文章是在2006年写的<代码>克隆
        可以(理论上,并且出于明显的原因)由运行时专门处理,以精确执行
        memcpy
        memcpy
        之后是清除每个数组元素标头中“lock”位的过程。没有理由认为
        arraycopy
        clone
        的性能应该不同。@me:关于锁定位的部分是假设您可以像在.NET中一样锁定Java中的任何对象。+1。但是,您可以澄清什么是浅拷贝(例如,多维数组的克隆是浅拷贝,也就是说它只创建一个新数组。子数组是共享的。)。@280Z28:
        arraycopy
        可以是特殊情况,与
        clone
        相同@JG:所有这些方法都会创建浅拷贝(除了手动拷贝,具体取决于操作方式)。@Joachim:
        arraycopy
        由于初始化目标数组的元素,然后立即写回它们,因此会产生不必要的开销<代码>克隆应该是最快的,因为它不需要初始化内存
        cloneRange
        通过分配未初始化的内存并将数组子范围浅拷贝到内存中,总体上速度最快。所有这些都应该由运行时本身实现,这意味着没有JNI(低于JNI-JIT可以检测到这些调用并用机器代码处理它们)。与
        .clone()
        相比,
        System.arraycopy()
        的性能如何?
        public static double[] More ...copyOf(double[] original, int newLength) {
                double[] copy = new double[newLength];
                System.arraycopy(original, 0, copy, 0,
                                 Math.min(original.length, newLength));
                return copy;
           }