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;
}