它非常清楚,switch語句可以在Java中的字符串值,這樣的事情:爲什麼在交換機(Java)中發生這種情況?
String s="diljit"
switch(s){
..
....}
永遠編譯.. 小號的類型是字符串的對象....但另一方面開關聲明不能採取對象其他類?爲什麼會出現這種情況,我將如何驗證這個問題,用合適的答案..
可以切換聲明採取對象或不?
它非常清楚,switch語句可以在Java中的字符串值,這樣的事情:爲什麼在交換機(Java)中發生這種情況?
String s="diljit"
switch(s){
..
....}
永遠編譯.. 小號的類型是字符串的對象....但另一方面開關聲明不能採取對象其他類?爲什麼會出現這種情況,我將如何驗證這個問題,用合適的答案..
可以切換聲明採取對象或不?
可以switch語句取對象嗎?
不,您不能在switch語句中使用任何任意對象。這是在語言本身中指定的。即使String
也只允許從Java 7開始。從JLS §14.11:
類型中表達的必須是
char
,byte
,short
,int
,Character
,Byte
,Short
,Integer
,String
或enum
類型(§8.9),或發生編譯時間錯誤。
String
在java中很特別。 String
被設計爲介於primitive
和Class
之間。
使每個primitive
可用,java允許(從7)String
也在開關(內部使用**equals**
方法)。因此String
允許切換。但不能與字符串的每Object.
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。
要添加到Rohit所說的內容中,如果要根據對象的值進行切換,可以使用枚舉來實現該功能。將要切換到的對象的所有變量放入枚舉中,然後根據枚舉進行切換。 – TheLostMind