zoukankan      html  css  js  c++  java
  • equals和hashcode重写的问题

    public static void main(String[] args) {
    		Set<Test> set = new HashSet<>();
    		Test t1 = new Test("aaa");
    		Test t2 = new Test("aaa");
    		set.add(t1);
    		set.add(t2);
    		System.out.println(set.size()); 
    		//我们对于equals方法已经很熟了,这里就不说了
    		//t1.equals(t2)   == true
    		//如果Test没有重写hashcode方法     set.size()  ->  2
    		//如果Test重写了hashcode方法        set.size()  ->  1
    		//原因:
    			//在集合中,判断两个对象是否相等的规则是:
    	    	//第一步,如果hashCode()相等,则查看第二步,否则不相等;
    	         //第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等
    		//hashcode源码分析:String类的
    			//实际上它是遍历了字符串的里面的所有字符,根据每个字符的ASCII码值进行遍历计算,关于那个固定值为什么是31,应该取这个值效率较高,可重复性较低
    			/*public int hashCode() {
    	        int h = hash;
    	        if (h == 0 && value.length > 0) {
    	            char val[] = value;
    	
    	            for (int i = 0; i < value.length; i++) {
    	                h = 31 * h + val[i];
    	            }
    	            hash = h;
    	        }
    	        return h;*/
    		//equals源码分析:string类
    			//这个相信大家都看过,遍历字符串里的所有字符,然后逐一进行比较,只要有不相同的就return false
    		//所以
    			//equals相同的两个对象,其hashcode码一定相同,因为hashcode码就是根据值去算的
    			//两个对象的hashcode码相同,可能存在偶然的情况,字符串不同,算出的hashcode码一样
    	}
    

      

  • 相关阅读:
    20191324读书笔记10
    20191324读书笔记十一
    实验三:个人贡献
    20191324读书笔记12
    CBMVC For Titanium Alloy 发布!
    让 PowerDesigner 支持 SQLite!
    在类库中调用资源文件实现国际化!
    理解依赖注入及其好处!
    CBMVC Titanium Framework 介绍
    .Net插件框架的实现及分析(二)
  • 原文地址:https://www.cnblogs.com/liyong888/p/7703738.html
Copyright © 2011-2022 走看看