1. 程式人生 > >java中的字串變數的比較

java中的字串變數的比較

        String s1="hello";
        String s2="hello";
        String s3=new String("hello");
        String s4=new String("hello");
        if(s1==s2)
        System.out.println(s1==s2);//輸出了true。。。
        System.out.println(s1==s3);//輸出了false

        System.out.println(s3==s4);//輸出了false

        System.out.println(s1=="hello");//輸出了true
        System.out.println(s3=="hello");//輸出了flase
        System.out.println("hello"=="hello");//輸出了true

        Scanner in=new Scanner(System.in);
        String s5;
        s5=in.next();//輸入hello
        System.out.println(s1==s5);//false
        System.out.println(s3==s5);//false

在學習String型別的時候,我們知道String型別有兩種建立方式,一個是,String s=“string”,一個是String s=new String(“string”)

這兩個看起來是一樣的,實際上卻存在本質的區別;

我們知道在java中的記憶體有棧記憶體和堆記憶體。棧記憶體中存放變數名這些東西,存放的是對物件的引用,而堆記憶體中存放的是實際的物件。同時除了這兩個以外,java中還有一個叫做常量池的東西。一些常量,將會放在這裡面。

在java中,為了程式執行的效率。要是使用String=“string”這個建立String物件的方式,這個物件將會建立在常量池裡面,對於String型別來說叫做串池。而這個物件的引用則是在棧記憶體中,要是我們再用雙引號建立一個String型別,將會先在串池裡面尋找是不是有這個物件,如果有,這個引用就指向這個物件,要是沒有,就再在串池裡面新建一個字串物件。

而如果使用new建立物件,或者通過輸入來建立物件,建立的物件都會在堆記憶體中,也就是說,他的引用指向的是堆裡面的一個記憶體快。

而“ ==” 對於引用型別來說,判斷的是指標是否相同,對於兩個直接用雙引號建立的字串,他在串池中,他的兩個引用都指向他,所以兩個字串變數是相等的(字串變數就是一個指標,他們的值相等),而我們用的字面值,也是存放在串池中的,他的地址很明顯就是字串變數(指標)所指向的地址,所以是相等的,也就是true

而new出來的物件,他的地址是不共享的,也就是兩個物件的儲存地址不同,自然就是不同的指標。

我們要知道的是,String s;//s是一個指標變數,他的值是一個記憶體地址,而這樣的方式我們稱為指標,要從記憶體的角度去理解

參考資料:

java堆,棧和常量池

http://www.iteye.com/topic/634530

java String兩種賦值方式的比較

http://blog.163.com/[email protected]/blog/static/1271436362012101214031911/

java裡用“==”比較兩個字串的問題

http://zhidao.baidu.com/link?url=JU17Pwt70JUdvQjns4EBZ1PswGAogtpWgjKnxb--qY3y73svViQn4zGBG3JDEl88k99rP-agYjRUGKr--50HIa