Java中的原始数据类型和可移植性

12 浏览
0 Comments

Java中的原始数据类型和可移植性

我引用自Herbert Schildt的第3章《数据类型、变量和数组》的内容:

原始类型表示的是单个值而不是复杂对象。

尽管Java在其他方面完全面向对象,但原始类型并非如此。这是为了提高效率。将原始类型变为对象将会大大降低性能。

原始类型的定义具有显式的范围和数学行为。像C、C++这样的语言允许整数的大小根据执行环境的规定而变化。然而,Java不同。由于Java的可移植性要求,所有数据类型都具有严格定义的范围。例如,无论特定平台如何,int始终是32位。这样可以编写保证在任何机器体系结构上运行而无需移植的程序。虽然严格指定整数的大小可能会在某些环境中导致性能略有损失,但这是为了实现可移植性而必要的。

他在最后两行是什么意思?为什么在某些环境中指定整数的大小可能会导致性能略有损失?

0
0 Comments

在"低级"语言中,原始数据类型的大小通常是从CPU处理它们的能力推导出来的。例如,在C语言中,int被定义为"至少16位大小",但其大小可能因为不同的架构而有所变化,以确保"int类型应该是目标处理器最有效处理的整数类型"。这意味着如果你的代码对int的大小做出了不谨慎的假设,那么如果你从32位的x86架构移植到64位的powerpc架构,它很可能会出现错误。

正如上面提到的,Java是不同的。例如,int始终是32位大小。这意味着当您在不同的架构上运行相同的代码时,您不必担心其大小会发生变化。然而,正如上面提到的,这种折衷是性能——在任何不能本地处理32位计算的架构上,这些int需要扩展到CPU能处理的本地大小(这将带来一小部分性能损失),或者更糟糕的是,如果CPU只能处理较小的int,那么每个int上的操作都可能需要多个CPU操作。

问题的原因是在不同的架构上,原始数据类型的大小可能会有所变化,导致代码在移植时出现错误。解决方法是在Java中,原始数据类型的大小是固定的,不会随着架构的变化而变化。然而,这可能会导致性能损失,因为在不能本地处理32位计算的架构上,int类型需要被扩展到CPU能处理的本地大小,或者甚至可能需要多个CPU操作来处理int类型。

0
0 Comments

Java实现了自己的数据指针机制,建立在底层系统的指针机制之上。如果数据不够大,许多系统可能会使用较小的指针。

例如:如果您的整数数据只需要16位指针,系统将只分配16位指针所需的存储空间。但是如果您使用的是Java,它将将16位转换为32位指针分配,以满足对大内存空间的需求,这也会降低存储和数据检索的性能。因为您的指针是较大的。

这个回答涉及指针,但与整数无关。

是的,但问题(就我所读到的)是关于整数性能,而不是一般性能。

原因:

Java实现了自己的数据指针机制,但在处理整数时,会将16位指针转换为32位指针分配,导致性能下降。

解决方法:

在处理整数时,可以考虑使用较小的指针,以提高性能。

0
0 Comments

在Java中,原始数据类型和可移植性之间存在一些问题。一些计算机使用36位架构,因此需要额外的步骤来屏蔽位、模拟溢出等。

解决这个问题的方法是使用位操作符和掩码来处理原始数据类型。下面是一些示例代码:

int number = 42;
int mask = 0b1111; // 使用二进制字面量定义掩码
int maskedNumber = number & mask; // 使用位与操作符屏蔽位
System.out.println(maskedNumber); // 输出结果为10

通过使用位操作符和掩码,我们可以对原始数据类型进行位操作,以达到控制位的目的。这种方法可以在36位架构的计算机上模拟溢出等操作。

另外,为了提高可移植性,Java还提供了一些跨平台的解决方案。例如,使用Java提供的整数类型,可以确保在不同的计算机上具有相同的位数和范围。这样,无论在使用32位还是36位架构的计算机上运行Java程序,原始数据类型的行为都是一致的。

总之,通过使用位操作符和掩码,我们可以处理原始数据类型在36位架构上的问题。同时,Java的可移植性解决方案也确保了原始数据类型在不同计算机上的一致性。

0