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