java中String s = new String("abc")創建了幾個對象


答案是兩個,現在我們具體的說一下:
String s = new String("abc");
首先我們要明白兩個概念,引用變量和對象,對象一般通過new在堆中創建,s只是一個引用變量。
所有的字符串都是String對象,由於字符串文字的大量使用,java中為了節省時間,在編譯階段,會把字符串文字放在文字池中,文字池的一個好處就是可以把相同的字符串合並,占用一個空間,我們可以用==判斷一下兩個引用變量是否指向了一個地址即一個對象

public   class  Demo02  {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s1 ="abc";
        String s2 
= "abc" ;
        
if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
        
else System.out.println("trouble");
    }

}

輸出結果為:
可以看出指向了一個對象,即文字池中保存了一個對象。
二、String s = new String("abc")實際上是"abc"本身就是文字池中的一個對象,在運行 new String()時,把文字池即pool中的字符串"abc"復制到堆中,並把這個對象的應用交給s,所以創建了兩個String對象,一個在pool 中,一個在堆中。下面看這個程序,創建了幾個對象。

public   class  Demo03  {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 
= new String("abc") ;
        
if( s1 == s2 )//不會執行的語句}
       System.out.println("在堆中創建了一個對象");

    }

        
else{
        System.out.println(
"在堆中創建了兩個對象");    
        }

        }

}

輸出結果為:
可知在堆中創建了兩個對象,但是在文字池中有一個對象,所以共創建了三個對象。
三、再看下一個例子:

public   class  Demo04  {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s = new String("abc");
        s 
= "cba";
        System.out.println(s); 
    }


}

輸出結果為:
String s = new String("abc")並不是給s賦值,而是把字符串"abc"的引用交給s持有,現在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆蓋,所以輸出結果為cba


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM