为什么在 java 中使用原始类型而不是 Wrapper 类?我想知道我们在java中已经有了包装类,那么为什么我们需要使用原始类型呢?java中原始类型的重要性是什么?
4 回答
你的问题是倒退的。原始类型比它们的包装器更基本。
实际上,包装器给您的唯一有用的东西是能够被视为 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++) { }
在 Java 中,每个对象都有一些空间开销。它取决于 JVM,以及目标架构上“字”的大小(64 位与 32 位),但我通常估计每个对象都有大约 40 字节的“开销”超出其字段所需的“开销” .
因此,例如,一个 1024 字节的数组是一个对象,有 40 字节的开销;它有一个length
成员 (an int
),需要 4 个字节,每个元素需要 1 个字节,总共大约 1k。
包含 1024 个Byte
实例的数组具有数组本身及其length
成员的开销,然后是每个Byte
实例的大约 41 个字节(40 个字节的开销,加上 1 个字节的数据)。总共超过 41k!远不止原始byte[]
。
由于包装器类型是不可变的,因此有人建议使用巧妙的技巧使原始数据看起来像包装的对象实例,但到目前为止,这些机制都没有实现。
性能,原始类映射到处理器,而不必经过尽可能多的操作。
对于 boolean、int 和 float - 您可以使它们 volatile 并确保它们不需要同步(读取和写入是原子的)
[幽默]为了省打字!这个:
int i = 4;
int j = 38;
int k = i + j;
比键入更短:
Integer i = new Integer(4);
Integer j = new Integer(38);
Integer k = i + j;
[/幽默]
实际上,其他答案比我说的要好。