1. 借助JDK文档, 选取String与StringBuffer 、StringBuilder的常用API,并编写实例测试API的功能。
JDK文档:Java Platform SE 8
2. 请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
相同点 :
>>内部实现基于字符数组,封装了对字符串处理的各种操作
>>可自动检测数组越界等运行时异常
不同点:
>>String内部实现基于常量字符数组,内容不可变;StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变
>>性能方面,对于字符串的处理,相对来说StringBuilder > StringBuffer > String
>>StringBuffer线程安全;StringBuilder非线程安全
例如在多次字符串拼接时,应使用StringBuilder或StringBuffer
3. 为什么不建议在for循环中使用“+”进行字符串拼接?
//String字符串拼接:
String s = "a";
for(int i=0; i<10000;i++){
s = s + “b” ; //编译器会进行优化,但此种写法仍然效率低下,循环体内每次
需要产生StringBuilder对象
//StringBuilder字符串拼接:
StringBuilder st = new StringBuilder("a"); //效率较高,只需新建一个对象
for(int i=0; i<10000;i++){
st.append(“b");
}
字符串拼接,应使用StringBuilder或StringBuffer,并将对象创建语句放到 循环体外
课后题:
3.String类型有什么特点?
String对象是不可变的
String 作为参数传递时:尽管是传引用,但通过形参引用并未改变实参指向的字符串内容
public class Str {
public void changePara(String s){
s = s +"a";
}
public void invoke(){
String s ="b";
changePara(s);
System.out.println(s); // 运行结果:b
}
public static void main(String[] str){
Str s = new Str();
s.invoke();
}
}
4.String什么时候进行值比较,什么时候进行引用比较?
"=="用来进行引用地址比较,"equals"用来进行值比较
String s1 = "abc";//常量池
String s3 = "abc";//常量池 与s1指向相同
String s2 = new String(“abc");//堆上创建
String s4 = new String(“abc");//堆上创建
System.out.println(s1==s2); // false
System.out.println(s1==s3); // true
System.out.println(s1.equals(s3)); // true
System.out.println(s2==s4); // false
System.out.println(s2.equals(s4)); // true
5.String与StringBuffer有什么区别?如何互相转化?
String对象的值是不可变的,目的是为了兼顾效率和安全
StringBuffer对象的值是可变的,对字符串的增加、插入、修改、删除等操作比String高效(不需多次创建新的对象)。
例如:
public class Str {
public void changePara(String s){
s = s +"a";
}
public void invoke(){
String s ="b";
changePara(s);
System.out.println(s);
}
public static void main(String[]str){
Str s = new Str();
s.invoke();
}
}
//输出b
public class Str {
public void changePara(StringBuffer s){
s = s.append("a");
}
public void invoke(){
StringBuffer s =new StringBuffer("b");
changePara(s);
System.out.println(s);
}
public static void main(String[]str){
Str s = new Str();
s.invoke();
}
}
//输出ba
转化:
String -> StringBuffer
方式一:构造方法
方式二:通过append方法
StringBuffer -> String
方式一:通过构造方法
方式二:通过toString方法
public class StringAndStringBufferSwitch {
public static void main(String[] args) {
//String -> StringBuffer
//创建一个String对象
String str = "Hi Java!";
System.out.println(str);
//方式一:构造方法
StringBuffer buffer = new StringBuffer(str);
System.out.println(buffer);
//方式二:通过append方法
StringBuffer buffer2 = new StringBuffer();
buffer2.append(str);
System.out.println(buffer2);
//StringBuffer -> String
//创建一个StringBuffer对象
StringBuffer buffer3 = new StringBuffer();
buffer3.append("Happy birthday Java!");
System.out.println(buffer3);
//方式一:通过构造方法
String str2 = new String(buffer3);
System.out.println(str2);
//方式二:通过toString方法
String str3 = buffer3.toString();
System.out.println(str3);
}
}