자바 면접문제----자바 기초--hashCode()와 같은 equals()도true인가

6058 단어 Java 면접 문제
답: 해석이 아니다. 둘 다 두 대상이 같은지 아닌지를 비교하는 데 쓰인다.
equals: (효율이 낮음) 만약 방법을 다시 썼다면 대상의 내용이 같은true로 되돌아오거나false로 되돌아오거나false로 되돌아오거나false로 되돌아오거나=로 되돌아오거나falsehashCode로 되돌아오거나: (효율이 높음) 작용은 해시 코드를 가져오는 것이고 산열 코드라고도 부른다.그것은 실제적으로 int 정수를 되돌려줍니다.이 해시 코드의 역할은 이 대상이 해시 표에 있는 색인 위치를 확정하는 것이다
만약에 equals가true라면hashCode가 같다면hashCode가 같다면equals가 반드시 같지 않다. 즉, equals는 믿을 만한 상등이기 때문에 대상이 상등하다고 판단할 때hashCode가 상등한지 아닌지를 먼저 판단하고 상등하지 않으면 대상이 반드시 같지 않다.hashCode가 같으면 equals가 같은지 아닌지를 판단합니다.
1. hashCode가 무엇인지: 대상의 해시 값은 일반적인 십진수 그룹으로 부류 Object hashCode()에서 기원한다.
소스: public native int hashCode(),부모 클래스를 다시 쓰지 않으면, 해시 값은 대상의 내부 주소를 int 수치로 바꾸는 것입니다. 특별한 의미가 없습니다.그러나 하위 클래스가 부모 클래스를 다시 쓰는 방법이 있다면 해시 값은 사용자 정의의 해시 값이다.
예: ① 두 스트링의 경우 hashCode 값이 동일합니다.String에 hashCode() 재작성
String string1 = new String("abc");
String string2 = new String("abc");
System.out.println(string1.hashCode()==string2.hashCode());

실행 결과true ② hashcode의 클래스 카를 다시 쓰지 않았습니다. 두 대상이 있을 때hashCode는 다릅니다.
public class Car {
	private String name;
	public Car(String name) {
		this.name = name;
	}
}
Car c1 = new Car("bmw");
Car c2 = new Car("bmw");
System.out.println(c1.hashCode() == c2.hashCode());

실행 결과false
2. hashCode의 재작성과 작용은hashCode()를 언제 다시 작성해야 합니까?도대체 왜 쓰는 거야?예: 지금 우리는 위의 카의name이 같아야 한다. 두 대상이 같다고 생각한다.
hashCode () 는 equal () 와 마찬가지로 기본 클래스 Object의 방법입니다. equal () 과 마찬가지로 Object에서hashCode () 는 현재 대상의 주소만 되돌려줍니다. 만약 그렇다면, 우리는 같은 클래스입니다. new 두 대상은 메모리에 있는 주소가 다르기 때문에 그들의hashCode () 가 다르기 때문에 이것은 우리가 원하는 동일한 효과가 아닙니다.그래서 우리는 클래스의hashCode () 방법을 다시 써야 한다. 즉, 클래스를hashCode () 에서 유일한hash값을 되돌려야 한다.
다음 비교를 위해 hashCode를 다시 씁니다.
public class Car {
	private String name;
	public Car(String name) {
		this.name = name;
	}
	
	@Override
	public int hashCode() {
		return name.hashCode();
	}
}
Car c1 = new Car("bmw");
Car c2 = new Car("bmw");
System.out.println(c1.hashCode() == c2.hashCode());

