2013-11-25 60 views
2

它非常清楚,switch語句可以在Java中的字符串值,這樣的事情:爲什麼在交換機(Java)中發生這種情況?

String s="diljit" 
switch(s){ 
.. 
....} 

永遠編譯.. 小號的類型是字符串的對象....但另一方面開關聲明不能採取對象其他類?爲什麼會出現這種情況,我將如何驗證這個問題,用合適的答案..

可以切換聲明採取對象或不

回答

8

可以switch語句取對象嗎?

不,您不能在switch語句中使用任何任意對象。這是在語言本身中指定的。即使String也只允許從Java 7開始。從JLS §14.11

類型中表達的必須是charbyteshortintCharacterByteShortIntegerStringenum類型(§8.9),或發生編譯時間錯誤。

+0

要添加到Rohit所說的內容中,如果要根據對象的值進行切換,可以使用枚舉來實現該功能。將要切換到的對象的所有變量放入枚舉中,然後根據枚舉進行切換。 – TheLostMind

0

String在java中很特別。 String被設計爲介於primitiveClass之間。

使每個primitive可用,java允許(從7)String也在開關(內部使用**equals**方法)。因此String允許切換。但不能與字符串的每Object.

1

switch語句被編譯的hashCode比較,所以代碼:

switch(s){ 
    case "1": 
    case "2": 
    case "3": 
} 

編譯照顧,如:

switch(s.hashCode()){ 
    case "1".hashCode(): 
    case "2".hashCode(): 
    case "3".hashCode(): 
} 

其實7 JVM沒有添加任何具體的關於在開關中使用字符串。只是一個小編輯技巧。它可能通過hashCode()來比較字符串,因爲這個函數被覆蓋並且基於對象的內容。這些信息在編譯時出現。 對於任意對象來說,它對於Strings這種方法的合法性是絕對不可接受的,因爲hashCode()返回一個隨機數。

這就是它的外觀在字節碼:

11: tableswitch { // 49 to 51 
      49: 36  // "1".hashCode() 
      50: 50  // "2".hashCode() 
      51: 64  // "3".hashCode() 
     default: 75 
    } 
36: aload_2  
37: ldc   #4     // String 1 
39: invokevirtual #5     // Method java/lang/String.equals:(Ljava/lang/Object;)Z 
42: ifeq   75 
45: iconst_0  
46: istore_3  
47: goto   75 
50: aload_2  
51: ldc   #6     // String 2 
53: invokevirtual #5     // Method java/lang/String.equals:(Ljava/lang/Object;)Z 
56: ifeq   75 
59: iconst_1  
60: istore_3  
61: goto   75 
64: aload_2  
65: ldc   #7     // String 3 
67: invokevirtual #5     // Method java/lang/String.equals:(Ljava/lang/Object;)Z 
70: ifeq   75 
73: iconst_2  
74: istore_3  
75: iload_3  
76: tableswitch { // 0 to 2 
     0: 104 
     1: 104 
     2: 104 
    default: 104 
} 
104: return 

開關用繩子編譯時整數切換。如果偶然發現兩個哈希碼相等,則將字符串與equals()方法進行比較。來自JVM規範的Compiling switches

相關問題