본문 바로가기
Backend/JAVA

JAVA - hashCode( )

by YERIEL_염주둥 2020. 4. 29.
728x90

hashCode 메서드

public int hashCode()
Returns a hash code value for the object.
This method is supported for the benefit of hash tables such as those provided by HashMap.

The general contract of hashCode is:
 ◦Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
 ◦If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
 ◦It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.)

Returns : a hash code value for this object.
See Also : equals(java.lang.Object), System.identityHashCode(java.lang.Object)


객체의 해시 코드 값을 반환합니다. 이 메소드는 HashMap에서 제공하는 것과 같은 해시 테이블의 이점을 위해 지원됩니다.

hashCode의 일반적인 계약은 다음과 같습니다.
◦ Java 응용 프로그램을 실행하는 동안 동일한 객체에서 두 번 이상 호출 될 때마다 hashCode 메소드는 객체의 등가 비교에 사용 된 정보가 수정되지 않으면 동일한 정수를 일관되게 반환해야합니다. 이 정수는 응용 프로그램의 한 실행에서 동일한 응용 프로그램의 다른 실행까지 일관성을 유지할 필요가 없습니다.
◦ equals (Object) 메서드에 따라 두 개체가 동일한 경우 두 개체 각각에서 hashCode 메서드를 호출하면 동일한 정수 결과가 생성되어야합니다.
◦ equals (java.lang.Object) 메소드에 따라 두 오브젝트가 동일하지 않은 경우 두 오브젝트 각각에서 hashCode 메소드를 호출하면 고유 한 정수 결과가 생성되어야합니다. 그러나 프로그래머는 동일하지 않은 객체에 대해 고유 한 정수 결과를 생성하면 해시 테이블의 성능을 향상시킬 수 있음을 알고 있어야합니다.

합리적으로 실용적이기는하지만 Object 클래스에 의해 정의 된 hashCode 메소드는 개별 오브젝트에 대해 고유 한 정수를 리턴합니다. (일반적으로 이는 오브젝트의 내부 주소를 정수로 변환하여 구현되지만이 구현 기술은 Java ™ 프로그래밍 언어에 필요하지 않습니다.)

출처 _  eclipse

Object클래스 메서드로 들어오는 값에 따라 해쉬 코드 값이 바뀐다. 메모리 용량을 비교한다.

 

 

Object 클래스 메서드로는 객체에 대입된 값에 따라 해쉬코드가 바뀌기 때문에 정확한 값을 위해서는 Eclipse가 제공하는 Source에서 자동으로 override메서드를 생성한다.

package kr.or.ksmart;

class MemberDto{
	private String name;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31; //주소값
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		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;
		MemberDto other = (MemberDto) obj; //객체도 비교하면서 object도 비교함
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}

class MemberDto2{
	private String name;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

public class JavaBasic01 {
	public static void main(String[] args) {
		/**
		 * equals : 두 객체가 동일한지 비교하는 메서드
		 */
		
		//object의 메서드로 비교
		MemberDto2 m21= new MemberDto2();
		MemberDto2 m22= new MemberDto2();
		MemberDto2 m23= m21;
		
		System.out.println(m21.hashCode() +" m21 object hashcode");
		System.out.println(m22.hashCode() +" m22 object hashcode"); //주소값이 다름  객체마다의 주소값을 연산해서 나옴

		//오버라이딩한 메서드로 비교
		MemberDto m1= new MemberDto();
		MemberDto m2= new MemberDto();
		
		System.out.println(m1.hashCode() +" m1 object hashcode");
		System.out.println(m2.hashCode() +" m2 object hashcode");

		
		//해쉬코드 - 들어간 값에 의해서 해쉬코드가 달라짐
		String str= "홍길동2";
		System.out.println(str.hashCode() + " <- str hashcode //str= 홍길동 : 54150062"); //메모리값이 똑같은지 비교
	
	}
}

 

System.out.println(m21.hashCode( ) +" m21 object hashcode");
System.out.println(m22.hashCode( ) +" m22 object hashcode");
결과값

 

System.out.println(m1.hashCode( ) +" m1 object hashcode");
System.out.println(m2.hashCode( ) +" m2 object hashcode");
결과값

 

System.out.println(str.hashCode( ) + " <- str hashcode //str= 홍길동 : 54150062");
결과값

반응형

'Backend > JAVA' 카테고리의 다른 글

JAVA instanceof 연산자  (0) 2020.04.29
JAVA equals( ) 메서드  (0) 2020.04.29
JAVA 추상 클래스  (0) 2020.04.27
JAVA override && final  (0) 2020.04.27
JAVA 다형성  (0) 2020.04.22

댓글