本文章主要介绍了hashmap,hashset key相同值是否覆盖,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("apple", "苹果");
map.put("apple", "香蕉");
System.out.println( map.get("apple"));
//ParamVO类重写了hashcode和equal方法
ParamVO param = new ParamVO("varName", "1", "1");
ParamVO param2 = new ParamVO("varName", "2", "2");
Set<ParamVO> set = new HashSet<>();
set.add(param);
set.add(param2);
System.out.println(set.toString());
}
结果:
香蕉
[ParamVO(varName=varName, filterKind=1, type=1)]
原因:
为什么从结果上来看,HashMap看起来是值覆盖,HashSet值没有覆盖?
从底层代码看,HashSet执行add方法,底层调用的也是HashMap的put方法,如果key相同,值不同,则覆盖;而这里为什么HashSet看起来值没有覆盖,是因为HashSet底层是HashMap,他的值就是HashMap的key,而value则是一个固定的Object对象。在这,相当于key相同,value也相同,故不会替换。
备注:
@Data
public class ParamVO {
private String varName;
private String filterKind;
private String type;
public ParamVO(String varName, String filterKind, String type) {
this.varName = varName;
this.filterKind = filterKind;
this.type = type;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ParamVO that = (ParamVO) o;
return Objects.equals(varName, that.varName);
}
@Override
public int hashCode() {
return Objects.hash(varName);
}
}
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/228213.html