最新Java程序員面試試題

最新Java程序員面試試題

前言

  今天在這裏就Java 程序員面試試題中的反射性能與HashMap, HashTable, CurrentHashMap的區別的做一個比較詳細的講解。

正文

  1、java如何提高反射性能?

  反射的運行速度慢,究竟反射機制慢在哪裏?
  Class.forName方法的調用會執行Class類文件在整個類路徑下的搜索,頻繁調用比較影響性能。
  Class對象上的getDeclaredMethod (String, Class<?>...)或getMethod(String, Class<?>…)方法的調用會執行Method對象在Class對象上的搜索。有些同事還使用getMethods()方法獲取Method數組,然後執行搜索任務,實際上getMethods()還會執行方法對象的集體Copy比直接使用(String, Class<?>...)或getMethod(String, Class<?>…)方法還要消耗時間及空間。
  知道上述的耗時原因就可以有針對性的優化了。

  2、HashMap, HashTable, CurrentHashMap的區別

  HashTable
  底層數組+鏈表實現,無論key還是value都不能爲null,線程安全,實現線程安全的方式是在修改數據時鎖住整個HashTable,效率低,ConcurrentHashMap做了相關優化
  初始size爲11,擴容:newsize = olesize2+1
  計算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
  HashMap
  底層數組+鏈表實現,可以存儲null鍵和null值,線程不安全
  初始size爲16,擴容:newsize = oldsize2,size一定爲2的n次冪
  擴容針對整個Map,每次擴容時,原來數組中的元素依次重新計算存放位置,並重新插入
  插入元素後才判斷該不該擴容,有可能無效擴容(插入後如果擴容,如果沒有再次插入,就會產生無效擴容)
  當Map中元素總數超過Entry數組的75%,觸發擴容操作,爲了減少鏈表長度,元素分配更均勻
  計算index方法:index = hash & (tab.length – 1)
  ConcurrentHashMap
  底層採用分段的數組+鏈表實現,線程安全
  通過把整個Map分爲N個Segment,可以提供相同的線程安全,但是效率提升N倍,默認提升16倍。(讀操作不加鎖,由於HashEntry的value變量是 volatile的,也能保證讀取到最新的值。)
  Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨佔,ConcurrentHashMap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術
  有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖
  擴容:段內擴容(段內元素超過該段對應Entry數組長度的75%觸發擴容,不會對整個Map進行擴容),插入前檢測需不需要擴容,有效避免無效擴容
  Hashtable和HashMap都實現了Map接口,但是Hashtable的實現是基於Dictionary抽象類的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。

結尾

  通過本文的講解小夥伴們對於這兩個知識點是不是更熟悉了呢?努力吧騷年!

文章來自:https://www.itjmd.com/news/show-6397.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章