关于HashMap中put和putForCreate方法的区别
慕容天河 2017-03-01 10:27:28 put方法源码:
1 public V put(K key, V value) {
2 if (key == null)
3 return putForNullKey(value);
4 int hash = hash(key.hashCode());
5 int i = indexFor(hash, table.length);
6 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
7 Object k;
8 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
9 V oldValue = e.value;
10 e.value = value;
11 e.recordAccess(this);
12 return oldValue;
13 }
14 }
15
16 modCount++;
17 addEntry(hash, key, value, i);
18 return null;
19 }
putForCreate方法源码:
1 private void putForCreate(K key, V value) {
2 int hash = (key == null) ? 0 : hash(key.hashCode());
3 int i = indexFor(hash, table.length);
4 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
5 Object k;
6 if (e.hash == hash &&
7 ((k = e.key) == key || (key != null && key.equals(k)))) {
8 e.value = value;
9 return;
10 }
11 }
12 createEntry(hash, key, value, i);
13 }
感觉这两个方法实现的功能是一样的啊,都是插入对象。为什么要写两个不同的方法啊 。 还有下边这个putAllForCreate方法,为什么调用的是putForCreate方法而不是put方法
1 private void putAllForCreate(Map<? extends K, ? extends V> m) {
2 for (Iterator<? extends Map.Entry<? extends K, ? extends V>> i = m.entrySet().iterator(); i.hasNext(); ) {
3 Map.Entry<? extends K, ? extends V> e = i.next();
4 putForCreate(e.getKey(), e.getValue());
5 }
6 }