1

为什么在 java 中使用原始类型而不是 Wrapper 类?我想知道我们在java中已经有了包装类,那么为什么我们需要使用原始类型呢?java中原始类型的重要性是什么?

4

4 回答 4

9

你的问题是倒退的。原始类型比它们的包装器更基本。

实际上,包装器给您的唯一有用的东西是能够被视为 Object 的子类(以便可以将它们放入集合等)。所有真正有用的东西(比如算术和排序)都由原始类型提供。

请注意,虽然您可以说以下内容:

Integer i = Integer.valueOf(4);
Integer j = Integer.valueOf(2);
Integer k = i + j;

这只是一种方便。在下面,最后一行变成这样:

Integer k = Integer.valueOf(i.intValue() + j.intValue());

这样算术就发生在原始值上。(这种便利称为装箱/拆箱。)这会降低性能,因此在我的机器上,这个循环:

for (int i=0; i<10000000; i++) { }

比这个循环快大约 10 倍:

for (Integer i=0; i<10000000; i++) { }
于 2010-07-15T17:07:26.183 回答
1

在 Java 中,每个对象都有一些空间开销。它取决于 JVM,以及目标架构上“字”的大小(64 位与 32 位),但我通常估计每个对象都有大约 40 字节的“开销”超出其字段所需的“开销” .

因此,例如,一个 1024 字节的数组是一个对象,有 40 字节的开销;它有一个length成员 (an int),需要 4 个字节,每个元素需要 1 个字节,总共大约 1k。

包含 1024 个Byte实例的数组具有数组本身及其length成员的开销,然后是每个Byte实例的大约 41 个字节(40 个字节的开销,加上 1 个字节的数据)。总共超过 41k!远不止原始byte[]

由于包装器类型是不可变的,因此有人建议使用巧妙的技巧使原始数据看起来像包装的对象实例,但到目前为止,这些机制都没有实现。

于 2010-07-15T17:39:25.297 回答
0

性能,原始类映射到处理器,而不必经过尽可能多的操作。
对于 boolean、int 和 float - 您可以使它们 volatile 并确保它们不需要同步(读取和写入是原子的)

于 2010-07-15T17:09:31.780 回答
-1

[幽默]为了省打字!这个:

    int i = 4;
    int j = 38;
    int k = i + j;

比键入更短:

    Integer i = new Integer(4);
    Integer j = new Integer(38);
    Integer k = i + j;

[/幽默]

实际上,其他答案比我说的要好。

于 2010-07-15T19:12:35.947 回答