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