1,借助JDK,选取几个String与StringBuffer,StringBuilder的常用API,并编写实例测试API的功能呢
1 /**JDK中String 常用API equals 源码
2 public boolean equals(Object anObject) {
3 if (this == anObject) {
4 return true;
5 }
6 if (anObject instanceof String) {
7 String anotherString = (String)anObject;
8 int n = value.length;
9 if (n == anotherString.value.length) {
10 char v1[] = value;
11 char v2[] = anotherString.value;
12 int i = 0;
13 while (n-- != 0) {
14 if (v1[i] != v2[i])
15 return false;
16 i++;
17 }
18 return true;
19 }
20 }
21 return false;
22 }
23 **/
24
25 String a="123";
26 String b="123";
27 System.out.println(a.equals(b)
StringBuilder常用API
//创建StringBuilder对象
2 StringBuilder bu = new StringBuilder();
3 //使用append方法添加数据
4 //注意:append方法返回的是this自身,无需接收返回值
5 bu.append("abc");
6 bu.append(111);
7 bu.append(true)
8 bu.append('中');
9 bu.append(3.1415);
10 System.out.println(bu);// abc111true中3.1415
11
12 //链式编程:方法返回值是一个对象,可以继续调用方法
13 bu.append("abc").append(111).append(true).append('中').append(3.1415);
14 System.out.println(bu);//abc111true中3.1415
StringBuffer常用API
1 /**
2 1. append(参数); 向StringBuffer对象后追加任意类型的数据,返回StringBuffer。它有多个重载方法,可以追加int string char object array等
3 **/
4
5 StringBuffer buffer = new StringBuffer();
6
7 buffer.append(89);
8
9
10 /**
11 2. capacity(); 返回int capacity,即缓冲区的容量大小
12 **/
13
14 StringBuffer buffer = new StringBuffer("abc");
15
16
17
18 buffer.capacity();
19
20 //返回19; 原本16的容量加上字符串长度
21
22
23
24 //3. charAt(int index); 返回缓冲区指定索引处的char字符
25
26 StringBuffer buffer = new StringBuffer("abc");
27
28 buffer.charAt(1);//取得b
2,请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用
共同点:
(1)内部实现基于字符数组,封装了对字符串处理的各种操作
(2)可自动检测数组越界等运行时异常
区别:
(1)String内部实现基于常量字符数组,内容不可变;StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变
(2)性能方面,对于字符串的处理,相对来说StringBuilder>StringBuffer>String
(3)StringBuffer线程安全;StringBuilder非线程安全
使用:
1.使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
2.使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
3.使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
3,为什么不建议在for循环中使用“+”进行字符串拼接?
常用的字符串拼接方式有五种,分别是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。
用时从短到长的对比:StringBuilder < StringBuffer < concat < + < StringUtils.join
由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。
而“+”反编译后的代码,在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。
而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。
因此,经过对比发现,直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。
但是,还要强调的是:
(1)如果不是在循环体中进行字符串拼接的话,直接使用+就好了。
(2)如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。
4,什么是字符串的编码和解码?请举例说明
将unicode字符集转为本地字符集(如GB2312或GBK)的过程叫编码,反之叫解码
【例】将程序中的含有中文的字符串进行编码
import
java.io. *;
public class CharCode{
public static void printByteArray(String msg,byte[] t){
System.out.println(msg + "****************");
for(int i = ;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.toHexSring(c[i]));
}
}
public static void main (String[] args){
try{
String str = "中文";
System.out.println(str);
//unicode字符集中“中文”二字的对应代码
printCharArray("unicode:",str.toCharArray());
//转为本地字符集GB2312对应的代码
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("没有相应的字符集!");
}
}
}
【例】设定从键盘输入相应的字符存入字节数组B中,将其解码为unicode字符
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"); //按照GBK方式进行解码
System.out.println(s);
printCharArray("unicode码:",s.toCharArray());
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}