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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)