ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.