lucene中很多的數據結構都採用了個性化的實現,而且沒有利用一些通用的開源的其它框架,主要的目的還是爲了靈活可控、保證高效率、節約內存,BytesRefHash就是其中一個基本的、重要的、核心的數據結構。
根據lucene中給出的註釋,BytesRefHash是一個類似於HashMap的數據結構,但我個人認爲它更像一個ArrayList與HashSet的混合物。因爲它並不能像傳統的HashMap一樣存儲任意的key和value,只能基於元素的索引號與元素值進行一些簡單的讀取、判斷元素是否存在等功能。基於元素的索引號讀取元素類似於ArrayList,判斷元素是否存在(內部實現通過哈希算法實現)類似於HashSet。
在其內部有一個核心的類就是ByteBlockPool,基於該類可以保證數據在物理上的連續性,帶來的好處是提高數據的訪問效率,並節約內存空間。
關於提高數據的訪問效率比較好理解,因爲物理上連續的數據能更好的利用cpu cache。能節約內存空間主要是因爲java對象的內存佈局主要包含3個部分:對象頭、數據域和padding,而BytesRefHash主要是對BytesRef字節對象進行處理,通過對字節對象的合併連續存儲能夠減少對象頭和padding佔用的空間,從而節約內存。