Сложность времени containsKey
изменилась в JDK-1.8 , как и другие упоминали, что в идеальных случаях это O(1)
. Однако в случае столкновений, когда keys
равны Comparable
, ячейки, в которых хранятся сталкивающиеся элементы, больше не являются линейными после того, как они превышают некоторый порог, называемый TREEIFY_THRESHOLD
, который равен 8,
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
Другими словами, TreeNodes
будет использоваться (аналогично тем, что в TreeMap
) для хранения бинов (то есть: красно-черная древовидная структура), и это оставляет нам сложность O(lgn)
в случае столкновения.
То же самое относится к get(key)
, где оба метода вызывают getNode
внутренне
Примечание: n здесь размер bin
, а не HashMap