2013-06-06 35 views
0

考慮下面的代碼:是否Java使用新的String(...)來創建動態字符串/命令行參數/文件IO

public static void main(String args[]) throws Exception{ 

     String a = "sharmaji"; 

     String b = args[0]; 

     System.out.println(a==b); 

} 

現在,如果我通過了一個命令行參數爲「sharmaji」那麼a == b返回false。這表明Java使用新的String(...)參數來創建String。

是否因爲java必須以字節讀取用戶輸入然後將其轉換爲字符串?

+1

'一個== b '在這裏永遠不會返回真,因爲它們明顯是不同的對象引用,因爲你只是將字符串賦值給'a'。這是如何演示的? –

+0

「這表明Java使用新的String(...)」< - 是的,你會怎麼做呢?儘管如果你使用字符串連接('+'),它實際上是一個在內部使用的'StringBuilder'。 – fge

回答

1

這是因爲命令行參數創建字符串runtime和編譯器創建不知道他們什麼(什麼值將被傳遞到程序)。

考慮JLS的Example 3.10.5-1. String Literals更好地理解Java的如何使用其內部的字符串「緩存」。

0

的參數,你傳遞是一個運行時的值,並在堆爲新對象創建的,但

String a = "sharmaji";是編譯時間常數,放在字符串文字池。

想想當你通過命令行傳遞的任何字符串喜歡的話,就出現這樣的 -

String args[]={"sharmaji","namaste"}; 

那麼它就會像 -

args[0]=new String("sharmaji"); 

args[1]=new String("namaste"); 

創建因此新的對象,因此其引用不能與您使用==運營商進行檢查時相同。

但見這種情況下

public class TestEx { 

    public static void main(String... args) { 

     String s="asd"; 
     String s1[]={"asd","asd1"}; 
     if(s1[0]==s) 
     { 
        System.out.println("true"); 
       } 
       else 
        System.out.println("false"); 

     } 
} 

由於這裏數組的值被在編譯時被初始化,所以對於「ASD」基準是相同爲s1[0] and s,印刷品TRUE

相關問題