Java中的基元类型

时间:2010-07-15 16:56:31

标签: java types primitive

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

4 个答案:

答案 0 :(得分: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++) { }

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

性能,原始类映射到处理器,而不必经历多少操作 在boolean,int和float的情况下 - 你可以使它们变为volatile并确保它们不需要同步(读取和写入是原子的)

答案 3 :(得分:0)

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

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

的输入时间短于:

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

[/幽默]

实际上,其他答案说它比我更好。