• Java学习笔记_180717_hashCode问题(不懂)


    package com.hxzy.demo001;
    
    import java.util.HashSet;
    
    class RectObject {
    	public int x;
    	public int y;
    
    	public RectObject(int x, int y) {
    		this.x = x;
    		this.y = y;
    	}
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + x;
    		result = prime * result + y;
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		final RectObject other = (RectObject) obj;
    		if (x != other.x) {
    			return false;
    		}
    		if (y != other.y) {
    			return false;
    		}
    		return true;
    	}
    }
    
    public class Example {
    	public static void main(String[] args) {
    		HashSet<RectObject> set = new HashSet<RectObject>();
    		RectObject r1 = new RectObject(3, 3);
    		RectObject r2 = new RectObject(5, 5);
    		RectObject r3 = new RectObject(3, 6);
    		set.add(r1);
    		set.add(r2);
    		set.add(r3);
    		for (RectObject rectObject : set) {
    			System.out.println(rectObject.hashCode());
    		}
    		r3.y=7;
    		for (RectObject rectObject : set) {
    			System.out.println(r3.equals(rectObject));
    			System.out.println(rectObject.equals(r3));
    		}
    		System.out.println("删除前的大小size:" + set.size());
    		System.out.println(set.contains(r3));
    		System.out.println(set.remove(r3));
    		System.out.println("删除后的大小size:" + set.size());
    	}
    }
    

    根据contains的描述:

    Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
    
    Specified by: contains(...) in Set, Overrides: contains(...) in AbstractCollection
    Parameters:
    o element whose presence in this set is to be tested
    Returns:
    true if this set contains the specified element
    

     既然System.out.println(r3.equals(rectObject)); System.out.println(rectObject.equals(r3));返回在rectObject为r3时返回值都为true;为何set.contains(r3)的返回值为false?

    确定是否存在element是根据hashCode确定的,r3.y=7;之后r3的hashcode()返回值改变了,所以set.remove(r3);失败返回值为false;元素个数

    不理解。

    System.out.println("是否包含元素:");
    		for (RectObject rectObject : set) {
    			System.out.println(rectObject.x + ":"+rectObject.y+"--"+set.contains(rectObject));
                    }    
    

     运行这个代码返回值竟然是:true false true;

    看到一种说法,hashcode重写应该保证,同一对象的返回值不改变,暂时只能这么理解了。

    https://blog.csdn.net/violet_echo_0908/article/details/50152915

     hashCode重写原则:

    代码中明显违反了该原则

  • 相关阅读:
    CLR via C#(11)-无参属性、索引器
    CLR via C#(10)-参数
    C#委托的介绍(delegate、Action、Func、predicate)
    MVC3使用Unity实现接口自动注册
    CLR via C#(09)-扩展方法
    CLR via C#(08)-操作符
    CLR via C#(07)-静态类,分部类
    CLR via C#(06)- 构造器
    VS2010几款超赞的扩展辅助工具总结
    web前端开发随手笔记
  • 原文地址:https://www.cnblogs.com/annofyf/p/9325358.html
Copyright © 2020-2023  润新知