黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: fengche    时间: 2013-10-19 17:35
标题: 字符串问题
本帖最后由 fengche 于 2013-10-19 18:39 编辑
  1. public class StringCheese {
  2.     public static void main(String[] args) {
  3.         byte bytes[] = new byte[256];
  4.         for (int i = 0; i < 256; i++)
  5.              bytes[i] = (byte)i;
  6.         String str = new String(bytes);
  7.         for (int i = 0, n = str.length(); i < n; i++)
  8.              System.out.println((int)str.charAt(i) + " ");
  9.     }
  10. }
复制代码
该程序并没有按顺序打印出0到255的整数这是为什么?
作者: wenbaoxing    时间: 2013-10-19 18:15
本帖最后由 wenbaoxing 于 2013-10-19 18:17 编辑

这是可以打印的代码你参考一下:
  1. package com.itheima;

  2. public class StringCheese {
  3.         public static void main(String[] args) {
  4.                 int arrs[] = new int[256];
  5.                 for (int i = 0; i < 256; i++){
  6.                         arrs[i] = i;
  7.                         System.out.println(arrs[i]);
  8.                 }
  9.                
  10.                
  11.         }
  12. }
复制代码

作者: 月夜之鬼魅    时间: 2013-10-19 18:20
我想你可以看看String(byte[])构造器:在通过解码使用平台缺省字符集的制定byte数组来构造一个新的String时,该新的string的 长度是字符集的一个函数,因此不等于byte数组的长度。当给定的所有字节在缺省字符集中并非全部有效时,这个构造器的行为时不确定的。
String
public String(byte[] bytes)通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。
当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。


参数:
bytes - 要解码为字符的 byte

作者: wenbaoxing    时间: 2013-10-19 18:20
这是你的源码,错误地方我做了解释:
  1. public class StringCheese {
  2.     public static void main(String[] args) {
  3.         byte bytes[] = new byte[256];        //byte数组的范围是:-128~127(整数必须在这个范围)
  4.         for (int i = 0; i < 256; i++)
  5.              bytes[i] = (byte)i;
  6.         String str = new String(bytes);
  7.         for (int i = 0, n = str.length(); i < n; i++)
  8.              System.out.println((int)str.charAt(i) + " ");
  9.     }
  10. }
复制代码

作者: 風諾    时间: 2013-10-19 18:36
byte类型范围是-128~127
你在把0~255存进去的时候,由于byte最高位表示正负
前127个数字,int和byte的都只有最低7位有值,而从128开始,由于你的类型强转
使得bytes数组从byte[128]开始,最高位均为1,那么此时,bytes[128]~bytes[255]数值上开始变成-128~-1
你可以在循环了打印验证
这之后你又把bytes数组转成字符串,你可以自己试试,转成字符串的时候,会去找数值对应的字符
1~127还好,有ASCII码,后面的负数我就不知道会怎么样了
经过测试,你这样的转换成字符串,字符串是有内容的,因为str.length()有值
而输出没有结果,大概是因为byte[128]及其后的数组元素存入了不知道什么东东导致的
你可以试试只存0~127,你这种方法是可以使用的输出也是对的
作者: 周志龙    时间: 2013-10-19 18:38

如果楼主已经解惑,请将帖子改为提问结束
作者: 我能学编程吗    时间: 2013-10-19 19:17
其实此问题很简单,拿源码加注释解释如下:
  1. public class StringCheese {
  2.     public static void main(String[] args) {
  3.         byte bytes[] = new byte[256];   // 这一步没错,256改成1000也没有违规
  4.         for (int i = 0; i < 256; i++)
  5.              bytes[i] = (byte)i;    // 关键错在这里,当i=128时,或者大于128时,这样的数byte类型是装不下的,byte变量只能装-128~127之间的数据。当byte b = (byte)128,此时b的值就掉失了精度了。
复制代码





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