用红黑树实现,非线程安全
。
继承关系:
extends
AbstractMap<
K
,
V
>
implements NavigableMap, Cloneable, java.io.Serializable
属性:
//比较器
private final
Comparator
super
K
>
comparator
;
//根节点
private transient
Entry<
K
,
V
>
root
=
null;
//元素个数
private transient int
size
=
0
;
//修改次数
private transient int
modCount
=
0
;
获取第一个key
final
Entry<
K
,
V
>
getCeilingEntry
(
K
key) {
Entry<
K
,
V
> p =
root
;
while
(p !=
null
) {
int
cmp = compare(key
,
p.
key
)
;
if
(cmp <
0
) {
if
(p.
left
!=
null
)
p = p.
left
;
else
return
p
;
}
else if
(cmp >
0
) {
if
(p.
right
!=
null
) {
p = p.
right
;
}
else
{
Entry<
K
,
V
> parent = p.
parent
;
Entry<
K
,
V
> ch = p
;
while
(parent !=
null
&& ch == parent.
right
) {
ch = parent
;
parent = parent.
parent
;
}
return
parent
;
}
}
else
return
p
;
}
return null;
}
深度优先的先根遍历
获取第一个大于等于key的元素
final
Entry<
K
,
V
>
getHigherEntry
(
K
key) {
Entry<
K
,
V
> p =
root
;
while
(p !=
null
) {
int
cmp = compare(key
,
p.
key
)
;
if
(cmp <
0
) {
if
(p.
left
!=
null
)
p = p.
left
;
else
return
p
;
}
else
{
if
(p.
right
!=
null
) {
p = p.
right
;
}
else
{
Entry<
K
,
V
> parent = p.
parent
;
Entry<
K
,
V
> ch = p
;
while
(parent !=
null
&& ch == parent.
right
) {
ch = parent
;
parent = parent.
parent
;
}
return
parent
;
}
}
}
return null;
}
put操作:
public
V
put(
K key
,
V value) {
Entry<
K
,
V> t =
root
;
if (t ==
null) {
compare(key
, key)
;
// type (and possibly null) check
root =
new Entry<>(key
, value
, null)
;
size =
1
;
modCount++
;
return null;
}
int cmp
;
Entry<
K
,
V> parent
;
// split comparator and comparable paths
Comparator
super
K> cpr =
comparator
;
if (cpr !=
null) {
do {
parent = t
;
cmp = cpr.compare(key
, t.
key)
;
if (cmp <
0)
t = t.
left
;
else if (cmp >
0)
t = t.
right
;
else
return t.setValue(value)
;
}
while (t !=
null)
;
}
else {
if (key ==
null)
throw new NullPointerException()
;
Comparable
super
K> k = (Comparable
super
K>) key
;
do {
parent = t
;
cmp = k.compareTo(t.
key)
;
if (cmp <
0)
t = t.
left
;
else if (cmp >
0)
t = t.
right
;
else
return t.setValue(value)
;
}
while (t !=
null)
;
}
Entry<
K
,
V> e =
new Entry<>(key
, value
, parent)
;
if (cmp <
0)
parent.
left = e
;
else
parent.
right = e
;
fixAfterInsertion(e)
;
size++
;
modCount++
;
return null;
}
如果没有这个key就变成了添加元素,添加元素后,要调整红黑树结构。
private void
fixAfterInsertion(Entry<
K
,
V> x) {
x.
color =
RED
;
while (x !=
null && x !=
root && x.
parent.
color ==
RED) {
if (
parentOf(x) ==
leftOf(
parentOf(
parentOf(x)))) {
Entry<
K
,
V> y =
rightOf(
parentOf(
parentOf(x)))
;
if (
colorOf(y) ==
RED) {
setColor(
parentOf(x)
,
BLACK)
;
setColor(y
,
BLACK)
;
setColor(
parentOf(
parentOf(x))
,
RED)
;
x =
parentOf(
parentOf(x))
;
}
else {
if (x ==
rightOf(
parentOf(x))) {
x =
parentOf(x)
;
rotateLeft(x)
;
}
setColor(
parentOf(x)
,
BLACK)
;
setColor(
parentOf(
parentOf(x))
,
RED)
;
rotateRight(
parentOf(
parentOf(x)))
;
}
}
else {
Entry<
K
,
V> y =
leftOf(
parentOf(
parentOf(x)))
;
if (
colorOf(y) ==
RED) {
setColor(
parentOf(x)
,
BLACK)
;
setColor(y
,
BLACK)
;
setColor(
parentOf(
parentOf(x))
,
RED)
;
x =
parentOf(
parentOf(x))
;
}
else {
if (x ==
leftOf(
parentOf(x))) {
x =
parentOf(x)
;
rotateRight(x)
;
}
setColor(
parentOf(x)
,
BLACK)
;
setColor(
parentOf(
parentOf(x))
,
RED)
;
rotateLeft(
parentOf(
parentOf(x)))
;
}
}
}
root.
color =
BLACK
;
}