为什么在java中使用原始类型而不是Wrapper类?我想知道我们已经在java中有包装类,那么为什么我们需要使用原始类型? java中原始类型的重要性是什么?
答案 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;
[/幽默]
实际上,其他答案说它比我更好。