1. 程式人生 > >String和new String的那點事

String和new String的那點事

 

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 關鍵字,不管常量池中有沒有相同的物件,都會在堆中建立一個新物件。