ConcurrentHashMap和HashMap
来源:互联网 发布:万国数据公司怎么样 编辑:程序博客网 时间:2024/05/08 16:07
ConcurrentHashMap的get方法调用时,传null会报空指针的
源代码如下
public V get(Object key) {
Segment<K,V> s; // manually integrate access methods to reduce overhead
HashEntry<K,V>[] tab;
int h = hash(key.hashCode());
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;
if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null &&
(tab = s.table) != null) {
for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile
(tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE);
e != null; e = e.next) {
K k;
if ((k = e.key) == key || (e.hash == h && key.equals(k)))
return e.value;
}
}
return null;
}
从这里可以看到,使用hashCode方法时,未判断key是否为空。所以传入空值时会报空指针。
int h = hash(key.hashCode());
再看下它的put方法,发现,如果key为null的时候会抛空指针,也即不支持放key为null的
public V put(K key, V value) {
Segment<K,V> s;
if (value == null)
throw new NullPointerException();
int hash = hash(key.hashCode());
int j = (hash >>> segmentShift) & segmentMask;
if ((s = (Segment<K,V>)UNSAFE.getObject // nonvolatile; recheck
(segments, (j << SSHIFT) + SBASE)) == null) // in ensureSegment
s = ensureSegment(j);
return s.put(key, hash, value, false);
}
看下HashMap的get源代码。
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
这里明显会先判断key是否是null如果是的话,直接返回null所对应的value
之前面试时,知道这个问题,但是实际项目中还真的把这个给忘记了。
这里记录下。
ConcurrentHashMap不允许存储key或者value为null的值
查看其源码就可以知道了
/**
* Maps the specified key to the specified value in this table.
* Neither the key nor the value can be null.
*
* <p> The value can be retrieved by calling the <tt>get</tt> method
* with a key that is equal to the original key.
*
* @param key key with which the specified value is to be associated
* @param value value to be associated with the specified key
* @return the previous value associated with <tt>key</tt>, or
* <tt>null</tt> if there was no mapping for <tt>key</tt>
* @throws NullPointerException if the specified key or value is null
*/
@SuppressWarnings("unchecked")
public V put(K key, V value) {
Segment<K,V> s;
if (value == null)
throw new NullPointerException();
int hash = hash(key.hashCode());
int j = (hash >>> segmentShift) & segmentMask;
if ((s = (Segment<K,V>)UNSAFE.getObject // nonvolatile; recheck
(segments, (j << SSHIFT) + SBASE)) == null) // in ensureSegment
s = ensureSegment(j);
return s.put(key, hash, value, false);
}
从注释中可以看到Maps the specified key to the specified value in this table.
* Neither the key nor the value can be null.
而且value为null的时候直接抛空指针。
key没有判断是否为空,直接使用hashCode方法,所以如果key值为空,也会抛出空指针
- HashMap和ConcurrentHashMap浅析
- HashMap和ConcurrentHashMap浅析
- HashMap和ConcurrentHashMap
- HashMap和ConcurrentHashMap分享
- hashmap 和 concurrentHashMap
- HashMap 和ConcurrentHashMap
- HashMap和ConcurrentHashMap比较
- concurrenthashmap和hashmap
- HashMap和ConcurrentHashMap分享
- HashMap和ConcurrentHashMap研究
- ConcurrentHashMap和HashMap
- HashMap HashTable和ConcurrentHashMap
- HashMap和ConcurrentHashMap
- HashMap和ConcurrentHashMap浅析
- HashMap和ConcurrentHashMap
- HashMap和ConcurrentHashMap流程图
- HashMap和ConcurrentHashMap比较
- HashMap和ConcurrentHashMap
- 【初探】进程通信与线程同步
- java单例设计模式
- 弹出广告简洁的jquery特效
- C++函数调用时的参数传递
- excel 电子表格java代码片
- ConcurrentHashMap和HashMap
- [leetcode] 354. Russian Doll Envelopes 解题报告
- 回望来时的路:构建之法东北师大站 2016春季学期
- 《数值分析》期末考试a
- 《数值分析》期末考试试卷(B卷)
- leetcode之Top K Frequent Elements
- leetcode 2. Add Two Numbers
- leetcode之 Intersection of Two Arrays
- Ubuntu 安装jetty