프로그래밍/java

[자바/Java] String 클래스의 hashCode()와 equals()

pupu91 2022. 8. 29. 21:30
반응형

 

1. Striing 클래스의 hashCode() 

: 주소값이 다른 인스턴스여도 value 값이 같으면 동일한 hashCode반환

   

 

 

1) 문자열 객체 사용하는 방법

 

" " 리터럴 형태

: 동일한 값을 가지는 인스턴스를 단일 인스턴스로 관리

String str1 = "java"; 
String str2 = "java";

 

 

String pool 또는 상수 풀 : String만 따로 관리되는 공간 

같은 값을 가지 리터럴 형태의 인스턴스는 String pool에 관리 되기 때문에 중복값은 저장하지 않음

주소 값을 비교 해보면 true를 반환함 

 

 

 new String("문자열")

: 매번 새로운 인스턴스를 생성

String str3 = new String("java"); //String의 생성자를 호출하는데 인자로 "java"값을 전달한다~
String str4 = new String("java");

new로 새로운 인스턴스를 생생하게 되면 리터럴 형태와 달리 새로운 인스턴스를 할당하기 때문에

주소 값 비교시 false을 반환함.

 

 

 

2) hashCode 비교

System.out.println("str1의 hashCode : " + str1.hashCode());
System.out.println("str2의 hashCode : " + str2.hashCode());
System.out.println("str3의 hashCode : " + str3.hashCode());
System.out.println("str4의 hashCode : " + str4.hashCode());

출력 결과
str1의 hashCode : 3254818
str2의 hashCode : 3254818
str3의 hashCode : 3254818
str4의 hashCode : 3254818

= > value 값이 같으면 같은 해쉬코드를 반환되도록 오버라이딩 되어 있기 때문에, 주소값은 다르지만 hashCode 값은 동          일함.

 

 

 

 

3) 문자열은 불변

: 기존 문자열에 + 연산자를 수행하는 경우 문자열을 수정하는 것이 아닌 새로운 문자열을 할당하게 됨

String str2 = "java";

str2 += "oracle";
=> 다른 공간에 javaoracle이라는 문자열이 담기고 java를 참조했던
   주소값이 javaoracle 주소값 참조하는 형태로 변경됨. 즉, 다른 인스턴스가 되었다.

 


 

2. String class의 equals()

: String 클래스의 equals() 메소드는 인스턴스 비교가 아닌 문자열값을 비교

  동일한 값은 true, 아니면 false

  Object의 equals() 메소드를 재정의 해둠

 

String str1 = "java"; 
String str2 = "java";
String str3 = new String("java"); 
String str4 = new String("java"); 

System.out.println("str1.equals(str3) : " + str1.equals(str3));
System.out.println("str3.equals(str4) : " + str3.equals(str4));
=> str1.equals(str3) : true
   str3.equals(str4) : true

=> 문자열은 다 equals()로 비교하는 것이 가장 좋은 방법

반응형