当前位置: 首页 > 面试题库 >

.clone()或Arrays.copyOf()?

许永年
2023-03-14
问题内容

为了减少可变性,我们应该使用

public void setValues(String[] newVals) {

     this.vals = ( newVals == null ? null : newVals.clone() );
}

要么

public void setValues(String[] newVals) {

     this.vals = ( newVals == null ? null : Arrays.copyOf(newVals, newVals.length) );
}

问题答案:

使用jmh更新

使用jmh,我得到类似的结果,除了clone似乎稍微好一点。

原始帖子

我对性能进行了一个快速测试:cloneSystem.arrayCopy并且Arrays.copyOf具有非常相似的性能(jdk
1.7.06,服务器虚拟机)。

有关详细信息(以毫秒为单位),请在JIT之后:

克隆:68个
数组复制:68个
Arrays.copyOf:68

测试代码:

public static void main(String[] args) throws InterruptedException,
        IOException {
    int sum = 0;
    int[] warmup = new int[1];
    warmup[0] = 1;
    for (int i = 0; i < 15000; i++) { // triggers JIT
        sum += copyClone(warmup);
        sum += copyArrayCopy(warmup);
        sum += copyCopyOf(warmup);
    }

    int count = 10_000_000;
    int[] array = new int[count];
    for (int i = 0; i < count; i++) {
        array[i] = i;
    }

    // additional warmup for main
    for (int i = 0; i < 10; i++) {
        sum += copyArrayCopy(array);
    }
    System.gc();
    // copyClone
    long start = System.nanoTime();
    for (int i = 0; i < 10; i++) {
        sum += copyClone(array);
    }
    long end = System.nanoTime();
    System.out.println("clone: " + (end - start) / 1000000);
    System.gc();
    // copyArrayCopy
    start = System.nanoTime();
    for (int i = 0; i < 10; i++) {
        sum += copyArrayCopy(array);
    }
    end = System.nanoTime();
    System.out.println("arrayCopy: " + (end - start) / 1000000);
    System.gc();
    // copyCopyOf
    start = System.nanoTime();
    for (int i = 0; i < 10; i++) {
        sum += copyCopyOf(array);
    }
    end = System.nanoTime();
    System.out.println("Arrays.copyOf: " + (end - start) / 1000000);
    // sum
    System.out.println(sum);
}

private static int copyClone(int[] array) {
    int[] copy = array.clone();
    return copy[copy.length - 1];
}

private static int copyArrayCopy(int[] array) {
    int[] copy = new int[array.length];
    System.arraycopy(array, 0, copy, 0, array.length);
    return copy[copy.length - 1];
}

private static int copyCopyOf(int[] array) {
    int[] copy = Arrays.copyOf(array, array.length);
    return copy[copy.length - 1];
}


 类似资料:
  • 问题内容: 我需要Java的浅表副本,是否应该使用或遍历原始列表并将元素复制到新的arrayList中,这会更快? 问题答案: 使用或使用复制构造函数。 复制构造函数从传递的集合到数组进行其他转换,而该方法直接使用内部数组。 请记住,回报,所以您将不得不放弃。

  • Git introduces --filter option to git clone command, which filters out large files and objects (such as blobs) to create partial clone of a repo. Clone filters are especially useful for large repo and

  • 描述 (Description) clone( )方法克隆匹配的DOM元素并选择克隆。 这对于将元素的副本移动到DOM中的另一个位置非常有用。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.clone( ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - NA 例子 (Example) 以下是一个简单的例子,简单地显示了这种方法的用

  • 描述 (Description) 它返回具有相同模型列表的集合的新实例。 语法 (Syntax) collection.clone() 例子 (Example) <!DOCTYPE html> <html> <head> <title>Collection Example</title> <script src = "https://code.jquery.com/

  • 描述 (Description) 模型克隆用于创建模型的深层副本或将一个模型对象复制到另一个对象。 语法 (Syntax) model.clone() 例子 (Example) <!DOCTYPE html> <html> <head> <title> Model Example</title> <script src = "https://code.jquery.

  • git clone ,能把远程仓库完整地复制一份,放到本地的某个目录的下面。 练习 1,克隆一个远程仓库。我们之前创建了一个公开的远程仓库,也就是任何人都可以把这个仓库内容 clone 到他们自己的电脑上。这里我们假装自己是另外一个人,打开电脑上的命令行工具,进入到桌面上,然后再去 clone 一份自己创建的远程仓库。 cd ~/desktop git clone https://github.c