String、StringBuffer、StringBuilder
异同点:
相同点:都是final类,都不能被继承。
不同点:
1、String长度是不可改变的,StringBuffer、StringBuilder长度是可变的。
2、StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。
如果对这段代码加锁,就可以实现每次只有一个用户能进入这段代码,当执行完了之后,释放这个锁,另一个用户才能进来。
if (money>1000) {
money = money - 1000;
}
常量字符串的拼接,编译器会做优化,使用String就可以:
String str = "Java" + "PHP" + "Python" + "C";
@Test
public void test1(){
String str1 = "abc";
String str2 = new String(" abcd andord of and ios");
String str3 = "abc";
str3.toCharArray();
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true
System.out.println(str2 == str3);//false
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true
System.out.println(str2.indexOf("and",1));//8
System.out.println(str2.toUpperCase(Locale.ROOT));// ABCD ANDORD OF AND IOS ---将所有英文转换成大写
System.out.println(str2.trim());//abcd andord of and ios ---去除两侧的空格
System.out.println(str2.startsWith(" ")); //判断是否以" "开头 true
System.out.println(str2.endsWith("s"));//判断是否以"s"结尾 true
}
@Test
public void test2(){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(1);//在StringBuffer中添加字段的方法
StringBuilder stringBuilder = new StringBuilder();
//StringBuffer和StringBuilder的用法基本相同,但是二者的特性不同
//StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)
System.out.println(stringBuffer);
}
StringBuffer和StringBuilder的区别解释:
拿此段代码做解释
if (money>1000) {
money = money - 1000;
}
程序的运行是需要时间的,假如 money = 1100 ,如果在极短的时间内有两个或多个线程访问了这段程序,第一个访问的线程做完 if 判断后还没有将 money-1000,此时下一个线程到来,money依然>1000,此时第二个线程也将做 money - 1000的操作,这样money就会变成 -900;这样的错误对银行来说是绝对不允许存在的。
StringBuilder做到的就是上述效果。
而 StringBuffer 在第一个线程访问时会给这段语句上锁,其他线程必须等待它执行完才能访问,只能排队等待,等它执行完money变成100 自然不符合>1000的条件,这样做增加了安全性。