2012-07-23 64 views
3

可能重複:
Java String.equals versus ==這段代碼爲什麼要輸入字符串並輸出一個int不起作用? Java的

我想這將是構建一個選擇器方法的一種巧妙的方法,但輸出不會前兩個if語句,只輸出最後

public int myPickerMethod(){ 

     System.out.println("please select from the options "); 
     System.out.println("please select 1 for option 1 "); 
     System.out.println("please select 2 please select 2 for option 2"); 
     String input = keyboard.readLine(); 
     System.out.println("input = " + input);  

     if(input=="1"){ 

       return 1; 
     } 
     else if(input=="2"){ 
      return 2; 
     } 
     else{ 
      return 42; 
     } 
    } 

這裏是從終端我的結果:

please select from the options 
    please select 1 for option 1 
    please select 2 please select 2 for option 2 
    1 
    input = 1 
    response = 42 

同樣如果我把2放進去,「response」打印語句就是來自主類中print語句的方法的輸出。

我還沒有嘗試過這種方式,但我認爲它應該工作。我真的不明白爲什麼它不是。任何人都可以清除它?謝謝

+0

http://stackoverflow.com/questions/767372/java-string-equals-versus – NominSim 2012-07-23 17:59:14

+4

爲什麼他趴下票? – johnny 2012-07-23 18:08:34

+1

我不會在該線程和我的線程之間建立連接。首先,你必須知道解決方案已經知道這兩個連接了。其次,這是一個字符串數組不是字符串。 – Magpie 2012-07-23 18:18:36

回答

5

出於測試對象(非原始型)平等,使用Object.equals()

if(input.equals("1")) { 

    return 1; 
} 

==操作者檢查的對象的引用是否相等。一種用於引用相等測試在String.equals() method內完成的,其他的檢查中。下面是Java源代碼爲String.equals()方法:

public boolean equals(Object anObject) { 
    if (this == anObject) {  // Reference equality 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { // Are the strings the same size? 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = offset; 
      int j = anotherString.offset; 
      while (n-- != 0) { 
       if (v1[i++] != v2[j++])  // Compare each character 
        return false; 
      } 
      return true; 
     } 
    } 
    return false; 
} 
+0

啊感謝澄清緣故。我開始懷疑這可能與該字符串不是主要性有關。 – Magpie 2012-07-23 18:03:11

3

不要比較字符串(或任何對象)的值==。使用equals方法如if(input.equals("1"))

==用於檢查是否引用包含相同的對象例如

Integer i1=new Integer(1); 
Integer i2=new Integer(1); 
Integer i3=i1; 
//checking references 
System.out.println(i1==i2);//false 
System.out.println(i1==i3);//true 

//checking values 
System.out.println(i1.equals(i2));//true 
System.out.println(i1.equals(i3));//true 
3

對象比較應.equals==String和是一個對象。

輸入==「1」應該是input.equals(「1」)

編輯繼始終即使您使用==,因爲它們是文字和Java分配相同的內存位置的作品。

String s ="Hi"; 
String s1= "Hi"; 

if(s==s1) 
{ 
    System.out.println("Yes they are same"); 
} 

但是,當我們讀兩個單獨字符串(new String()),除非您覆蓋equalshashcode,平等的條件可能不會滿意。閱讀上面的鏈接瞭解更多詳情。

+0

謝謝你的工作。那爲什麼呢?在嘗試使用字符串之前,我發現它工作正常。 – Magpie 2012-07-23 18:00:20

+0

當你在相同的參考(或)字符串常量比較可能的工作,但在這種情況下,它們是兩個獨立的新的字符串。右 – kosa 2012-07-23 18:01:22

5

使用.equals比較在Java Objects,並String是Java的對象。

如: if(input.equals("1"))

2.這是可選,但它也將是不錯的,如果你嘗試使用掃描儀類。

例如:

Scanner scan = new Scanner(System.in); 
String input = scan.nextLine(); 

3。它也將建議使用switch聲明,而不是if-else梯,如果交換機使用String使用,那麼必須,如果你使用的是JDK版本低於1.7jdk 1.7 or above意外的話,你可以轉換字符串轉換爲字符,然後在開關中使用它。

+0

雅這就是....我認爲,這將是在市場目前的版本比較明顯的jdk是1.7u5,和Java 8指日可待......那好吧過我將它...謝謝... – 2012-07-23 18:13:07

