int[] 을 키값으로 사용하는 방법(같은 배열인지 확인하는 방법, 해시코드)
C언어의 경우, map의 키 값으로 배열을 사용하는 것이 가능하다.
왜냐하면, 자바의 경우 map의 키 값으로 객체의 주소를 사용하지만,
C언어의 경우 객체의 값을 키값으로 사용하기 때문이다.
아래 코드를 보자
int[]input1 ={1,2,3,4,8,7,6,5};
int[]input2 ={1,2,3,4,8,7,6,5};
Integer[]temp1 = Arrays.stream(input1).boxed().toArray(Integer[]::new);
Integer[]temp2 = Arrays.stream(input2).boxed().toArray(Integer[]::new);
System.out.println(temp1 == temp2); // false
System.out.println(temp1.equals(temp2)); // false
System.out.println(Arrays.equals(input1, input2)); // true
System.out.println(input1 == input2); // false
System.out.println(Arrays.deepHashCode(temp1)== Arrays.deepHashCode(temp2)); // true
input1 과 input2를 equals와 비교연산자(==)으로 비교했을 경우 false를 리턴한다.
자바에서 배열은 객체이고, 객체의 경우 == 비교를 할 경우 주소 비교를 하기 때문이다.
같은 배열인지 확인하기 위해서는
Arrays 클래스의 equals 메소드를 사용하면 된다.
이는 두가지를 통해 확인한다.
1. 배열의 길이
2. 같은 인덱스에 같은 값이 위치하는 지
한편, 이 배열을 키 값으로 사용해야하는 경우가 있다.
이때는 해시코드로 변환해서 사용하면 되는데
Arrays 클래스에 배열을 해시코드로 반환해주는 메소드가 있다.
int[]input1 ={1,2,3,4,8,7,6,5};
int[]input2 ={1,2,3,4,8,7,6,5};
// Integer 배열로 변환
Integer[]temp1 = Arrays.stream(input1).boxed().toArray(Integer[]::new);
Integer[]temp2 = Arrays.stream(input2).boxed().toArray(Integer[]::new);
System.out.println(Arrays.deepHashCode(temp1)); // 1800190017
System.out.println(Arrays.deepHashCode(temp2)); // 1800190017
위 값을 키값으로 사용하면, 배열을 키값 처럼 사용하는 것이 가능하다.
한편, Arrays 클래스 내부적으로 아래와 같은 방법으로 해시코드를 리턴한다.
public static int hashCode(int a[]) {
if (a == null)
return 0;
int result = 1;
for (int element : a)
result = 31 * result + element;
return result;
}