前言
首先看下下面代碼結果是什么?
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、如果二端都是常量 先查找常量池中有沒有拼接完的 如果有常量池就不會在新建 否則會新建一個常量 但不會在堆中創建新的對象
(注:== 間的比較 比較的是內存地址)