String 不可改变类,任何对String对象的改变只会生成新的String对象。
StringBuffer可变类,任何对它所指代的字符串的改变都不会产生新的对象。(线程安全)
StringBuilder可变类,JDK5.0 引入,任何对它所指代的字符串的改变都不会产生新的对象。(线程不安全)
String的常用方法
public class StringAPI {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "hello java!";
// indexOf()方法;返回指定字符串或字符在字符串中第一次出现的索引
int index = s1.indexOf('h');// result:0
System.out.println(index);
index = s1.indexOf("java");// result:6
System.out.println(index);
// charAt(); 将指定索引处的字符去除来;
char c1=s1.charAt(6);//result:j
System.out.println(c1);
// substring()方法; 截取字符串的方法;
// 指定一个索引值认为开始截取的位置(包含当前索引处字符)
String sb1 = s1.substring(0);// reuslt:"hello java!"
System.out.println(sb1);
// 指定开始的索引值和结束的索引值(包含开始的字符不包含结束处的字符);
String sb2 = s1.substring(6, 10);// 结果为"java"没有"!"号
System.out.println(sb2);
//split()方法; 以指定字符或字符串将一个字符串分割成字符串数组;
String s2="aaa bbb ccc ddd fff";
String [] st=s2.split(" ");
for(String s3:st){
System.out.println(s3);
}
//字符串的比较方法
String s4="aaa";
String s5="AAA";
//equals() 常规比较方法
System.out.println("aaa".equals(s4));
//equalsIgnoreCase() 不区分大小写的比较俩个字符
System.out.println("AAA".equalsIgnoreCase(s4));
//toLowerCase() 将字符串所有字母转换为小写;
s5= s5.toLowerCase();
System.out.println("aaa".equals(s5));
// toUpperCase();将字符串所有字母转换为大写;
s4 = s4.toUpperCase();
System.out.println("AAA".equals(s4));
//trim(); 去除字符串前后的空格
String s6=" aaa ";
s6=s6.trim();
System.out.println("aaa".equals(s6));
//compareTo();比较字符串的先后顺序方法 根据每个字符的Unicode 逐一比较
String s7="abc";
String s8="def";
String s9="abc";
String s10="aab";
System.out.println(s7.compareTo(s8));//结果小于0 说明前一个字符在后一个字符之前
System.out.println(s7.compareTo(s9));//结果等于0 说明字符串相等
System.out.println(s7.compareTo(s10));//结果大于0 说明前一个字符在后一个字符之后
// 扩展 StringBuffer类的 字符串反转 reverse();
String s11="abcdef";
StringBuffer s12=new StringBuffer(s11);
s11= s12.reverse().toString();
System.out.println(s11);//result:"fedcba";
}
}
String与StringBuffer的效率
通过对相同字符串的操作时间的差别来检测两者的执行效率如下:
import java.security.Timestamp;
public class StringBufferTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = null;
StringBuffer stb = new StringBuffer();
long time = System.currentTimeMillis();
for (int i = 1; i < 10000; i++) {
str = i + "";
}
System.out.println(System.currentTimeMillis() - time);// result:37
long time1 = System.currentTimeMillis();
for (int j = 1; j < 10000; j++) {
stb.append(j + "");
}
System.out.println(System.currentTimeMillis() - time1);// result:12
// 显然StringBuffer比String的执行时间短,效率高很多
}
}
StringBuffer与StringBuilder的区别
两者的的继承的API 是没什么区别的,主要就是StringBuffer是线程安全的也就是说他的一些方法是定义为
synchronized方法,而StringBuilder是线程不安全的也就是说不存在synchronized方法,因为不存在线程同步的一些定义所以执行效率上要比StringBuffer稍高些,在不存在线程的同步的单线程操作数据时多选用StringBuilder类。