1.借助JDK, 选取几个String与StringBuffer 、StringBuilder的常用API,并编写实例测试API的功能。
String
StringBuffer
StringBuilder(与Buffer类似):
2.请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
共同点:内部实现基于字符数组,封装了对字符串处理的各种操作;可自动检测数组越界等运行时异常
区别:
String:具有不可变性,作为参数传递时传引用);常作为参数传递;
StringBuffer:值是可变的,具有对象引用传递特点;对字符串的增加、插入、修改、删除等操作比String高效(不需多次创建新的对象);
StringBuilder:内容可变,与StringBuffer的API兼容,性能比StringBuffer更高,但不是线程安全的;
性能方面,对于字符串的处理,相对来说
StringBuilder >StringBuffer>String
3.为什么不建议在for循环中使用“+”进行字符串拼接?
因为在String中使用+,并不是对对象进行修改,而是创建新对象。如果在for循环中用+进行拼接,则会浪费空间和时间,导致性能低下,影响执行效率。
e.g.
4.什么是字符串的编码与解码?请举例说明。
编码:将Unicode字符集转换为本地字符集(GB2312或GBK)的过程,相当于将英文翻译成中文。
e.g.
import java.io.*;
public class bianma {
public static void main(String[]args)throws IOException {
String str="中文";
System.out.println(str);
//输出"中文"
char[]c=str.toCharArray();
System.out.println(c);
//输出"中文"
//unicode字符集中“中文”二字对应的代码
for(int i=0;i<c.length;i++)
System.out.println(Integer.toHexString(c[i]));
//输出:4e2d
// 6587
//编码 国标
byte[] b=str.getBytes("GB2312");
for(int i=0;i<b.length;i++)
System.out.println(Integer.toHexString(b[i]));
//输出:ffffffd6
// ffffffd0
// ffffffce
// ffffffc4
//编码 英文字符集
byte[] d=str.getBytes("ISO8859-1");
for(int i=0;i<d.length;i++)
System.out.println(Integer.toHexString(d[i]));
//输出:3f
// 3f
//(没有对应的汉字代码,转化错误)
}
}
解码:将本地字符集转换为Unicode字符集的过程,相当于将中文翻译成英文。
e.g.
注:这里对课本中的
产生疑问,因为
“中”:2 bytes;
“文”:2 bytes;
(按一下回车会有两个符)
回车符’\r’:2 bytes;
换行符’\n’:2 bytes;
所以我认为应该改成
实验结果:
‘6’:
‘8’:
以下是实验内容
import java.io.*;
public class jiema {
public static void main(String[]args)throws IOException {
byte[]b=new byte[8];
//"中":2 bytes;
//"文":2 bytes;
//(按一下回车会有两个符)
//回车符'\r':2 bytes;
//换行符'\n':2 bytes;
int t=0,pos=0;
String s;
while(t!='\n'){//换行
t=System.in.read();//输入内容按字节读入存放
b[pos]=(byte)t;
pos++;
}
//System.out.println();
//本地码
for(int i=0;i<b.length;i++)
System.out.println(Integer.toHexString(b[i]));
//输出:ffffffe4
// ffffffb8
// ffffffad
// ffffffe6
// ffffff96
// ffffff87
// d //回车
// a //换行
//解码 Unicode
s=new String(b,"UTF8");//按照UTF8方式进行解码
char []d=s.toCharArray();
for(int i=0;i<d.length;i++)
System.out.println(Integer.toHexString(d[i]));
//输出:6d93
// e15f
// 6783 //UTF8类型
// d
// a
s=new String(b,"GBK");//按照GBK方式进行解码
char []e=s.toCharArray();
for(int i=0;i<e.length;i++)
System.out.println(Integer.toHexString(e[i]));
//输出:4e2d
// 6587 //GBK类型
// d
// a
}
}