String和new String的那點事
阿新 • • 發佈:2019-01-07
String a= "test";
此語句含義是:在常量池中建立test字串物件,變數aa是對常量池中此物件的引用
String aa = new String("test");
此語句含義是:如果常量池中沒有test字串物件,會在常量池中建立,並且還會在堆中建立一個test物件,變數aa是對堆中此物件的引用
String aaa= aa.intern() ;
此語句的含義是:如果常量池中有test字串物件(判斷條件是equal方法返回true),就直接返回常量池中該物件引用給aaa;如果沒有,就會在常量池中建立test,再返回常量池中該物件的引用給aaa。
用以下程式碼執行結果驗證一下:
package org.springmorning.demo.javabase.string; /** * @author 春晨 * @date 2019/1/7 9:05 */ public class StringAndNewStringDiff { public static void main(String[] args) { String a = "test"; //在常量池中建立test字串物件,變數aa是對常量池中此物件的引用 String aa = new String("test"); //由於前面語句已經在常量也中建立了test字串物件,那麼只會在堆中建立一個test物件,變數aa是對堆中此物件的引用 String aaa = new String("test");//在堆中再建立一個test字串物件,變數aaa是對堆中此物件的引用 System.out.println("判斷它們是否為同一物件(記憶體地址是否一致):"); System.out.println("a和aa:" + (a == aa)); //false System.out.println("a和aaa:" + (a == aaa)); //false System.out.println("aa和aaa:" + (aa == aaa)); //false System.out.println("判斷它們常量池中的物件是否為同一物件(記憶體地址是否一致):"); System.out.println("a和aa:" + (a.intern() == aa.intern())); //true System.out.println("a和aaa:" + (a.intern() == aaa.intern())); //true System.out.println("aa和aaa:" + (aa.intern() == aaa.intern())); //true System.out.println("判斷它們引用的值字串是否相等:"); System.out.println("a和aa:" + a.equals(aa)); //true System.out.println("a和aaa:" + a.equals(aaa)); //true System.out.println("aa和aaa:" + aa.equals(aaa)); //true } }
總結:
new 關鍵字,不管常量池中有沒有相同的物件,都會在堆中建立一個新物件。