我正在寻找一个在32位和64位系统上运行的java应用程序,它主要处理IP地址。这些IP地址保持为整数,正常类型在64位平台上浪费了大量内存(是的,内存使用已经被证明是一个问题)。如何声明即使在x64架构上仍保持32位的32位积分值?
由于我是java新手,如果有一个已经设计用于处理IP地址的内置类型,请随时向我指出;)
答案 0 :(得分:27)
Java的数据类型具有特定的宽度,以实现可移植性。即使在64位平台上,整数也是32位宽。 Java language specification州quite clearly(在我看来,略微改编以使其更具可读性):
整数类型是byte,short,int和long,其值分别是8位,16位,32位和64位有符号二进制补码整数,以及char,其值为16位表示UTF-16代码单元的无符号整数。
这可以说是由于C中发现的许多可移植性问题,它们具有不同的宽度(甚至是编码,例如两个补码,一个补码和符号/幅度),这些整数是Java希望避免的,特别是因为它本来要运行在尽可能多的不同平台上。
对于处理IP地址的内置类型,Java同时具有Inet4Address和Inet6Address,具体取决于您的需求(及其共同祖先InetAddress)。
答案 1 :(得分:8)
即使在64位机器上,int也是32位,你不需要做任何事情。
来自Java语言规范(http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
int数据类型是32位带符号的二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。对于整数值,此数据类型通常是默认选择。此数据类型很可能足以容纳您的程序将使用的数字,但如果您需要更宽范围的值,请使用long。
32位和64位Java VM之间的主要区别在于最大堆大小,即VM可以管理的内存量。
但是,64位虚拟机的内部实现会对内存使用产生影响:
通常,与在32位VM上运行相同的应用程序相比,能够处理大量内存的好处是64位VM中的性能损失很小。这是因为系统中的每个本机指针占用8个字节而不是4个。这个额外数据的加载会对内存使用产生影响,这会导致执行速度稍慢,具体取决于执行期间加载的指针数量。你的Java程序。
来自:http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description
答案 2 :(得分:3)
使用原始int
类型。它在所有Java平台上都是32位;见JLS 4.2.1。
是的,内存使用已被证明是一个问题
好吧,如果你这样说。
我们不知道你在这做什么。但是如果你担心在内存中代表大量IP地址的内存使用情况,那么你可能需要:
或者你可能只是记忆中的“浪费”不成比例。 Java本质上是内存饥渴,实用的答案是让它拥有它想要的东西。
关注
Java没有未签名的int
类型。但是,您不需要它来表示IP地址,尤其是因为您不需要对它们进行算术运算。
(即使你做了,也有办法做到这一点。请记住,如果你想从Java应用程序中挤出最后一盎司的内存“浪费”,你将需要做一些丑陋的事情。)
答案 3 :(得分:2)
int原始类型的java具有32位的固定大小
答案 4 :(得分:1)
不要担心,Java中的int
类型(与C / C ++不同)被定义为32位,如上所述here。
答案 5 :(得分:1)
int
在每个平台上都是32位。然而,为了使它无符号,你必须手动移动数字和这样的东西 - 它真的变得复杂。为什么不使用byte []或long?
答案 6 :(得分:0)
来自http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html:
整数类型是字节,短, int和long,其值为8位, 16位,32位和64位签名 二进制补码整数 分别和char,其值 是16位无符号整数 表示Unicode字符。
所以int
的定义已经是32位,尽管解释器可能将它放在内存中的64位边界上以加快访问速度。
答案 7 :(得分:0)
“int”/“Integer”与平台无关。它总是32位。平台相关的是com.sun.jna.ptr.IntByReference。
答案 8 :(得分:0)
在java中已经是32位了。多头是64位。
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 9 :(得分:0)
在java中,int是32位。多头是64位。因此,如果is大于32位,则需要很长时间。
答案 10 :(得分:-1)
最好的方法是导入新库
>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 2, 2))
True
>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 4, 2))
False