• Hashing 기법에 사용되는 hash function을 구현한 메서드
  • 해시함수: 찾고자하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드를 반환
  • 해시코드가 같은 두 객체가 존재하는 것이 가능하지만 Object class에 정의된 메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 한번의 실행에서 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없음
  • String 클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode메서드를 오버라이딩했기 때문에, 문자열의 내용이 같은 객체에 대해 hashCode()를 호출하면 항상 동일한 해시코드값을 얻는다.
    반면, System.identityHashCode(Object x)는 Object클래스의 hashCode메서드처럼 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다. 그래서 문자열의 내용이 같은 String 객체가 해시코드는 같지만 서로다른 객체라는 것을 알 수 있다.
  • a.equals(b)가 true이면 a.hashcode()==b.hashcode()도 성립
    그러나 a.hashcode()==b.hashcode()가 성립해도 a.equals(b)가 반드시 true는 아님
    또 서로다른 객체들에 대해 같은 hashcode값을 만들어낼 수 있기 때문에 객체가 다르더라도 hashcode는 같을 수 있음
  • 1방향으로 해시암호화 적용
  • 다른 객체와의 충돌방지(100%는불가함)
  • 인코딩시 CPU COST 발생하지 않음

code>>>

String a = “aaa”;
String b = a;
String c = new String(“aaa”);

System.out.println(a.equals(b)); //대상의 내용자체를 비교 -true
System.out.println(a==b); //대상의 주소값 비교 – true
System.out.println(a==c); //false
System.out.println(a.equals(c)); //true

System.out.println(a.hashCode()); //96321
System.out.println(b.hashCode()); //96321
System.out.println(c.hashCode()); //96321

String bb = new String(“abcd”);

System.out.println(“\n”);
System.out.println(bb);
System.out.println(bb.hashCode()); //2987074
System.out.println(System.identityHashCode(bb)); //366712642

String bb2 = new String(“abcd”);

System.out.println(bb2);
System.out.println(bb2.hashCode()); //2987074
System.out.println(System.identityHashCode(bb2)); //1829164700

System.out.println(bb==bb2); //false
System.out.println(bb.equals(bb2)); //true

'java' 카테고리의 다른 글

TCP 소켓 프로그래밍  (0) 2016.05.09
Thread synchronized  (0) 2016.05.09
thread  (0) 2016.05.09
이뮤터블/뮤터블  (0) 2016.04.29
printf()  (0) 2016.04.28

+ Recent posts