作为字符串和整数的数字字节的区别是什么?

时间:2019-04-12 03:19:15

标签: java jvm

假设我们有一个my_string = "123456"

我愿意

my_string.getBytes()

new BigInteger(123456).toByteArray()

在这两种情况下,结果字节数组都不同。为什么呢?除数据类型不同外,“ 123456”是否与123456相同?

3 个答案:

答案 0 :(得分:3)

它们是不同的,因为String类型由unicode字符组成。字符'2' 根本不与数值2相同。

答案 1 :(得分:2)

不。为什么会这样? "123456"是ASCII字符1的序列(不表示为数字1,而是表示为数字49),其后是数字2(50),依此类推。 。 123456作为int甚至没有表示为0到9之间的数字序列,但是它以数字形式存储在 binary中。

答案 2 :(得分:1)

我假设您要查询的是用于将数字表示为Stringbyte[]的总内存。

String的大小将取决于所使用的实际字符串表示形式。这取决于JVM版本。参见What is the Java's internal represention for String? Modified UTF-8? UTF-16?

对于Java 8和更早版本(有一些警告),字符串由具有1个String字段和1个int字段的reference对象组成。假设有64位引用,则总共增加了8个字节的标题+ 1 x 4字节+ 1 x 8字节+ 4个填充字节。然后添加用于表示字符的char[]:标头12个字节+每个字符2个字节。需要将向上舍入为8的倍数。

对于Java 9和更高版本,主对象具有相同的大小。 (有一个额外的字段...但是适合“填充”。)char[]byte[]代替,并且由于您只存储ASCII十进制数字 1 ,它们将被编码为每个字节一个字符。

简而言之,对于Java 9或更高版本,渐近空间使用情况是每个小数位 1个字节,而在Java中每个小数位 2个字节8或更早版本。

对于byte[]产生的BigInteger表示形式,该表示形式包括12个字节的标头+每个byte 1个字节...四舍五入为8的倍数。 em>渐近的大小为每个byte 1个字节。

在两种情况下,都存在表示形式引用的大小;即另外8个字节。

如果进行求和,则在所有情况下,byte[]表示比String表示更紧凑。但是intlong在所有情况下都比这两种表示都紧凑得多。


1-如果您不是...或者您好奇为什么我添加了此警告...请阅读以上链接中的问答!