실행 결과true
물론 이퀄 () 하나만 다시 쓰고 이퀄 () 을 이용해 비교할 수도 있다.hashCode는 일반적으로 집합에서 사용되며hashSet의 특성(즉 같은 대상을 포함하지 않음)의 실현은hashCode 방법을 사용한다. 구체적으로는 다음과 같다.
대상을 집합에 넣을 때 먼저 대상에 넣을 hashcode 값과 집합 중의 임의의 원소의 hashcode 값이 같은지 판단하고 같지 않으면 그 대상을 집합에 직접 넣는다.만약hashcode값이 같다면 equals 방법을 통해 대상에 넣을 대상과 집합 중의 임의의 대상이 같은지 판단하고 equals의 판단이 같지 않으면 이 요소를 집합에 직접 넣지 않으면 넣지 않는다.즉, 만약 우리가 해시셋을 사용하여 저장 대상을 집합한다면, 원소의 유일성을 확보하려면hashCode () 와 equals () 방법을 다시 써야 한다.다음 예제 코드를 살펴보십시오.
Student 클래스에서 equals 및 hashCode를 재작성하지 않았습니다.
public class Student{
	String name;
	Integer age;

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

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

다음 테스트 방법을 실행하여 new Student ("절차 1", 18) 대상을 두 번 놓습니다.
public class TestHashCode {
	public static void main(String[] arg){
		Student s1 = new Student(" 1",18);
		Student s2 = new Student(" 2",19);
		Student s3 = new Student(" 3",20);
		Student s4 = new Student(" 4",21);
		Student s5 = new Student(" 1",18);

		HashSet set = new HashSet<>();
		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);

		for (Student student : set) {
			System.out.println(student.name+" :"+student.age);
		}
	}
}

실행 결과
 2 :19
 1 :18
 4 :21
 1 :18
 3 :20

그 결과 equals와hashCode를 다시 쓰지 않았을 때 set은 요소의 유일성을 보장하지 못했다.
다음은 Student의 equals를 다시 쓰는 방법입니다. 이름만 같으면 나이가true로 돌아갑니다.
public class Student{
	String name;
	Integer age;

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

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

	@Override
	public boolean equals(Object o) {
		if(o == null){
			return false;
		}
		if(this == o){
			return true;
		}
		if(getClass() != o.getClass()){
			return false;
		}
		Student obj= (Student) o;
		if(!age.equals(obj.getAge()) ){
			return false;
		}
		if(name == null){
			if(obj.getName() != null){
				return false;
			}
		}else if(!getName().equals( obj.getName())){
			return false;
		}
		return true;
	}
	}

실행 결과
 2 :19
 1 :18
 4 :21
 1 :18
 3 :20

관찰 결과 유일성을 보장하지 못하고hashCode 방법을 계속 다시 쓰며name의 해시 값과age로 고정 연산을 해서 int 값을 되돌려줍니다. (같은 요소의hashCode를 동일하게 합니다)
public class Student{
	String name;
	Integer age;

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

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

	@Override
	public boolean equals(Object o) {
		if(o == null){
			return false;
		}
		if(this == o){
			return true;
		}
		if(getClass() != o.getClass()){
			return false;
		}
		Student obj= (Student) o;
		if(!age.equals(obj.getAge()) ){
			return false;
		}
		if(name == null){
			if(obj.getName() != null){
				return false;
			}
		}else if(!getName().equals( obj.getName())){
			return false;
		}
		return true;
	}

	@Override
	public int hashCode() {
		int result = 1;
		result = 31 * result + age;
		result = 31 * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
}

실행 결과
 1 :18
 2 :19
 3 :20
 4 :21

관찰 결과 원소의 유일성을 실현하였다.
우리가 다시 쓴 equals만 호출할 때 set은add()를 호출하면hashCode가 이미 존재하는지 판단하고 다시 쓰지 않은hashCode는 대상 주소에 따라 해시 값을 준다. 자연히 두 개의 다른 대상이라고 생각하고 set에 직접 저장하면 더 이상 equals를 비교하지 않기 때문에 요소의 유일성을 보장할 수 없다.따라서hashSet을 사용하여 저장 대상을 집합하고 요소의 유일성을 확보하려면hashCode()와 equals() 방법을 다시 써야 한다

좋은 웹페이지 즐겨찾기