假设我们有一个my_string = "123456"
我愿意
my_string.getBytes()
和
new BigInteger(123456).toByteArray()
在这两种情况下,结果字节数组都不同。为什么呢?除数据类型不同外,“ 123456”是否与123456相同?
答案 0 :(得分:3)
它们是不同的,因为String
类型由unicode字符组成。字符'2'
根本不与数值2相同。
答案 1 :(得分:2)
不。为什么会这样? "123456"
是ASCII字符1
的序列(不表示为数字1
,而是表示为数字49),其后是数字2(50),依此类推。 。 123456
作为int
甚至没有表示为0到9之间的数字序列,但是它以数字形式存储在 binary中。
答案 2 :(得分:1)
我假设您要查询的是用于将数字表示为String
与byte[]
的总内存。
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
表示更紧凑。但是int
或long
在所有情况下都比这两种表示都紧凑得多。
1-如果您不是...或者您好奇为什么我添加了此警告...请阅读以上链接中的问答!