-
Java 배열 내용 값이 같은지 비교하려면,Programming Language/java 2021. 1. 4. 23:35
primitive 타입인 경우 Arrays.equals 를 사용하면 된다.
import java.util.Arrays; public class Test { public static void main(String[] args) { int[] arr1 = {1,2,3,4,5}; int[] arr2 = {1,2,3,4,5}; System.out.println(arr1); System.out.println(arr2); // 주소값? System.out.println(arr1.equals(arr2)); System.out.println(Arrays.equals(arr1,arr2)); } } [I@7c30a502 [I@49e4cb85 false true
--
reference 타입인 경우 곧바로 Arrays.equals로 출력하면 false
equals를 오버라이드 하여 구현해주면 true
import java.util.Arrays; import java.util.Objects; public class Test { public static void main(String[] args) { Data[] arr1 = new Data [2]; arr1[0] = new Data(1,2); arr1[1] = new Data(2,3); Data[] arr2 = new Data[2]; arr2[0] = new Data(1,2); arr2[1] = new Data(2,3); System.out.println(Arrays.equals(arr1,arr2)); } static class Data{ int x,y; public Data(int x, int y){ this.x=x; this.y=y; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Data data = (Data) o; return x == data.x && y == data.y; } } }
--
배열이 아니라 ArrayList인 경우
Arrays.equals 가 아니라 그냥 equals를 사용하면 되는데
이 역시 equals를 오버라이드 해주어야 true가 출력된다.
List의 equals가 Object의 equals를 사용하여 구현되어 있어서 그렇다고 한다.
public boolean equals(Object o) { if (o == this) // 자기 자신과 같은가? return true; if (!(o instanceof List)) // 리스트인가(List 인터페이스 구현체인가)? return false; // 두 리스트의 원소를 순서대로 비교한다 ListIterator<E> e1 = listIterator(); ListIterator<?> e2 = ((List<?>) o).listIterator(); while (e1.hasNext() && e2.hasNext()) { E o1 = e1.next(); Object o2 = e2.next(); if (!(o1==null ? o2==null : o1.equals(o2))) // 각각의 원소가 같은가? return false; } // 루프가 끝난 이후 두 리스트의 원소 중 검사하지 않은 것이 없다면 true return !(e1.hasNext() || e2.hasNext()); }
1,2의 Data를 가지고 있는지 contains로 체크도 할 수 있다.
아마 contains 메소드도 Object의 equals 를 활용하여 구현되어 있지 않을까
import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; public class Test { public static void main(String[] args) { ArrayList<Data> al1 = new ArrayList<>(); al1.add(new Data(1,2)); al1.add(new Data(2,3)); ArrayList<Data> al2 = new ArrayList<>(); al2.add(new Data(1,2)); al2.add(new Data(2,3)); System.out.println(al1.equals(al2)); // true 출력 System.out.println(al1.contains(new Data(1,2))); // true 출력 } static class Data{ int x,y; public Data(int x, int y){ this.x=x; this.y=y; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Data data = (Data) o; return x == data.x && y == data.y; } } }
ArrayList<Data> al1 = new ArrayList<>(); al1.add(new Data(1,2)); al1.add(new Data(2,3)); ArrayList<Data> al2 = new ArrayList<>(); al2.add(new Data(2,3)); al2.add(new Data(1,2)); System.out.println(al1.equals(al2)); // 순서 바뀌면 false
'Programming Language > java' 카테고리의 다른 글
[디자인 패턴] Iterator 패턴 (0) 2023.08.19 Thread start() run() 차이 (0) 2022.06.26 JAVA - 클래스변수, 인스턴스변수, 지역변수 (0) 2021.01.05 java 오버라이딩 예제 (0) 2020.12.12 람다식이란?? (0) 2020.09.30