Java字符串"学java"占多少内存空间

51CTO的自测题《验证你Java掌握程度的自测题(一)》中,最后一道题是关于Java字符串所占用的内存空间的,原题如下图:

\"学java\"占多少字节

 出题者给的答案是A. 6个字节。我认为不对。

String作为一个对象,绝不是仅仅包含字符集合这么简单,它一定还需要有用于对象的内存开销,经查,有人根据JVM的内存结构给出了一个String所占用的最少字节数的计算公式 

 
 
  1. 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字节是怎么来的呢?试试下面这段代码:

 
 
  1. public class Test {  
  2.     public static final void main(String[] args) {  
  3.         System.out.println("学java".getBytes().length);  
  4.     }  
  5. }  

是的,我相信简体中文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个字节。

如果你不清楚当前平台/系统的默认字符集,可以用这条语句来看看:

 
 
  1. System.out.println(java.nio.charset.Charset.defaultCharset().toString()); 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值