Java实现map的put方法
时间: 2024-03-16 08:47:17 浏览: 74
Java中的Map接口有多种实现,比如HashMap、TreeMap、LinkedHashMap等,它们的put方法实现略有不同,下面分别介绍HashMap和TreeMap的put方法实现。
1. HashMap的put方法实现
HashMap采用哈希表的方式实现,其put方法的实现主要包括以下几个步骤:
1. 判断数组是否需要扩容,如果需要,则进行扩容操作。
2. 计算key的哈希值,然后将其转换成数组下标。
3. 如果该下标位置上已经存在元素,则进行链表或红黑树的插入操作。
4. 如果该下标位置上不存在元素,则直接插入元素。
示例代码:
```java
public V put(K key, V value) {
// 判断是否需要扩容
resize();
// 计算key的哈希值,然后将其转换成数组下标
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
// 如果该下标位置上已经存在元素,则进行链表或红黑树的插入操作
for (Entry<K, V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
return oldValue;
}
}
// 如果该下标位置上不存在元素,则直接插入元素
modCount++;
addEntry(hash, key, value, i);
return null;
}
```
2. TreeMap的put方法实现
TreeMap采用红黑树的方式实现,其put方法的实现主要包括以下几个步骤:
1. 如果根节点为空,则直接插入元素作为根节点。
2. 如果根节点不为空,则从根节点开始查找插入位置。
3. 如果待插入元素的键比当前节点的键小,则继续在左子树中查找插入位置。
4. 如果待插入元素的键比当前节点的键大,则继续在右子树中查找插入位置。
5. 如果待插入元素的键和当前节点的键相等,则更新当前节点的值。
示例代码:
```java
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;
// 根据红黑树的性质找到插入位置
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;
}
```
需要注意的是,在实现put方法时,需要考虑并发访问的情况。如果多个线程同时对同一个Map进行put操作,可能会导致数据不一致的问题。因此,可以采用同步或者使用线程安全的Map实现来解决这个问题。
阅读全文