jdk1.7 String switch的实现
對于int的switch,jvm是用tableswitch和lookupswitch來實現的,jdk1.7 switch增加了對string的支持,那么底層是如何實現的呢?是否增加了新的指令或是否給某些指令增加了新的含義?
?
?
看這樣一個程序:
?
Java代碼???
javap -c Test得出的結果為:
?
?
Java代碼???
?
在這一堆指令中我們發現,jdk1.7并沒有新指令來處理string switch,還是繼續用lookupswitch和tableswitch兩個指令來處理的,也沒有擴展這兩個指令,它們還是只能處理int。
?
?
在11行,我們看到調用了需要switch的string的hashCode方法,并對該hashCode進行switch,并跳轉到相應的處理指令。跳到新的指令處我們發現這里(63行)將待switch的變量(name)與case中的值("b")equals了一下。這樣做是為了避免不同的string有相同的hashCode,確定equals返回true后,編譯器生成了一個處理value的switch,源碼里有多少個case編譯器生成的tableswitch就有多少個分支,最終會找到相應的處理分支完成string switch的處理。
?
?
接下來,看一個不同string hashCode相等的版本:
?
buzzards與righto的hashCode相等
hierarch與crinolines的hashCode相等
?
這里選擇buzzards和righto
?
?
Java代碼???
?
字節碼:
?
Java代碼???
?
?
這里我們看到兩個字符串都跳到32行,首先跟"righto"比較,如果不相等則跳到47行比較buzzards。
轉載于:https://www.cnblogs.com/zhangyfr/p/8493950.html
總結
以上是生活随笔為你收集整理的jdk1.7 String switch的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络标准和网络协议
- 下一篇: 笔记《Hbase 权威指南》