黑马程序员技术交流社区

标题: 关于String类中 getBytes()的一点疑问 [打印本页]

作者: 李俊伟    时间: 2013-1-22 12:47
标题: 关于String类中 getBytes()的一点疑问
本帖最后由 张向辉 于 2013-1-23 10:06 编辑

代码示例:
public class Test10 {
public static void main(String[] args) throws InterruptedException {
  String ss = "abcd中国";
  byte[] ByteArr = new byte[ss.length()];
  ByteArr = ss.getBytes();
  System.out.println("字符串长度:"+ss.length());
  System.out.println("字节数组长度"+ByteArr.length);
  for(int i=0;i<ByteArr.length;i++)
  {
   Thread.currentThread().sleep(1000);
   System.out.println(ByteArr);
  }
}
}
打印结果:
字符串长度:6
字节数组长度8
97
98
99
100
-42
-48
-71
-6

疑问:起初我给字节数组ByteArr分配了6个字节的地址空间,但是字符串ss转换成字节数组后,字节数已经变为8个了,为什么还能存进只有6个字节地址空间数组里面?
按理说应该会抛出数组下标越界之类的异常,但是程序能正常运行,求解惑?

作者: 黑马刘杰    时间: 2013-1-22 13:23
  1. public class Test10 {
  2.         public static void main(String[] args) throws InterruptedException {
  3.                 String ss = "abcd中国";
  4.                 byte[] ByteArr = new byte[6];
  5.                 //ss.getBytes()将ss字符串存储到一个新的 byte 数组中,ByteArr又重新指向一个新的内存地址,这个内存地址的字节长度为8
  6.                 ByteArr = ss.getBytes();
  7.                 System.out.println("字符串长度:" + ss.length());
  8.                 System.out.println("字节数组长度" + ByteArr.length);
  9.                 for (int i = 0; i < ByteArr.length; i++) {
  10.                         Thread.currentThread().sleep(1000);
  11.                         System.out.println(ByteArr[i]);
  12.                 }
  13.         }
  14. }
复制代码

作者: 黑马-周科    时间: 2013-1-22 13:25
应该是 字符串与byte之间的转换的问题。
同一个字符在不同的编码下会编成不同长度的编码。

1个中文字符 = 2 个字节。

不影响编译。
作者: vmvm555    时间: 2013-1-22 13:39
好吧,System.out.println("字符串长度:"+ss.length()); 这句话打印的是该字符串Unicode 代码单元的数量,什么是Unicode 代码单元,代码单元可以理解为字符编码的一个基本单元,最常用的代码单元是字节(一个字节八位),汉字占两个字节,所以说原来字符串也就是8个字节,不存在6个字节变为8个的这种说法
作者: 李俊伟    时间: 2013-1-22 14:30
我在控制台上又试了试,
(1假如只把
byte[] ByteArr = new byte[ss.length()];
改为:byte[] ByteArr = new byte[1];
其他代码不变,照样能能得到提问中的运行结果。
(2)或者把
byte[] ByteArr = new byte[ss.length()];
ByteArr = ss.getBytes();
合并改为:byte[] ByteArr = ss.getBytes();
一样也能得到提问中的运行结果。
第二种情况我能理解。
第二种情况相当于:byte[] ByteArr  = {97,98,99,100,-42,-48,-71,-6};
那这种情况的赋值的过程是怎样的,也请给讲一讲?
作者: 何创    时间: 2013-1-22 14:53
汉子 “中国”,两个字符,一个字符占两个字节,这就是四个字节。因为原来ss是字符,所以ss按字符算的话就是 abcd四个 加后面两个,就是六个。所以打印结果是6 。后面将字符转换成了字节,长度就要按照字节的长度进行运算,就是abcd四个+中国四个字节,就是8个。你ss.getBytes();得到的字节数组,已经覆盖了原来你定义的字节数组,不是以前的那个字节数组了,新的字节数组的长度就是你ss.getBytes()它的长度,也就是8个字节数组的长度。
懂了吧。。
作者: yong230    时间: 2013-1-22 15:31
同意上面的说法:ss.getBytes();得到的字节数组,已经覆盖了原来你定义的字节数组,不是以前的那个字节数组了,新的字节数组的长度就是你ss.getBytes()它的长度,也就是8个字节数组的长度。

作者: 胥文    时间: 2013-1-22 19:09
byte[] ByteArr = new byte[ss.length()];
ByteArr = ss.getBytes();
按照你的理解你就认为ByteArr赋值以后就不能在赋值了,就好比我定义x=3,我就不能在把5赋给x了
你就当第一句话是初始化值,后面是你赋的值,看这样你能不能理解

作者: txl    时间: 2013-1-22 19:40
同意楼上所说,附上代码
  1. public class Test10 {
  2. public static void main(String[] args) throws InterruptedException {
  3.   String ss = "abcd中国";
  4.   byte[] ByteArr = new byte[ss.length()];
  5.   System.out.println("字节数组长度"+ByteArr.length);
  6.   ByteArr = ss.getBytes();
  7.   System.out.println("字符串长度:"+ss.length());
  8.   System.out.println("字节数组长度"+ByteArr.length);
  9.   for(int i=0;i<ByteArr.length;i++)
  10.   {
  11.    System.out.println(ByteArr[i]);
  12.   }
  13. }
  14. }
复制代码
结果为:
字节数组长度6
字符串长度:6
字节数组长度8
97
98
99
100
-42
-48
-71
-6





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2