자바

JAVA 자바 Objects 클래스 객체 비교 compare(T t1, T t2, Comparator<T> c) /// 동등비교 equals() 와 deepEquals()

알통몬_ 2017. 3. 14. 10:18
반응형

Objects 클래스

객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 

정적 메서드들로 구성된 Object 의 유틸리티 클래스입니다. 

아래는 Objects 클래스가 가지고 있는 정적 메서드들입니다.


객체비교 compare(T a, T b, Comparator<T>c)

두 객체를 비교자(Comparator)로 비교해서 int 값을 리턴. 

java.util.Comparator<T>는 두 객체를 비교하는 compare(T a, T b) 메서드가 정의되어 있습니다. 

T는 비교할 객체 타입이라는 것만 알아두면 되겠습니다. 

compare() 메서드는 리턴타입이 int 입니다. 

a가 b 보다 작으면 음수를, 같으면 0을 크면 양수를 리턴하도록 구현 클래스를 만들어야 해요.

public interface Comparator<T> {

      int compare(T a, T b)

}


구현 클래스

 class StudentComparator implements Comparator<Student> {

   @Override

    public int compare(Student a , Student b) {

       if(a.ano < b.ano) return -1;

       else if(a.ano == b.ano) return 0;

       else return 1;

   }

}


실행 클래스

세 개의 학상 객체를 StudentComparator로 비교해서 결가를 리턴합니다.

import java.util.Comparator;

import java.util.Objects;


public class CompareExample {

public static void main(String[] args) {

Student s1 = new Student(1);

Student s2 = new Student(1);

Student s3 = new Student(2);

int result = Objects.compare(s1, s2, new  StudentComparator());

System.out.println(result);

result = Objects.compare(s1, s3, new  StudentComparator());

System.out.println(result);

}

static class Student {

int sno;

Student(int sno) {

this.sno = sno;

}

}

static class StudentComparator implements Comparator<Student> {

@Override

public int compare(Student a, Student b) {

/*if(a.sno<b.sno) return -1;

else if(a.sno == b.sno) return 0;

else return 1;*/

return Integer.compare(a.sno, b.sno);

}

}

 

}



동등비교 equals() 와 deepEquals()

 Objects.equals(Object a, Object b) 

두 객체의 동등을 비교

특이한 점은 a와 b가 모두 null일 경우 true를 리턴합니다. 

a와 b가 null이 아닌 경우는 a.equals(b)의 결과를 리턴합니다.


a                     b                       Objects.eqauls(a,b)

not null          not null                     a.equals(b)의 리턴값

null              not null                            false

not null           null                               false

null               null                                 true


Objects.deepEquals(Object a, Object b) 

두 객체의 동등을 비교

a와 b가 서로 다른 배열일 경우, 항목 값이 모두 같다면 true를 리턴합니다. 

 Arrays.deepEquals(Object[] a, Object[] b)와 동일합니다.

a                               b                       Objects.deepEqauls(a,b)

not null(not array)   not null(not array)              a.equals(b)의 리턴값

not null(array)        not null(array)                 Arrays.deepEquals(a,b)의 리턴값

not null                   null                         false

null                     not null                       false

null                       null                           true


예제)

import java.util.Arrays;

import java.util.Objects;


public class EqualsAndDeepEqualsExample {

public static void main(String[] args) {

Integer o1 = 1000;

Integer o2 = 1000;

System.out.println(Objects.equals(o1, o2));  => true

System.out.println(Objects.equals(o1, null)); => false

System.out.println(Objects.equals(null, o2)); => false

System.out.println(Objects.equals(null, null)); => true

System.out.println(Objects.deepEquals(o1, o2) + "\n"); => true

Integer[] arr1 = { 1, 2 };

Integer[] arr2 = { 1, 2 };

System.out.println(Objects.equals(arr1, arr2)); => false

System.out.println(Objects.deepEquals(arr1, arr2)); => true

System.out.println(Arrays.deepEquals(arr1, arr2)); => true

System.out.println(Objects.deepEquals(null, arr2)); => false

System.out.println(Objects.deepEquals(arr1, null)); => false

System.out.println(Objects.deepEquals(null, null)); => true

}

 

}

반응형