zoukankan      html  css  js  c++  java
  • Java集合:equals与hashCode重写问题

    分别执行:

    1. 没有重写equals也没有重写hashCode

    aa行:输出false

    1. 重写equals没有重写hashCode

    aa行:输出true;
    此时借助Set来观察是否有区别:属性值相同的两个对象hashCode不相等,导致Set中出现重复存储

    1. 重写equals也重写hashCode

    aa行:输出true;
    此时Set中只有一个[Student: id = 1, name = 张三]

    import java.util.HashSet;
    import java.util.Iterator;
    
    // 为什么重写equals要重写hashCode?
    public class Why {
    	public static void main(String[] args) {
    		Student s1 = new Student(001, "张三");
    		Student s2 = new Student(001, "张三");
    	
    		System.out.println(s1.equals(s2));  // aa
    		System.out.println("------");
    		
    		HashSet<Student> students = new HashSet<>();
    		students.add(s1);
    		students.add(s2);
    		
    		Iterator iterator = students.iterator();
    		while (iterator.hasNext()) {
    			System.out.println(iterator.next().toString());
    		}
    		System.out.println("------");
    	}
    
    }
    
    class Student {
    	private int id;
    	private String name;
    	public Student(int id, String name) {
    		super();
    		this.id = id;
    		this.name = name;
    	}
    	
    	// 基于id来判断两个对象是否相同
    	
    	@Override
    	public boolean equals(Object obj) {
    		return obj.equals(id);
    	}
    	
    	@Override
    	public int hashCode() {
    		// TODO Auto-generated method stub
    		return id;
    	}
    	
    	@Override
    	public String toString() {
    		return "[Student: id = " + id + ", name = " + name + "]";
    	}
    	
    }
    
    步履不停
  • 相关阅读:
    C语言运算符优先级和口诀
    跨域问题的解决方案 php
    浅谈跨域攻击及预防
    浅析Websocket--PHP
    linux下的删除目录和文件的方法
    python魔法方法
    双指针
    python常用模块
    python三大器
    对闭包的误区
  • 原文地址:https://www.cnblogs.com/yuanyunjing/p/15324243.html
Copyright © 2011-2022 走看看