Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 - Fatal编程技术网

Java 在向集合添加原语时,什么是更快的自动装箱或显式强制转换?

Java 在向集合添加原语时,什么是更快的自动装箱或显式强制转换?,java,Java,假设有一段代码应该向集合添加原语: List<Integer> list = new ArrayList<>(); 变量2: list.add(new Integer(1)); list.add(new Integer(2)); ... list.add(new Integer(n)); 变量3: list.add(Integer.valueOf(1)); list.add(Integer.valueOf(2)); ... list.add(Integer.val

假设有一段代码应该向集合添加原语:

List<Integer> list = new ArrayList<>();
  • 变量2:

    list.add(new Integer(1));
    list.add(new Integer(2));
    ...
    list.add(new Integer(n));
    
  • 变量3:

    list.add(Integer.valueOf(1));
    list.add(Integer.valueOf(2));
    ...
    list.add(Integer.valueOf(n));
    

  • 我假设Variant1会更快,但我没有证据。

    这个问题的答案可以是基于观点的。这意味着答案既有积极的一面,也有消极的一面。 在我看来,我会更好。代码更少的情况下也是如此

    除非我认为程序必须在旧版本的JVM上运行。然而,在这种情况下,这远远不是唯一的兼容性问题

    因此,不使用自动装箱的唯一原因是它不可用

    自动装箱确实会创建代码中不清晰可见的对象。因此,当发生自动装箱时,性能会受到影响

    对于科学计算或其他性能敏感的数字代码,不适合使用自动装箱和取消装箱。整数不能代替整数;自动装箱和取消装箱模糊了基本类型和引用类型之间的区别,但它们并没有消除这一区别

    混淆等于
    自动装箱带来了许多对程序员来说并不明显的东西。下面代码的输出是什么

    Long longWrapperVariable=2L ;
    System.out.println(longWrapperVariable.equals(2));
    System.out.println(longWrapperVariable.equals(2L));
    
    以下是上述代码打印的内容:

    如果您想知道上面发生了什么,2被装箱为整数,因此equals无法将其与Long进行比较。2L被装箱为Long,因此返回true

    OutOfMemoryError
    如果需要分配其中一个包装类(布尔、字节、字符、短、整数、长、浮点或双精度)的新实例,并且可用存储不足,则装箱转换可能会导致OutOfMemoryError


    更多参考资料:

    很少有有效的理由使用构造函数,它会绕过内部缓存。第一个版本和最后一个版本是等效的。编译器将两者转换为相同的字节码。如果你的问题是关于速度的,那么就没有办法用JMH来实际测量它。其他一切都只是“有教养的猜测”,这往往是错误的,而不是正确的。因此,我的猜测是,1和3显然比缓存快,也比等效值快。第二个是效率最低的,因为即使是在-128和127之间重新创建缓存的整数。其他两个可能是相同的。@VishwaRatna,但它可以并行进行,在某些情况下可能会加快速度。这个问题的重点是什么?只需搜索“Java中向列表中添加整数的不同方法”就可以给出每种方法的优缺点。@YCF_L
    数组。因为列表不是不变的,它只是固定长度。你不能删除项目或添加项目,但你可以用索引替换项目。为什么这篇文章会有负面声誉?
    
    Long longWrapperVariable=2L ;
    System.out.println(longWrapperVariable.equals(2));
    System.out.println(longWrapperVariable.equals(2L));
    
    false
    true