1. 借助JDK, 选取几个String与StringBuffer 、StringBuilder的常用API,并编写实例测试API的功能。
class test{
public static void main(String[] args){
String s1 = new String("hello");
StringBuffer s2 = new StringBuffer("good");
StringBuilder s3 = new StringBuilder("world");
System.out.println(s1.concat(" judy!"));
System.out.println(s1.replace('l', 'm'));
System.out.println(s1);//s1没有改变
String[] s4 = new String[2];
s4=s1.split("e");
System.out.println(s4[1]);
System.out.println(s2.replace(1, 3, "a"));
System.out.println(s2.reverse());
System.out.println(s2);//s2被改变了
System.out.println(s2.insert(2, "233"));
s2=s2.append(s1);
System.out.println(s2.length());
}
}
class test{
public static void main(String[] args){
int m = 1;
String s = "a";
long startTime1 = System.currentTimeMillis();
for(int i=0; i<100000;i++){
s = s + m ; //效率低下,需新建一万个对象
}
long endTime1 = System.currentTimeMillis();
System.out.println("程序运行时间:"+ (endTime1-startTime1)+"ms");
int n = 1;
StringBuffer st = new StringBuffer("a"); //效率较高,只需新建一个对象
long startTime2 = System.currentTimeMillis();
for(int i=0; i<100000;i++){
st.append(n);
}
long endTime2 = System.currentTimeMillis();
System.out.println("程序运行时间:"+ (endTime2-startTime2)+"ms");
int q = 1;
StringBuilder sd = new StringBuilder("a"); //效率较高,只需新建一个对象
long startTime3 = System.currentTimeMillis();
for(int i=0; i<100000;i++){
sd.append(q);
}
long endTime3 = System.currentTimeMillis();
System.out.println("程序运行时间:"+ (endTime3-startTime3)+"ms");
}
}
2. 请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
- String对象是不可变的,在String类中每一个看起来会修改String对象内容的方法,实质都是创建了一个全新的String对象。
- StringBuffer对象的值是可变的,对字符串的增加、插入、修改、删除等操作比String高效,不需多次创建新的对象。
- StringBuilder,其与StringBuffer的API兼容,性能比StringBuffer更高,但不是线程安全的。
- 在运行速度方面,从上一题的程序运行结果可以看出String的处理速度比StringBuffer和StringBuilder慢得多。
- 在安全性方面,string被设计成不可变是更加安全的,尤其是作为参数传递时,且String哈希码具有唯一性,可以缓存。而StringBuffer和StringBuilder相比,StringBuffer具有线程安全性。
3. 为什么不建议在for循环中使用“+”进行字符串拼接?
从第1题的代码示例中可以看出,当for循环次数很多时,由于String是不可变对象,每次对其进行字符串拼接都需要创建一个新的对象,非常消耗内存空间,且创建对象耗时较多,因此程序运行会需要更长时间。
可以首先将String对象转换成StringBuffer对象,在循环中使用StringBuffer对象的append方法,这样只需要创建一个对象,消耗更少,最后只需要将StringBuffer对象转换成String对象输出。
4. 什么是字符串的编码与解码?请举例说明。
编码:将Unicode字符集转换为本地字符集(GB2312或GBK)的过程。
import java.io.*;
public class test {
public static void printByteArray(String msg,byte[] t){
System.out.println(msg+"****************");
for(int i=0;i<t.length;i++){
System.out.println(Integer.toHexString(t[i]));
}//Integer.toHexString将十进制转成十六进制输出
}
public static void printCharArray(String msg,char[] c){
System.out.println(msg+"****************");
for(int i=0;i<c.length;i++){
System.out.println(Integer.toHexString(c[i]));
}
}
public static void main(String[] args){
try{
String str = "你好";
System.out.println(str);
printCharArray("unicode:",str.toCharArray()); //unicode字符集中对"你好"二字的对应十六进制代码,toCharArray将字符串转换为字符数组
byte[] b =str.getBytes("GB2312"); //编码:转为本地字符集GBK2312对应的十六进制代码
printByteArray("GB2312",b);
}
catch(UnsupportedEncodingException e){
System.out.println("没有相应的字符集!");
}
}
}
解码:将本地字符集转换为Unicode字符集的过程。