前言
首先看下下面代碼結果是什么?
package cn.demo_01;
public class StringDemo02 {
public static void main(String[] args) {
String a = "abc";
String b = "ab";
String c = "c";
System.out.println(a == b + c);
}
}
在看這個代碼結果是什么?
package cn.demo_01;
public class StringDemo02 {
public static void main(String[] args) {
String a = "abc";
System.out.println(a == "ab"+"c");
}
}
第一個例子其結果為false 第二個例子其結果為true 為什么會這樣? 下面看下內存分布圖:

最后得出的結論:
1、+運算符如果一邊是變量的話就會 先查找常量池中有沒有拼接完的 如果有常量池就不會在新建 否則會新建一個常量 最后會在堆中創建一個新的String對象
2、如果二端都是常量 先查找常量池中有沒有拼接完的 如果有常量池就不會在新建 否則會新建一個常量 但不會在堆中創建新的對象
(注:== 間的比較 比較的是內存地址)
