由于客户端发送过来的指定长度字符串报文都是按字节长度来计数的,且通讯底层也是通过字节进行发送,故在服务端接收报文时都是先按字节统一接收后暂存在字节数组中。在截取字符串报文指定域时,都是先手动分配内存空间,然后使用System.arraycopy(Object src,int strPos,Object dest,int destPos,int length)函数将报文字节数组中指定索引位置及字节数copy到先前手动分配内存空间,然后再通过new String(byte[] bytes)或new String(byte[] bytes,String encoding)生成字符串,不仅繁琐,而且效率也不高。最近发现了新大陆,String竟还有另外很多很实用的构造函数,今天登记一下,以后备查。
new String() 构造一个空字符串对象。
new String(byte[] bytes) 通过byte(字节)数组构造字符串对象。
new String(bytes[] bytes,String encoding) 通过byte(字节)数组,按encoding编码构造字符串对象。
new String(byte[] bytes,int offset,int length) 通过获取从offset下标处开始,总共length个byte(字节)的子byte(字节)数组,构造字符串对象。
new String(byte[] bytes,int offset,int length,String encoding) 通过获取从offset下标处开始,总共length个byte(字节)的子byte(字节)数组,按encoding编码构造字符串对象。
new String(String original) 构造一个original字符串的副本,即copy一个original字符串。
例:
byte[] bytes = new byte[]{‘a’,’b’,’c’,’d’,’e’,’f’};
String str_empty = new String();
String str = new String(bytes);
String str_utf8 = new String(bytes,”utf-8”);
String str2_3 = new String(bytes,2,3);
String str2_3_utf8 = new String(bytes,2,3,”utf-8”);
String copy_str2_3_utf8 = new String(str2_3_utf8);
System.out.println(str_empty);
System.out.println(str);
System.out.println(str_utf8);
System.out.println(str2_3);
System.out.println(str2_3_utf8);
System.out.println(copy_str2_3_utf8);
输出:
abcdef
abcdef
cde
cde
cde