work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java hashCode与equals学习

Posted on 2019-06-01 16:10  work hard work smart  阅读(147)  评论(0编辑  收藏  举报

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]]