[英]complexity of instanceof operator java
我想知道在java中使用instanceof運算符的計算成本是多么昂貴,並想知道是否有更好的替代方案可用
另一種方法是避免使用instanceof
並正確設計你的類(在OO意義上)。
由於instanceof
運算符具有相應的“ instanceof ”字節代碼指令,因此可能不會有更高效的方法; 但這也可能取決於實際JVM的優化方式。
instanceof
非常快。 然而,它通常是一個經過深思熟慮的設計的症狀。
它與(成功)演員表演的表現大致相同,因為它做了很多相同的事情。 實際上,該任務大致相當於“虛擬”方法調用。
在理智的實現上:對於類,只需要獲取運行時類並查看固定的偏移量來檢查超類(只要你沒有超過8個類的HotSpot繼承鏈)。 接口有點棘手,但通常最后兩個用例適用於緩存的任何特定運行時類。 所以這也很快。
如果你想檢查對象是否是某個類的實例(但是如果它extends
或implements
它,則不是),也許將這些類與==
進行比較會更快:
o.getClass() == YourClass.class
否則,因為為特定目的創建了instanceof
關鍵字,我不知道你怎么能做得更好..
我假設您實際上已經對您的代碼進行了分析,並發現您對instanceof
的使用是一個非常重要的性能影響? 如果沒有,你幾乎肯定會解決一個不值得你花時間去解決的問題。
如果你所做的只是這樣的代碼:
if ( something instanceof MyClass ) {
MyClass mySomething = (MyClass) something;
//...
} else {
//exceptional case
}
然后可能首先嘗試ClassCastException
轉換,並允許ClassCastException
成為您的“例外情況”:
try {
MyClass mySomething = (MyClass) something;
} catch (ClassCastException cce) {
//exceptional case
}
現在,雖然可能是過早優化 ,但重新考慮您的設計還為時過早。 過度使用instanceof
是一種設計氣味。 通常,您應該使用泛型和多態,以減少使用instanceof
(實際上是cast)到(幾乎)為零的次數。
如果應根據對象的類型運行不同的代碼,請考慮使該代碼成為對象的實例方法,並使不同的類型符合接口。
如果你發現自己“知道”一個對象屬於某種類型,但是你已經做了一些讓編譯器忘記了這一事實的步驟(例如你將它放入原始List
),那么它可能是一個泛化的候選者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.