java 中 String 类连接问题

    String str1 = "aa" ; 
    String str2 = "bb" ; 
    String str3 = "aa" + "bb" ;
    String str4 = str1 + str2 ;
    boolean b =(str3 == str4);
    System.out.println(b);

    这里b为什么是false , 有那个大侠能否帮忙回答下?

编译的时候,aa,bb,会存在常量池里面,同时常量的运算结果也会放在常量池里面,如aa+bb就会在常量池里面存一个aabb,而str1+str2的运算不会变成常量池里引用。如图所示,也可以自己使用javap -verbose 命令查看
图片说明

(str3 == str4)比的是放置该字符串的地址,所以不一样。
要用equals

字符串使用equals,因为==比较的是内存地址,

比较两个对象值是否相等要用equals(),==比较的是对象的内存地址

str1和str2都是指向常量池中的对象,换句话说就是“aa”,"bb"在栈内存中存在的,str3是是两个常量之和,它会在栈中创建一个对象"aabb",然后将str3的引用指向它,这也就是说str3引用的对象也是在栈内存中存在的!而str1 + str2虽然内容也是“aabb”,但是它将在堆里面生成一个"aabb"对象,并返回这个对象,所以str3是在栈内存中,str4是在堆内存中

Java中String类型不能使用双等号比较是否相等,要使用String.Equals

(str3 == str4)比的是放置该字符串的地址,返回false。
要用equals

lplj717 正解。

关于java中 == 和 equals 的区别:http://blog.csdn.net/zhaizu/article/details/38556241

String str1 = "aa" ;
String str2 = "bb" ;
String str3 = "aa" + "bb" ; //在内存中分配一个地址
String str4 = str1 + str2 ; //在内存中又分配一个地址
boolean b =(str3 == str4); // ==是判断两个变量的在内存中的地址是否一样,很显然不一样,返回false,如果想判断两个变量在内存中地址指向的值是否相等,可以使用equals
System.out.println(b);

你好好把他们的堆栈图关系画画你就会发现3和4在内存中存储的地址不同,而==比较的是地址所以是false

说白了就是地址不一样,==比较的是地址,一个在栈内存中,一个在堆内存中。字符串比较不要用==