//看下面这段代码,最后一个输出不是太理解:
public static void test() {
String x = "hello"; //如果将x与y用final修饰则最后一个输出时true
String y = "world";
String z = new String("helloworld");
String a = "helloworld";
System.out.println("x+y equals z:" + (x + y).equals(z)); //true,equals比较的是内容
System.out.println("a == z:" + (a == z)); //false,==比较的是实例的引用
System.out.println("a == helloworld:" + (a == ("hello" + "world")));//true
System.out.println("a == x+y:" + (a == (x + y))); //false 比较上一个,应该为真啊,什么原因
}
------解决方案--------------------
"hello" + "world" 运算在常量池中,不产生新对象,运算结果就是a 指向的helloworld
x + y 运算时,产生新对象,运算结果不再是a 指向的helloworld
------解决方案--------------------
最后一个是这样比较的,右边是变量在进行字符串拼接,使用变量的时候,会现在内存中开辟一个空间来存放拼接后的字符串,而这个内存空间自然不会是和a相同了,所以地址为空,而如果使用字符串字面常量来进行拼接,会先拼接然后到常量池里面去找,有没有相同的字符串常量,如果有就不开辟空间了,就使用现有的字符串常量,很明显,字符串常量是存在的,所以不开辟空间了,所以使用原来的字符串常量,即a指向的字符串常量,所以两者地址相同了
