假设我们有一个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完全不同。
我假设您要问的是用于表示String
与byte[]
的数字的总内存。
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
表示更紧凑。但是int
或long
在所有情况下都比这些表示更加紧凑。
1 - 如果你不是......或者如果你很好奇为什么我添加了这个警告...阅读上面链接的问答!