Java 배열 비교에서 equals가 안 되는 이유

  • 기존 코드
import java.util.Scanner;
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }
        Arrays.sort(a);
        Arrays.sort(b);
        System.out.println((a.equals(b)) ? "Yes" : "No");
    }
}

자바에서 equals 메서드는 배열의 내용을 비교하지 않고 객체의 참조 주소를 비교한다.

즉, a와 b가 똑같은 배열 객체를 가리키는 경우에만 true를 반환하고, 내용이 같아도 다른 배열 객체라면 false가 된다.

배열의 내용을 비교하려면 Arrays.equals() 를 사용해야 한다.

  • 수정 코드
import java.util.Scanner;
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }
        Arrays.sort(a);
        Arrays.sort(b);
        
        System.out.println(Arrays.equals(a, b) ? "Yes" : "No");
    }
}

다차원 배열의 경우

2차원 이상의 배열이라면 Arrays.deepEquals()를 사용해야 한다.

int[][] arr1 = {{1,2}, {3,4}};
int[][] arr2 = {{1,2}, {3,4}};
 
System.out.println(Arrays.equals(arr1, arr2));      // false
System.out.println(Arrays.deepEquals(arr1, arr2));  // true

정리

  • a.equals(b)는 배열의 내용 비교가 아니라 참조 비교다.
  • 배열의 내용을 비교할때는 Arrays.equals()를 사용해야 한다.
  • 다차원 배열은 Arrays.deepEquals()를 써야 한다.