一、几个例子
1、Demo1
(1)实例代码:
public class Main {
public static void main(String[] args) {
String a = "123";
String b = "123";
System.out.println(a == b);
}
}
(2)运行结果:
(3)详解:
a、b都是在常量池
中取值,二者都指向常量池中同一对象"123",其地址值相同,所以结果为true。
2、Demo2
(1)实例代码:
public class Main {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);
System.out.println(s3.equals((s1 + s2)));
System.out.println(s3 == "hello" + "world");
System.out.println(s3.equals("hello" + "world"));
}
}
(2)运行结果:
(3)详解:
- String类重写了equals()方法,它比较的是
引用类型的值
是否相等,所以输出true。 - s1与s2相加是先在字符串常量池中开一个空间,然后拼接,这个空间的地址就是s1与s2拼接后的地址。与s3的地址不同,所以输出为false。
- s3与”hello”+”world”作比较,”hello”+”world”先拼接成”helloworld”,然后再去字符串常量池中找是否有”helloworld”。有,所以和s3共用一个字符串对象,则为true。
二、总结
- String s = new String(“hello”)会创建2(1)个对象,String s = “hello”创建1(0)个对象。
注:当字符串常量池中有对象hello时括号内成立! - 字符串如果是
变量
相加,先开空间,再拼接字符串。 - 如果是
常量
相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
三、参考
https://blog.csdn.net/ZhouHuoCleverset/article/details/61935578