`
liaokang.java
  • 浏览: 152191 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

equals和hashCode方法分析

    博客分类:
  • java
 
阅读更多
1.HashSet存放的是无序,不能重复的对象,当添加一个对象的时,它会先检查此对象的
hashCode值是否与集合中对象的hashCode值相等,如果不等,直接将对象加进去,如果相等,则再用equals方法判断,如果返回的是true表示集合中已经存在此对象,不再进行添加,若返回false将对象添加进去

2.简单来说,如果两个对象equals返回true则它们的hashCode值一定相等,如果返回false它们的hashCode不一定不同,因为equals判定的是否为同一个对象,当然这是针对未被重写来说

看下面例子

import java.util.HashSet;

public class SetTest {

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

}

class Student {
	private String name = null;

	private int age = 0;
	
	public Student(String name, int age){
		this.name = name;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + age;
		result = PRIME * result + ((name == null) ? 0 : name.hashCode());
		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 Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}




如果不对Student类重写equals方法和hashCode方法,当new两个内容相同的对象时,HashSet还是会添加进去,因为两对象的hashCode值不一样,如果像上面那样写了的话则是对内容进行判断,内容相同不再添加
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics