String x = "abc"和String y = new String("abc")的区别
x变量指向的是常量池中的字符串常量对象,y变量指向的是堆空间中的字符串对象,但堆中字符串对象需要以常量池中字符串常量对象作为模板,所以y其实产生了两个对象,一个在常量池一个在堆中。
例子:
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str3 == str4);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str3.equals(str4));
输出的结果:true false false true true true
String和StringBuffer的区别
String具有长度不可改变的特性,在字符串对象做添加,删除,替换时不会更改原来的字符串对象,而是产生新
新的字符串
对象
StringBuffer是为了解决String内容不可变而产生的
StringBuffer会在缓冲区中开辟一个空间,当StringBuffer的内容作连接、替换、删除等操作时不会产生新对象。
例子:
String x = "abc";
StringBuffer sb = new StringBuffer("abc");
test(x,sb);
Sysotem.out.println(x+" "+sb);
private static void test(String x,StringBuffer sb){
x = x+"***";
sb.append("***");
x变量指向的是常量池中的字符串常量对象,y变量指向的是堆空间中的字符串对象,但堆中字符串对象需要以常量池中字符串常量对象作为模板,所以y其实产生了两个对象,一个在常量池一个在堆中。
例子:
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str3 == str4);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str3.equals(str4));
输出的结果:true false false true true true
String和StringBuffer的区别
String具有长度不可改变的特性,在字符串对象做添加,删除,替换时不会更改原来的字符串对象,而是产生新
新的字符串
对象
StringBuffer是为了解决String内容不可变而产生的
StringBuffer会在缓冲区中开辟一个空间,当StringBuffer的内容作连接、替换、删除等操作时不会产生新对象。
例子:
String x = "abc";
StringBuffer sb = new StringBuffer("abc");
test(x,sb);
Sysotem.out.println(x+" "+sb);
private static void test(String x,StringBuffer sb){
x = x+"***";
sb.append("***");
}
结果:abc abc***;
因为String改变内容是要产生新对象,而StringBuffer不会
StringBuffer的效率比String要高,线程安全