+0

+1將字符串轉換爲字符以供開關使用。 – 2012-07-23 18:15:51

+0

感謝.................. – 2012-07-23 18:16:27

9

在Java中,你需要使用equals方法比較字符串:

if (input.equals("1")) { 
    // do something... 
} 

由於Java 7,你可以在switch語句中也使用字符串:

switch (input) { 

    case "1": 
     // do something... 
     break; 

    case "2": 
     // do something... 
     break; 

} 

編輯:補充我的答案,這裏是使用交換機用繩子和一個類的實例該類的反彙編代碼(使用javap -c)及其工作原理(標籤8和11)。

Foo.java

public class Foo { 

    public static void main(String[] args) { 

     String str = "foo"; 

     switch (str) { 

      case "foo": 
       System.out.println("Foo!!!"); 
       break; 

      case "bar": 
       System.out.println("Bar!!!"); 
       break; 

      default: 
       System.out.println("Neither Foo nor Bar :("); 
       break; 

     } 

    } 

} 

拆讓Foo.class代碼:

Compiled from "Foo.java" 
public class Foo { 
    public Foo(); 
    Code: 
     0: aload_0  
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return   

    public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String foo 
     2: astore_1  
     3: aload_1  
     4: astore_2  
     5: iconst_m1  
     6: istore_3  
     7: aload_2  
     8: invokevirtual #3     // Method java/lang/String.hashCode:()I << hashCode here! (I wrote this!) 
     11: lookupswitch { // 2 

       97299: 50     // 97299: hashCode of "bar" (I wrote this!) 

       101574: 36     // 101574: hashCode of "foo" (I wrote this!) (yep, they where swaped. the lesser hashCode first) 
       default: 61 
      } 
     36: aload_2  
     37: ldc   #2     // String foo 
     39: invokevirtual #4     // Method java/lang/String.equals:(Ljava/lang/Object;)Z 
     42: ifeq   61 
     45: iconst_0  
     46: istore_3  
     47: goto   61 
     50: aload_2  
     51: ldc   #5     // String bar 
     53: invokevirtual #4     // Method java/lang/String.equals:(Ljava/lang/Object;)Z 
     56: ifeq   61 
     59: iconst_1  
     60: istore_3  
     61: iload_3  
     62: lookupswitch { // 2 

        0: 88 

        1: 99 
       default: 110 
      } 
     88: getstatic  #6     // Field java/lang/System.out:Ljava/io/PrintStream; 
     91: ldc   #7     // String Foo!!! 
     93: invokevirtual #8     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     96: goto   118 
     99: getstatic  #6     // Field java/lang/System.out:Ljava/io/PrintStream; 
    102: ldc   #9     // String Bar!!! 
    104: invokevirtual #8     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    107: goto   118 
    110: getstatic  #6     // Field java/lang/System.out:Ljava/io/PrintStream; 
    113: ldc   #10     // String Neither Foo nor Bar :(
    115: invokevirtual #8     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    118: return   
} 

一個有趣的事情是,另一臺交換機創建(標籤62)整數是哪個做「真正的工作」。

+0

對於Java 7說明+1。我不知道。引擎蓋下發生了什麼?散列的「等號」。我認爲哈希因爲,切換歷史上想要一個'int'。 – 2012-07-23 18:05:07

+1

是的,編譯器改變開關,調用開關和案例值中的hashCode方法:D – davidbuzatto 2012-07-23 18:06:55

+1

@MartijnCourteaux:我用一些反彙編代碼補充了我的答案。看一看! – davidbuzatto 2012-07-23 18:29:32

1

使用equals方法....

public int myPickerMethod(){ 

    System.out.println("please select from the options "); 
    System.out.println("please select 1 for option 1 "); 
    System.out.println("please select 2 please select 2 for option 2"); 
    String input = keyboard.readLine(); 
    System.out.println("input = " + input);  

    if(input.equals("1")){ 

      return 1; 
    } 
    else if(input.equals("2")){ 
     return 2; 
    } 
    else{ 
     return 42; 
    } 

}

+0

啊謝謝我現在明白了。 +1雖然爲完全回答。你知道爲什麼使用'=='不起作用嗎? – Magpie 2012-07-23 18:01:50

+0

「==」比較對象參考值,其中「equals()」用於比較對象內容.... – 2012-07-23 18:07:08

相關問題