在 C 中,我们知道数据类型(例如int)的大小可能因编译器/硬件而异。
但是为什么数据类型的大小在java语言中是不变的?为什么我们不具备java中不同数据类型大小的灵活性,具体取决于编译器?
答案 0 :(得分:19)
JVM(Java虚拟机)旨在独立于平台。如果跨平台的数据类型大小不同,则会牺牲跨平台的一致性。
JVM将程序与底层操作系统和平台隔离开来。这可能会使执行系统特定工作变得困难,但好处是你可以一次写入,随处运行(这在很大程度上是正确的,有一些不幸的问题。一次写入,测试到处都是一种更实用的方法)。
答案 1 :(得分:14)
如果数据类型大小因平台而异,则会失去便携性。
答案 2 :(得分:3)
要获得一个非常全面的答案,你需要从Java的早期开始做大量的历史阅读。当然,设计师可能已经包含了一个更复杂的原始类型系统。然而,当Java进入广阔的舞台时,它的目标是applets。代码在浏览器中运行,组织复杂的UI,没有(也没有)需要知道它是否在臭名昭着的MNS-49(每个字7个7位字符)或霍尼韦尔68000(4 9)上运行每个字的比特字符),或一个无聊的现代处理器。它比任何人都能在int
上编码位算术更重要,并且知道在32班之后会发生什么。
答案 3 :(得分:1)
C的灵活性具有一些优势(如果使用32位而不是64位,则会降低内存/存储消耗),但随着硬件的改进,这些优势往往变得不那么重要(这是在70年代设计的)。 / p>
然而,这种灵活性带来了严重的互操作性和长期视力问题(Y 2038错误)。
相比之下,Java对象无论如何都有一些存储开销,因此在每个Date对象上保存4个字节将是毫无意义的,只会造成麻烦。
答案 4 :(得分:1)
因为那是Java。请参阅Java language specification。
答案 5 :(得分:1)
java的想法是“一次编写,随处运行”而无需重新编译。这意味着每个VM都具有相同的数据大小。当然,在64位计算机上,它使用64位引用,但是您无法访问这些引用,因此无关紧要。
它工作得很好,但我希望有一件事是希望我们能得到64位数组索引。这在当天并不重要,但对于大内存映射文件来说,这是一个巨大的痛苦。你必须把它们分成2GB的块。
答案 6 :(得分:0)
c语言有自己的优势,可以改变数据类型的大小。那个时候主内存不是太多......每个程序员都必须编写空间优化的代码。
如今空间不再是问题......便携式程序更为可取。
为什么要使java可移植java不支持不同大小的数据类型