关于String StringBuffer 和 StringBulider
String是java中字符串中引用类型。
1.关于==和equals,String字符串的==通常用来判断两个字符串在内存中的地址是否一致,equals用来判断字符串中存放的内容是否一致。
public class Strings {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = "he"+"llo";
String str5 = "he";
str5 = str5 +"llo";
System.out.println(str1==str2); //true;
System.out.println(str1==str3); //false;
System.out.println(str1==str4); //true;
System.out.println(str1==str5); //false;
System.out.println("--------------------");
System.out.println(str1.equals(str2)); //true;
System.out.println(str1.equals(str3)); //true;
System.out.println(str1.equals(str4)); //true;
System.out.println(str1.equals(str5)); //true;
}
}
2.关于字符串的运算效率问题。在字符串的多次循环叠加中直接使用"+"是非常耗费内存和时间的,因为每一次相加,系统都将创建一次对象。建议使用StringBuilder进行字符串运算,可以有效解决字符串相加效率不高的问题。
private static String stringCal() { //3486ms
String s0 = "abcdefghijklmnopqrstuvwxyz";
String s = "";
for(int i=0;i<10000;i++) {
s += s0;//s = s + s0;
}
return s;
}
private static String stringBuildCal() { //2ms
String s0 = "abcdefghijklmnopqrstuvwxyz";
StringBuilder s = new StringBuilder();
for(int i=0;i<10000;i++) {
s.append(s0);
}
return s.toString();
}
StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
