A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李俊伟 中级黑马   /  2013-1-22 12:47  /  1695 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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个字节地址空间数组里面?
按理说应该会抛出数组下标越界之类的异常,但是程序能正常运行,求解惑?

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

8 个回复

倒序浏览
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
应该是 字符串与byte之间的转换的问题。
同一个字符在不同的编码下会编成不同长度的编码。

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

不影响编译。
回复 使用道具 举报
好吧,System.out.println("字符串长度:"+ss.length()); 这句话打印的是该字符串Unicode 代码单元的数量,什么是Unicode 代码单元,代码单元可以理解为字符编码的一个基本单元,最常用的代码单元是字节(一个字节八位),汉字占两个字节,所以说原来字符串也就是8个字节,不存在6个字节变为8个的这种说法
回复 使用道具 举报
我在控制台上又试了试,
(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};
那这种情况的赋值的过程是怎样的,也请给讲一讲?
回复 使用道具 举报
汉子 “中国”,两个字符,一个字符占两个字节,这就是四个字节。因为原来ss是字符,所以ss按字符算的话就是 abcd四个 加后面两个,就是六个。所以打印结果是6 。后面将字符转换成了字节,长度就要按照字节的长度进行运算,就是abcd四个+中国四个字节,就是8个。你ss.getBytes();得到的字节数组,已经覆盖了原来你定义的字节数组,不是以前的那个字节数组了,新的字节数组的长度就是你ss.getBytes()它的长度,也就是8个字节数组的长度。
懂了吧。。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

回复 使用道具 举报
同意上面的说法:ss.getBytes();得到的字节数组,已经覆盖了原来你定义的字节数组,不是以前的那个字节数组了,新的字节数组的长度就是你ss.getBytes()它的长度,也就是8个字节数组的长度。
回复 使用道具 举报
胥文 中级黑马 2013-1-22 19:09:07
8#
byte[] ByteArr = new byte[ss.length()];
ByteArr = ss.getBytes();
按照你的理解你就认为ByteArr赋值以后就不能在赋值了,就好比我定义x=3,我就不能在把5赋给x了
你就当第一句话是初始化值,后面是你赋的值,看这样你能不能理解
回复 使用道具 举报
txl 中级黑马 2013-1-22 19:40:15
9#
同意楼上所说,附上代码
  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

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马