前言:
等号“==”对于基本类型,比较的是值,对于引用类型,比较的是内存地址。
1.在对象池中创建,如果常量池中已经存在则返回常量池中已经有的。
private static void test1() {
String s1 = "jiaozi";
String s2 = "jiaozi";
System.out.println("1 " + (s1 == s2));
}
结果:true
2.一个在String pool中,一个在堆中。
private static void test2() {
String s1 = "jiaozi";
String s3 = new String("jiaozi");// 参数是池中(如果没有则创建一个)的,但是s3指向的是堆中的数据
System.out.println("2 " + (s1 == s3));
}
结果:false
3.编译以后,s4="jiaozi".
private static void test3() {
String s1 = "jiaozi";
String s4 = "jiao" + "zi";
System.out.println("3 " + (s1 == s4));
}
结果:true
4.intern方法返回Strng pool中的对象,另外对于字符串a.equals(b),那么a.intern() == b.intern(),反之亦然。
private static void test4() {
String s1 = "jiaozi";
String s6 = new String("jiaozi");
String s5 = s6.intern();// 返回的是池中的数据
System.out.println("4 " + (s1 == s5));
}
结果:true
5.只要有new存在就会在堆中生成一个对象
private static void test5() {
String s3 = new String("jiaozi");// 参数是池中的,但是s3指向的是堆中的数据
String s6 = new String("jiaozi");// 又是在堆中创建。
System.out.println("5 " + (s6 == s3));
}
结果:false
6.同第3个
private static void test6() {
String s7 = "jiaozi1";
String s8 = "jiaozi" + 1;
System.out.println("6 " + (s7 == s8));
}
结果:true
7.对于字符串的相加,内部使用StringBuilder类的append,和toString()来实现,toString()中调用了构造函数,会在堆中生成一个对象。
private static void test7() {
String ab1 = "ab";
String b = "b";
String ab2 = "a" + b;
System.out.println("7 " + (ab1 == ab2));
}
结果:false