String内部机制是什么,为什么无法正确存放一些“非字符”?
我以前一直以为string内部是流的机制,因此一些不在正常字符表的数据也是可以塞进去的,直到我发现了下面这段代码
short s=255;
char[] ch=new char[2];
ch[0]=(char)(0xFF&s>>8);
ch[1]=(char)(0xFF&s);
String test = new String(ch);
System.out.println(test.length());
System.out.println(test);
byte[] b = test.getBytes();
System.out.println(b.length);
s = (short) ((b[0 + 1] << 8) | b[0 + 0] & 0xff);
System.out.println(s);
我本来的想法是把short数以流的方式存入到string,这样就只需要两个字节而不是传统字符串的3个,但是我首先发现这样干后,test字符串的长度会奇怪的变成3,而且后面希望还原short数的值的做法也失败了。这是为什么呢
------解决方案--------------------首先要明白char和byte的区别
char是字符,字符就有自己的编码方式
byte是字节,它是二进制,没有编码方式
因此:
String test = new String(ch);
System.out.println(test.length());//这里一定是2,因为字符串就是由字符组成的,这里有2个字符,所以长度是2
byte[] b = test.getBytes();//但是,这里是按照默认的编码方式,把字符串编码成字节数组,默认的编码方式跟os相关,同一个字节数组在不同的编码方式下面表示的字符是不一样的!!!!!
因此:byte[] b = test.getBytes();这种方式是不推荐使用的!
正确的用法是:byte[] b = test.getBytes(“GBK”);在参数指定按照哪一种编码方式把字符串编码成字节数组