왜 equals와hashCode를 다시 쓰는 방법

2569 단어
프로그램에서, 우리는 이퀄스 방법으로 두 대상을 비교하는 습관이 있다. Object의 이퀄스 방법에서 기본적으로 두 대상의 메모리 주소를 비교하는 것을 계승한다. (String 클래스는 이퀄스 방법을 다시 쓰고 문자열의 내용을 비교한다.)만약 우리가 두 개의 Person 대상을 만들었다면, 양자는 동명이인이고, 우리는 양자가 같다고 생각하지만, 이퀄스 방법으로 양자를 비교한다면, 메모리 주소가 다르기 때문에 되돌아오는 것은false이다.따라서 우리는 equlas 방법을 다시 써서 우리의 시각으로 규칙을 세워야 한다.우리는 실례를 들어 분석한다.
우리는 클래스를 만들고 equals 방법을 다시 쓰고 두 개의 대상인person1과person2 대상을 만들고 둘을 비교합니다.

1. equals 다시 쓰는 방법

public class Person {
	private String name;
	private int age;
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (this == obj) {//  , true
			return true;
		}
		if (obj == null) {//  null, false
			return false;
		}
		if (obj.getClass() != this.getClass()) {
			return false;// , false
		}
		Person person=(Person)obj;
		if(person.getName().equals(getName())&&person.getAge()==getAge()){
			return true;
		}
		return false;
	}

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

	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

Junit 테스트를 통해 다음과 같은 두 객체를 HashSet에 저장합니다.
public class TestDemo {
	Set<Person> set=new HashSet<Person>();// HashSet person 
	@Test
	public void test1(){
		Person person1=new Person();
		person1.setName("zhang");
		person1.setAge(18);
		Person person2=new Person();
		person2.setName("zhang");
		person2.setAge(18);
		System.out.println(" :"+person1.equals(person2));
		set.add(person1);
		set.add(person2);
		System.out.println("set "+set.size()+" 
"+set); } }

결과는 다음과 같습니다.
양자 비교 결과:true
set에는 두 개의 객체가 있습니다. [com.zhang.demo.Person@1ceebfa, com.zhang.demo.Person@1e6743e]
이때 우리는 equals를 다시 쓰는 방법을 통해 두 대상이 같다는 것을 판단했지만 둘 다 set에 저장되었다는 문제를 발견했다.나니?모두가 알다시피 set에는 서로 다른 대상만 저장할 수 있다. 분명히 HashSet에 있어 equals 방법을 다시 쓰는 것만으로는 부족하다. (HashMap에도 마찬가지) 집합 비교 대상의 원리를 이해한 결과 원래 집합이 두 대상을 먼저 비교하는 HashCode가 같은지 아닌지를 알 수 있다. 만약에 같다면 equlas 방법을 통해 비교하고 두 방법이 모두 통과한다면 두 대상은 같은 대상으로 간주된다.그런 다음 hashCode 메서드를 다시 작성합니다.

2.hashCode 다시 쓰기 방법

public int hashCode() {
		// TODO Auto-generated method stub
		int prime = 31;//  
		int result = 1;
		result=result*prime+(name==null?0:name.hashCode());
		result=result*prime+age;
		return result;
	}

그리고 위의 테스트 방법을 통해 테스트를 한 결과 다음과 같습니다.
양자 비교 결과:true set에는 1개의 객체가 있습니다:[com.zhang.demo.Person@d6168d67]
이때 HashSet에는 하나의 객체만 저장됩니다.

좋은 웹페이지 즐겨찾기