1、当定义一个字符串用
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2) ;
返回结果是ture;
原因分析:当程序加载类的时候,会在常量存储区,为"abc"分配一块区域,然后引用s1和s2分别都指向该改地址,因此返回true。我们再写程序的时候最好将"abc"单独定义成一个常量。
2、
String s1 = "a"+“b”;
String s2 = "a"+"b";
System.out.println(s1==s2) ;
java对编译器进行了优化,编译时已经将 "a"+“b”执行成"ab"了,因此返回
true
3、
String s1 = "a";
String s2 = "b";
System.out.println(s1+s2 == “a”+"b") ;
返回false
编译器只会对两个常量直接相加做出优化,例如a”+"b"=“ab”,不会对s1+s2做出优化,因此s1+s2会在堆上产生一个新的字符string对象,"a"+"b"仍然是在静态存储区分配一块地址。