public class edit0801 {
public static void main(String[] args) {
String a="hzau2017317";
System.out.println("String API");
int l=a.length();
int charu=a.indexOf('u');
String ua=a.toUpperCase();
System.out.println(l+"\n"+charu+"\n"+ua);
System.out.println("--------------------------\nStringBuffer API");
StringBuffer ab=new StringBuffer();
System.out.println("ab.capacity:"+ab.capacity());
ab=new StringBuffer(100);
System.out.println("100ab.capacity:"+ab.capacity());
ab.append(a);
ab.append(" is ").append("a School of Information");
System.out.println("ab:"+ab);
System.out.println("--------------------------\nStringBuilder API");
StringBuilder abl=new StringBuilder(a);
System.out.println("abl.capacity:"+abl.capacity());
System.out.println("abl:"+abl);
abl.append(" is ").append("a School of Information");
System.out.println("abl:"+abl);
}
}
String不可变,当生成新的字符串时会新生成空间存储,不会再原字符串上操作。
StringBuffer和StringBuilder都是可变,StringBuffer对象可以调用其方法动态地进行添加,插入,修改和删除操作且不用像数组那样实现指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串灵活方便。
相同点:
1、内部实现基于字符数组,封装了对字符串处理的各种操作
2、可自动检测数组越界等运行时异常
不同点:
1、String内部实现基于常量字符数组,内容不可变; StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变
2、性能方面,对于字符串的处理,相对来说StringBuilder >StringBuffer>String
3、StringBuffer线程安全;StringBuilder非线程安全
String在需要安全的情况下使用,StringBuffer线程需要灵活操作的情况下使用,StringBuilder在仅需要灵活操作的情况下使用。
在连接String型字符串时,系统会不断申请空间浪费资源效率低。
将unicode字符集转为本地字符集(如GB2312或GBK)的过程叫编码,反之叫解码。
编码课本例8.3
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);
//unicode字符集中“中文”对应的代码
printCharArray("unicode:",str.toCharArray());
//转为本地GBK2312对应的代码
byte[] b =str.getBytes("GB2312");
printByteArray("GB2312",b);
//转为ISO8859-1对应的代码,因为ISO8859-1是英文字符集
//没有对应的代码,所以转化错误
byte[] m =str.getBytes("ISO8859-1");
printByteArray("ISO8859-1",m);
}
catch(UnsupportedEncodingException e){
System.out.println("没有对应的字符集!");
}
}
}
解码课本例8.4
import java.io.*;
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());
}
}
}