1.借助jdk,选取几个String与StringBuffer、StringBuilder的常用API,并编写实例测试API的成功。
(1)String:
replace():替换
package xinshi;
public class hallo{
public static void main(String[] args){
String s1="123abc";
String s2=s1.replace('a','4');
System.out.println(s2);
}
}//结果:1234bc
toUpperCase():转换成大写字母
package xinshi;
public class hallo {
public static void main(String[] args) {
String s="string";
System.out.println(s. toUpperCase());
}
}
//结果:STRING
(2)StringBuffer:
reverse():字符串倒序
package xinshi;
public class hallo {
public static void main(String[] args) {
StringBuffer s=new StringBuffer("stringbuffer");
System.out.println(s. reverse());
}
}//结果:reffubgnirts
delete():删除指定字符段
package xinshi;
public class hallo {
public static void main(String[] args) {
StringBuffer s=new StringBuffer("stringbuffer");
System.out.println(s. delete(2,6));
}
}//结果:stbuffer
(3)StringBuilder:
deleteCharAt():删除指定字符
package xinshi;
public class hallo {
public static void main(String[] args) {
StringBuilder s=new StringBuilder("stringbuilder");
System.out.println(s. deleteCharAt(2));
}
}//结果:stingbuilder
insert():插入字符串
package xinshi;
public class hallo {
public static void main(String[] args) {
StringBuilder s1=new StringBuilder("string");
StringBuilder s2=new StringBuilder("bulider");
System.out.println(s1.insert(6,s2));
}
}//结果:stringbulider
请简述String、StringBuffer、StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
相同点:
(1).内部实现基于字符数组,封装了对字符串处理的各种操作
(2).可自动检测数组越界等运行时异常
区别:
(1).String内部实现基于常量字符数组,内容不可变;
StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变。
(2).性能方面:对于字符串的处理,相对来说 StringBuilder > StringBuffer >String
(3).StringBuffer线程安全,StringBuilder非线程安全。
应用场景:
String在字符串不经常变化的场景中使用,如常量的声明,简单的变量运算。
StringBuffer在进行频繁的字符运算和多线程环境中使用。
StringBuilder在进行频繁的字符运算和单线程环境中使用。
3.为什么不建议在for循环中使用“+”进行字符串拼接?
如果使用“+”进行字符串拼接,不论是String还是优化后的StringBuffer,每次进行拼接时,都会产生新对象。所以在循环里,就会不断生成新对象,浪费资源,效率低下。
4.什么是字符串的解码与编码?请举例说明。
将unicode字符集转为本地字符集(如GB2312或GBK)的过程叫编码,反之叫解码。
编码 例:
package xinshi;
import java.io.*;
public class CharCode {
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]));
}
}
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());
byte[] b=str.getBytes("GB2312");
printByteArray("GB2312",b);
byte[] m=str.getBytes("ISO8859-1");
printByteArray("ISO8859-1",m);
}
catch(UnsupportedEncodingException e) {
System.out.println("没有相应字符集!");
}
}
}
结果:
中文
unicode:**********
4e2d
6587
GB2312**********
ffffffd6
ffffffd0
ffffffce
ffffffc4
ISO8859-1**********
3f
3f
解码 例:
package xinshi;
public class Decode {
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]));
}
}
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) {
byte[] b=new byte[6];
int t=0,pos=0;
String s;
try {
while(t!='\n') {
t=System.in.read();
b[pos]=(byte)t;
pos++;
}
printByteArray("本地码:",b);
s=new String(b,"GBK");
System.out.println(s);
printCharArray("unicode:",s.toCharArray());
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
结果:
中文(窗口输入)
本地码:**********
ffffffd6
ffffffd0
ffffffce
ffffffc4
d
a
中文
unicode:**********
4e2d
6587
d
a