String字符串详解
equals和==
在java中,equals和主要用于比较两个对象,对于基本数据类型来说,主要用于值比较,而基本数据类型不能用equals比较,对于引用类型来说,如果没有重写Object里面的equals方法,那么和equals比较的都是对象的引用地址,因为Object里面的equals方法就是用实现的,String重写了equals,主要比较内容是否一样。
String里面的常见比较
public class TestString {
public static void main(String[] args) {
String a = "a";
String b = "bc";
final String c = "a";
final String d = "bc";
String str1 = "abc";
String str2 = "abc";
String str3 =new String("abc");
String str4 =new String("abc");
String str5 = str3.intern();
String str6 = "a"+"b"+"c";
String str7 = a+b;
String str8 = c+d;
//所有的equals都是比较内容,这里都是"abc",所以全是true
System.out.println(str1==str2); //true ,str1和str2对应字符串常量池中同一个常量,
所以地址相同 (1)
System.out.println(str1==str3); //false,新new的对象,和常量池不一样 (2)
System.out.println(str1==str5); //true,intern会尝试把该字符串添加到常量池,如果常量池存在,则直接返回地址,显然存在 (3)
System.out.println(str1==str6); //true,拼接后在常量池中和str1是一个常量 (4)
System.out.println(str1==str7); //false,a+b变量拼接会调用StringBuilder拼接,StringBuilder的toString方法会重新new一个字符串 (5)
System.out.println(str1==str8); //true,和(4)一样
System.out.println("===================");
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
System.out.println(str1.equals(str5)); //true
System.out.println(str1.equals(str6)); //true
System.out.println(str1.equals(str7)); //true
System.out.println(str1.equals(str8)); //true
System.out.println("===================");
System.out.println(str3==str4); //false //str3和str4和str7都是new出来的,str5和str6和str8都是对应常量池中同一个地址,所以都是false (6)
System.out.println(str3==str5); //false
System.out.println(str3==str6); //false
System.out.println(str3==str7); //false
System.out.println(str3==str8); //false
System.out.println("===================");
System.out.println(str3.equals(str4)); //true
System.out.println(str3.equals(str5)); //true
System.out.println(str3.equals(str6)); //true
System.out.println(str3.equals(str7)); //true
System.out.println(str3.equals(str8)); //true
System.out.println("===================");
System.out.println(str5==str6); //true
System.out.println(str5==str7); //false //同理(6)
System.out.println(str5==str8); //true
System.out.println("===================");
System.out.println(str5.equals(str6)); //true
System.out.println(str5.equals(str7)); //true
System.out.println(str5.equals(str8)); //true
}
}
创建几个对象问题
String str1 = "abc"会创建几个对象
如果常量池里面没有abc,则去创建一个abc对象,总共1个
String str3 =new String(“abc”)会创建几个对象
首先会去堆区创建一个对象,如果常量池里面没有abc,则再去常量池里面创建一个abc对象,总共2个
String str6 = “a”+"b"会创建几个对象
首先会去堆区创建一个StringBuilder对象,拼接后会调用toString方法重新new一个字符串 ,这个字符串不会把值添加到常量池里面,所以总共是两个对象。
String str6 =new String(“abc”)+new String(“efd”)会创建几个对象
首先会去堆区创建一个StringBuilder对象,而new String(“XXX”)会创建2个对象,最后toString方法重新创建一个对象,所以总共创建6个对象。