HashSet底层HashMap的value为何是PRESENT?
程序员文章站
2022-03-29 17:16:16
HashSet底层的HashMap所存的value为什么不是null?而是一个静态常量PRESENT?HashSet底层add方法底层源码public boolean add(E e) { return map.put(e, PRESENT)==null; }可以看出底层是调用了HashMap的put方法,我们知道HashMap的put方法的返回值为null或者value。如果put成功的话返回null,如果put失败的话,说明put的key已经存在了,就会返回已经存在该k...
HashSet底层的HashMap所存的value为什么不是null?而是一个静态常量PRESENT?
HashSet底层add方法
底层源码
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
可以看出底层是调用了HashMap的put方法,我们知道HashMap的put方法的返回值为null或者value。如果put成功的话返回null,如果put失败的话,说明put的key已经存在了,就会返回已经存在该key的value值。例如
public static void main(String[] args) {
HashMap map=new HashMap(5);
map.put("1","one");
map.put("2","two");
Object three = map.put("3", "three");
Object four = map.put("3", "four");
System.out.println(three);
System.out.println(four);
}
结果:
null //put成功,返回null
three //put失败,返回hashmap中该key所对应的value
此时再回过头看hashset的add方法,如果底层hashmap的value保存的是null的话,那么put成功或者失败都会返回null,那么HashSet的add()方法每次返回的布尔值都是true了,也就不能够确认add成功还是失败了。
HashSet底层remove方法
底层源码
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
底层是调用了了HashMap的remove方法,我们知道hashmap的remove方法会返回该key对应的value值。例如:
public static void main(String[] args) {
HashMap map=new HashMap(5);
map.put("1","one");
map.put("2","two");
Object one = map.remove("1");
Object three = map.remove("3");
System.out.println("one:"+one);
System.out.println("three:"+three);
}
结果:
one:one //remove成功返回对应的value值
three:null //remove失败返回null
这时候再回头看也能看出一些问题,如果HashMap底层的value保存的都是null的话,那么remove成功或者是失败都会返回null,这时候就会出现与add同样无法区分的问题,无法区分remove是成功还是失败了!
本文地址:https://blog.csdn.net/miss_bear/article/details/112528887