大家好:我很惊讶地发现以下代码
System.out.println("Character size:"+Character.SIZE/8);
System.out.println("String size:"+"a".getBytes().length);
输出:
字符大小:2
字符串大小:1
我认为单个字符串应该占用与单个字符相同(或更多)的字节。
特别是我想知道---
如果我有一个包含多个字段的java bean,它的大小将根据字段的性质(字符,字符串,布尔值,向量等等)增加,我假设所有java对象都有一些(可能是最小的)足迹,并且这些足迹中最小的一个将是单个角色。所以..为了测试我从上面的代码开始的基本假设 - 并且print语句的结果似乎违反直觉。
默认情况下,java存储/序列化字符与字符串的方式的任何见解都非常有用......谢谢。
答案 0 :(得分:10)
getBytes()
使用默认编码输出String
(最有可能是ISO-8859-1
),而内部字符char始终为2个字节。内部Java总是使用带有2字节字符的char数组,如果您想了解有关编码的更多信息,请在问题注释中阅读Oded链接。
答案 1 :(得分:2)
我想说出我的想法,纠正我,如果我错了,但你发现字符串的长度是正确的,它显示为1,因为你在字符串中只有1个字符。长度表示长度而不是大小。长度和大小是两回事。
检查这个Link ..你发现错误方式占用的字节数
答案 2 :(得分:0)
好吧,你有char数组中的1个字符大小为2个字节,并且你的String包含1个字符长,而不是它有1个字节大小。
Java中的String
对象包括:
private final char value[];
private final int offset;
private final int count;
private int hash;
只有这样才能确保String
对象大于char
数组。
如果您想了解有关对象大小的更多信息,您还可以阅读有关char数组的对象标题和多重性因子。例如here或here。
答案 3 :(得分:0)
我想首先添加一些代码然后再解释一下:
import java.nio.charset.Charset;
public class Main {
public static void main(String[] args) {
System.out.println("Character size: " + Character.SIZE / 8);
final byte[] bytes = "a".getBytes(Charset.forName("UTF-16"));
System.out.println("String size: " + bytes.length);
sprintByteAsHex(bytes[0]);
sprintByteAsHex(bytes[1]);
sprintByteAsHex(bytes[2]);
sprintByteAsHex(bytes[3]);
}
static void sprintByteAsHex(byte b) {
System.out.print((Integer.toHexString((b & 0xFF))));
}
}
输出将是:
Character size: 2
String size: 4
feff061
所以你实际上缺少的是,你没有为 getBytes 方法提供任何参数。也许,你得到字符'a'的UTF-8表示的字节。
嗯,但是当我们要求UTF-16时,为什么我们得到4个字节?好吧,Java内部使用UTF-16,那么我们应该得到2个字节吗?
如果检查输出:
feff061
Java实际上向我们返回了一个BOM:https://en.wikipedia.org/wiki/Byte_order_mark。
所以前两个字节:需要feff来表示后面的字节将是UTF-16 Big Endian。有关详细信息,请参阅维基百科页面。
剩余的2个字节:0061是您拥有的字符“a”的2字节表示。可以通过以下方式验证:http://www.fileformat.info/info/unicode/char/0061/index.htm
所以是的,Java中的一个字符是2个字节,但是当你要求没有特定编码的字节时,你可能并不总是得到2个字节,因为不同的编码对于各种字符需要不同的字节数。
答案 4 :(得分:-1)
Character的SIZE是char所需的存储空间,即16位。字符串的长度(也是底层char数组或字节数组的长度)是字符数(或字节数),而不是位数。
这就是为什么你的分区大小为8,但不是长度。长度需要乘以2。
另请注意,如果指定不同的编码,您将获得字节数组的其他长度。在这种情况下,在执行getBytes()时执行了对单个或不同大小编码的转换。
请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes(java.nio.charset.Charset)