zoukankan      html  css  js  c++  java
  • Java hashCode与equals学习

    1、关于Object类的equals方法的特点

    a) 自反性: x.equals(x) 应该返回true

    b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true

    c) 传递性: x.equals(y)为true,并且y.equals(z) 为true, 那么x.equals(z) 也为true

    d) 一致性   x.equals(y)  第一次调用为true,那么在没有修改x和y时, 第二次,第n次调用也应该为true。

    2、关于Object类的hashcode()方法

    a) 在Java应用的一次执行过程中,对同一个对象的hasCode方法的多次调用,他们应该返回同样的值(前提示该对象的信息没有变化)

    b)对应两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。

    c)对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不一定是相同的。如果不同,可以提高应用的性能。

    d) 对于Object类来说,不同的Object对象的hashCode值是不同的。(Object类的hashCode值表示对象的地址)

    3、当使用HashSet的add方法时,hashCode方法就会得到调用,判断已经存储在集合中的所有对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

    1)demo1

    public static void main(String[] args) {
    		HashSet set = new HashSet();
    		set.add(new People("Tom"));
    		set.add(new People("Nick"));
    		set.add(new People("Nick"));
    		
    		System.out.println(set);
    	}
    

      返回

    [com.example.collectiondemo.People@7852e922, com.example.collectiondemo.People@15db9742, com.example.collectiondemo.People@6d06d69c]

    2)、demo2

    	public static void main(String[] args) {
    		HashSet set = new HashSet();
    
    		People lisi = new People("Lisi");
    		set.add(lisi);
    		set.add(lisi);
    
    		System.out.println(set);
    	}
    

      返回

    [com.example.collectiondemo.People@15db9742]

    3)demo3

    public static void main(String[] args) {
    		HashSet set = new HashSet();
    		String s1 = new String("a");
    		String s2 = new String("a");
    		set.add(s1);
    		set.add(s2);
    		System.out.println(set);
    	}
    

      返回

    [a]

    4、如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

    5、Demo: 创建一个Student对象,如果名字一样,就不添加到Set集合中。

    public class SetTest3 {
    	
    	public static void main(String[] args) {
    		HashSet set = new HashSet();
    		Student s1 = new Student("Tom");
    		Student s2 = new Student("Tom");
    		set.add(s1);
    		set.add(s2);
    		System.out.println(set);
    		
    	}
    	
    }
    
    class Student{
    	String name;
    	
    	public Student(String name) {
    		this.name = name;
    	}
    	
    
    	@Override
    	public int hashCode() {
    		return this.name.hashCode();
    	}
    	
    
    	@Override
    	public boolean equals(Object obj) {
    		if(this == obj){
    			return true;
    		}
    		if(null != obj && obj instanceof Student){
    			Student s = (Student)obj;
    			if(name.equals(s.name)){
    				return true;
    			}
    		
    		}
    		return false;
    	}
    
    
    	@Override
    	public String toString() {
    		return "Student [name=" + name + "]";
    	}
    	
    	
    }
    

      打印

    [Student [name=Tom]]

  • 相关阅读:
    spark streaming 整合kafka(二)
    JAVA设计模式之动态代理
    使用org.apache.commons.cli包来设计JAVA命令行工具
    HTML教程
    Java InputStream和Reader
    Java IO
    程序员怎么把自己的招牌打出去?
    Java设计模式之单例模式
    JAVA NIO
    Java文件流字节流和字符流的区别
  • 原文地址:https://www.cnblogs.com/linlf03/p/10959953.html
Copyright © 2011-2022 走看看