作为字符串和整数的数字的字节数有什么不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作为字符串和整数的数字的字节数有什么不同?相关的知识,希望对你有一定的参考价值。

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

我做

my_string.getBytes()

new BigInteger(123456).toByteArray()

对于这两种情况,结果字节数组是不同的。为什么会这样?除了数据类型的差异之外,“123456”与123456不同吗?

答案

不,他们为什么会这样? "123456"是ASCII字符1的序列(未表示为数字1,但表示为数字49),后跟数字2(50),依此类推。 123456作为int甚至不表示为0-9的数字序列,但它以二进制形式存储为数字。

另一答案

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

另一答案

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

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

对于Java 8及更早版本(有一些注意事项),String包含一个String对象,其中包含1个int字段和1个reference字段。假设64位引用,则最多添加8个字节的头+ 1个4个字节+ 1个8个字节+ 4个字节的填充。然后添加用于表示字符的char[]:标题的12个字节+每个字符的2个字节。这需要四舍五入到8的倍数。

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

简而言之,对于Java 9或更高版本,渐近空间使用为每十进制数1个字节,在Java 8或更早版本中为每个十进制数2个字节。

对于来自byte[]BigInteger表示,该表示由12个字节的标题+每个byte的1个字节组成...向上舍入为8的倍数。渐近大小为每个byte 1个字节。

在这两种情况下,还有表示的参考大小;即另外8个字节。

如果你做总和,在所有情况下,byte[]表示比String表示更紧凑。但是intlong在所有情况下都比这些表示更加紧凑。


1 - 如果你不是......或者如果你很好奇为什么我添加了这个警告...阅读上面链接的问答!

以上是关于作为字符串和整数的数字的字节数有什么不同?的主要内容,如果未能解决你的问题,请参考以下文章

字符串和编码

编码解码--三种常见字符编码简介:ASCIIUnicode和UTF-8

ASCIIUnicode和UTF-8编码的区别

字符串和编码

字符串和编码

009 字符串和编码