51CTO的自测题《验证你Java掌握程度的自测题(一)》中,最后一道题是关于Java字符串所占用的内存空间的,原题如下图:
出题者给的答案是A. 6个字节。我认为不对。
String作为一个对象,绝不是仅仅包含字符集合这么简单,它一定还需要有用于对象的内存开销,经查,有人根据JVM的内存结构给出了一个String所占用的最少字节数的计算公式
- Minimum String memory usage (bytes) = 8 * (int) ((((chars number) * 2) + 45) / 8)
且不说对象的额外开销,就"学java"这几个字符来说,占多少字节呢?6个字节——也不对!
Java中字符是按16位的Unicode来保存的,官方《The Java Tutorial》一书中“ Primitive Data Types”一章提到了这一点:
* char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive). |
那么"学java"这5个字符就应该是5*16bit=10bytes,即占用10字节内存空间。
那么出题者的答案6字节是怎么来的呢?试试下面这段代码:
- public class Test {
- public static final void main(String[] args) {
- System.out.println("学java".getBytes().length);
- }
- }
是的,我相信简体中文Windows用户运行这段代码都会得到6这个答案。为什么"学java".getBytes()会得到6个字节呢?不妨来看看getBytes()的文档是怎么说的
Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. |
也就是说,getBytes()会按当前系统默认的字符集来对字符串进行编码。简体中文Windows的默认字符集,是GBK,GBK中汉字是2个字节,而ASCII占1个字节,所以"学java"是6个字节。
如果你不清楚当前平台/系统的默认字符集,可以用这条语句来看看:
参考:http://jamesfancy.blog.51cto.com/2516291/665745