Java 哪个表示占用更多内存,哪个表示更有效

Java 哪个表示占用更多内存,哪个表示更有效,java,Java,我有个问题。我必须处理IP地址和端口号。每个数据包包含源和目标IP、源和目标端口。假设一个数据包是1.2.3.4、5.6.7.8、22、8080,那么我可以将它们存储在两种不同的数据类型中 String packet ="1.2.3.4, 5.6.7.8,22, 8080"; short[] packet={1,2,3,4,5,6,7,8,22, 8080} 哪一个占用更多内存,哪一个处理效率更高?短[]是10*2字节,加上对象开销 字符串需要一个分隔符,因此如果每个数字都是一个位数加上对

我有个问题。我必须处理IP地址和端口号。每个数据包包含源和目标IP、源和目标端口。假设一个数据包是1.2.3.4、5.6.7.8、22、8080,那么我可以将它们存储在两种不同的数据类型中

 String packet ="1.2.3.4, 5.6.7.8,22, 8080";
 short[] packet={1,2,3,4,5,6,7,8,22, 8080}
哪一个占用更多内存,哪一个处理效率更高?短[]是10*2字节,加上对象开销

字符串需要一个分隔符,因此如果每个数字都是一个位数加上对象开销,那么它至少是9*2+1个字符,在实际情况下,它将始终更长


因此短[]的内存更少,而且我强烈怀疑它更容易处理。

实际上,每个IP承载32位数据,4个8位值,每个端口承载16位数据。因此,您的总记录可以压缩为32+32+16+16=96位或3个32位int原语

您可以使用这个问题的答案:将每个IP地址打包成一个int值。类似的技术也可以将两个端口号打包成一个int,因为端口号实际上最多为16位值


通过这种优化,您可以将一条记录存储为3个int值,这些int值可以封装到一个类中,并提供实用方法来获取每一条数据。

您会创建数百万条这样的记录吗?如果没有,就不要担心内存。这取决于你想要什么样的处理方式。如果不考虑这一点,我可能会使用一个类来包装两个java.net.InetAddress实例和两个未签名的短裤,因为它提供了最好的可读性和多功能性。如果需要优化,请进行优化。是的,我必须处理数百万条记录,因此内存和效率都是主要关注点。这是最糟糕的过早优化。使用适当的类,只有在发现实际问题时才返回。在手机存储容量为千兆字节的时代,数百万条记录算不了什么。@chrylis:Derp.:但是,是的,过早的优化。我相信不能100%确定java.net.Inet4Address只存储32位数字。开销可能会使您超过short[]大小,但short[]将更难再次处理,这取决于您正在进行的处理。此外,对于某些类型的处理,您不需要一次将所有内容都存储在内存中。这是节省几个字节的好方法。请注意,Java将大多数对象填充为8字节的倍数,详细信息会有所不同,因此您需要计算出详细信息,看看这是否真的可以保存。