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

人们为什么仍然在Java中使用原始类型?

申宜
2023-03-14
问题内容

从Java 5开始,我们已经对原始类型进行装箱/拆箱,因此将int其包装为java.lang.Integer,依此类推。

我最近看到许多新的Java项目(肯定要求JRE的版本至少为5,如果不是6的话)正在使用int而不是java.lang.Integer,尽管使用后者要方便得多,因为它具有一些用于转换的辅助方法到long的值等。

为什么有些人仍然在Java中使用原始类型?有什么切实的好处吗?


问题答案:

在Joshua Bloch的有效Java条款 5:“避免创建不必要的对象”中,他发布了以下代码示例:

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

运行需要43秒。将Long引入原语可将其缩短至6.8秒…如果这表明我们使用原语的原因。

缺乏本机价值平等也是一个问题(.equals()与相比,相当冗长==

对于biziclop:

class Biziclop {

    public static void main(String[] args) {
        System.out.println(new Integer(5) == new Integer(5));
        System.out.println(new Integer(500) == new Integer(500));

        System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
        System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
    }
}

结果是:

false
false
true
false

编辑 为什么(3)返回true而(4)返回false

因为它们是两个不同的对象。最接近零的256个整数[-128; 127]由JVM缓存,因此它们返回相同的对象。但是,超出该范围时,不会缓存它们,因此将创建一个新对象。为了使事情变得更复杂,JLS要求至少缓存256个flyweight。JVM实现者可以根据需要添加更多内容,这意味着它可以在缓存了最近的1024个并且都返回true的系统上运行… #awkward



 类似资料:
  • 问题内容: Java中的原始类型是什么?为什么我经常听到不应该在新代码中使用它们的信息? 如果我们不能使用原始类型,那有什么选择呢?有什么更好的选择? 问题答案: 什么是原始类型? Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表而形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承s

  • 问题内容: 如果有Wrapper类使Java成为纯面向对象的语言,那么为什么会有可在Java中使用的Primitive数据类型呢? 问题答案: 为了效率。基本类型的变量直接包含值。非基本类型的变量是引用,引用存储在内存中其他位置的对象。 每次您需要使用包装器类型的值时,JVM都需要在内存中查找对象以获取该值。对于原始类型,这不是必需的,因为变量本身包含值,而不是对包含该值的对象的引用。 但是,这不

  • 问题内容: 声明任何原始类型的数据(例如int或)时,它们会初始化为或。为什么我们不能将它们设置为? 问题答案: 基本类型就是数据。另一方面,我们称为对象的对象只是指向数据存储位置的指针。例如: 在这种情况下,它只是指向一个整数对象的指针,该对象的值恰好是3。也就是说,在存储变量对象的内存位置,你所拥有的只是对数据实际位置的引用。number另一方面,存储的存储位置直接包含值3。 因此,你可以将设

  • 当声明任何基本类型数据(如< code>int或< code>double)时,它们被初始化为< code>0或< code>0.0。为什么我们不能将它们设置为< code>null?

  • 问题内容: 在Java中,我们可以直接用于声明字符串变量名称并指定其值。即使String是非原始数据类型,也不必通过使用new关键字将字符串定义为数组。 有人可以解释为什么String是非原始数据类型吗? 问题答案: 这是字符串文字。像这样声明字符串时,实际上是在String上调用intern()方法。此方法引用内部字符串对象池。如果已经存在一个字符串值“ This is stringlitera

  • 问题内容: 因此,每本Java教科书都讨论Java的灵活性,因为Java可以在运行时加载类。只需将字符串拼凑在一起,然后交给,然后抓住并处理即可。理论上就这么多。 您能否举例说明如何使用Java类加载来实现原本不可能或不容易的功能?请注意,我 不是 问“有什么伟大的事情 可以 做什么?” -我正在寻找真实的示例,它是一个开源应用程序,或者-如果您可以在不给出过多细节的情况下进行描述-一个专有应用程