自Java5以来,我们已经对基本类型进行了装箱/拆箱,以便将int包装为java.lang.Integer,依此类推.

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

为什么在Java中有still多个使用基元类型?有什么切实的好处吗?

推荐答案

In Joshua Bloch's Effective Java, Item 5: "Avoid creating unnecessary objects", he posts the following code example:

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);
}

run 需要43秒.把长时间放在原语中会把时间降到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

EDIT Why does (3) return true and (4) return false?

因为它们是两个不同的物体.最接近零的256个整数[-128;127]由JVM缓存,因此它们返回相同的对象.但是,超出该范围后,它们不会被缓存,因此会创建一个新对象.为了让事情变得更复杂,JLS要求缓存at least256个飞锤.JVM实现者可以根据需要添加更多,这意味着这可以在一个系统上运行,其中最近的1024个被缓存,并且所有这些都返回true#令人尴尬的

Java相关问答推荐

Informix PrepareStatement引发错误-将LIMIT Clause添加到查询时,字符到数字的转换过程失败

在applitcation.properties中找到的字符串中输入变量

内容处置 destruct 了PSP请求

我应该避免在Android中创建类并在运行时编译它们吗?

BiPredicate和如何使用它

如何使用Java API在Oracle ODI中运行模拟?

使用联接和分页的SpringBoot Spring数据JPA

流迭代列表<;对象>;上的NoSuchElementException

Hibernate 6支持Joda DateTime吗?

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

相同的Java SerializedLambda为implMethodKind返回不同的结果

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

在Eclipse中数组的可空性

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

如何在Jooq中获取临时表列引用?

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

在打开搜索结果时,如何让Eclipse打开整个文件?

使用MediaPlayer类在一段时间后停止播放音乐

保持标题窗格的箭头可见,即使设置为不可折叠

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题