本文章主要介绍了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); 
    } 
} 
 

发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

redisTemplate.delete删除失败详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。