我对HashMap有疑问,我们都知道HashMap允许一个null键和值对,我的问题是:
如果我这样写,
m.put(null,null);
m.put(null,a);
它会抛出一个错误或异常吗?还是会覆盖返回值?或者返回什么值?
我对HashMap有疑问,我们都知道HashMap允许一个null键和值对,我的问题是:
如果我这样写,
m.put(null,null);
m.put(null,a);
它会抛出一个错误或异常吗?还是会覆盖返回值?或者返回什么值?
如果哈希映射的键相同时,使用覆盖方式重新赋值。
map.put("1","1111");
map.put("1","2222");
输出
key:value
1:2222
在 HashMap 中,每个 键(key) 必须是唯一的。
当“添加重复的键时”,旧值(对于相同的键,因为键必须是唯一的)将被简单地替换;请参见 HashMap.put:
将指定的值与此映射中的指定键相关联。如果此映射先前包含键的映射,则旧值将被替换。
返回与键关联的先前的值,如果没有键的映射,则返回null。
关于 null 值:允许一个 null 键(key)(因为键必须是唯一的),但 HashMap 可以有任意数量的 null 值(values),而且一个 null 键不需要有一个 null 值。根据文档:
[.. HashMap] 允许 null values 和 [a] null key。
但是,文档没有说明 null/null 需要成为特定的键/值对或 null/"a" 是无效的。
在这个意义上,它不允许重复,但它允许添加您,但不关心此键是否已经具有值。因此,目前对于一个键,只会有一个值。
它会默默地覆盖null
键的value
。没有异常。
当您尝试使用null
键获取最后插入的值时,将返回该值。
这不仅适用于null
和任何键。
以下是一个快速示例:
Map m = new HashMap<String, String>();
m.put("1", "a");
m.put("1", "b"); //no exception
System.out.println(m.get("1")); //b
HashMap<Integer,String> h = new HashMap<Integer,String> ();
h.put(null,null);
h.put(null, "a");
System.out.println(h);
输出:
{null=a}
HashMap不允许重复的键,但由于它不是线程安全的,可能会出现重复的键。例如:
while (true) {
final HashMap<Object, Object> map = new HashMap<Object, Object>(2);
map.put("runTimeType", 1);
map.put("title", 2);
map.put("params", 3);
final AtomicInteger invokeCounter = new AtomicInteger();
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
map.put("formType", invokeCounter.incrementAndGet());
}
}).start();
}
while (invokeCounter.intValue() != 100) {
Thread.sleep(10);
}
if (map.size() > 4) {
// this means you insert two or more formType key to the map
System.out.println( JSONObject.fromObject(map));
}
}
m.put(null,null); // here key=null, value=null
m.put(null,a); // here also key=null, and value=a