자바 Comparable 과 Comparator 의 상세 한 해석 및 차이

자바 Comparable 과 Comparator 의 상세 한 해석 및 차이
자바 에서 우리 에 게 두 가지 비교 체 제 를 제공 했다.Comparable 과 Comparator,그들 사이 에는 어떤 차이 가 있 습 니까?오늘 알 아 보 겠 습 니 다.
비교 가능 한 자연 정렬
Comparable 은 java.lang 패키지 아래 인터페이스 입 니 다.내부 에 하나의 방법 만 있 습 니 다 compare To():

public interface Comparable<T> {
  public int compareTo(T o);
}
Comparable 은 클래스 를 실현 하 는 대상 을 비교 할 수 있 으 며 구체 적 인 비교 규칙 은 compare To 방법 중의 규칙 에 따라 진행 된다.이런 순 서 를 자연 순서 라 고 한다.
compare To 방법의 반환 값 은 세 가지 상황 이 있 습 니 다.
  • e1.compare To(e2)>0 즉 e1>e2
  • e1.compareTo(e2)=0 즉 e1=e2e1.compareTo(e2)<0 즉 e1주의:
    1.null 은 같은 종류 도 대상 도 아니 기 때문에 compare To 방법 을 다시 쓸 때 e.compare To(null)의 상황 을 주의해 야 합 니 다.e.equals(null)가 false 로 돌아 가도 compare To 방법 은 빈 포인터 이상 Null Pointer Exception 을 자발적으로 던 져 야 합 니 다.
    2.Comparable 클래스 가 compare To 방법 을 다시 쓸 때 보통 e1.compare To(e2)==0 의 결 과 는 e1.equals(e2)와 일치 해 야 합 니 다.이렇게 하면 앞으로 SortedSet 등 클래스 의 자연 정렬 에 따라 정렬 된 집합 용 기 를 사용 할 때 저 장 된 데이터 의 순서 와 상상 이 일치 하도록 보장 할 수 있 습 니 다.
    위 에 두 번 째 점 이 궁금 하 실 수도 있어 요.위반 하면 어떻게 되 나 요?
    예 를 들 어 하나의 Sorted Set 에 두 개의 대상 a 와 b 를 추가 하면 a b 만족(!a.equals(b)&&a.com pareto(b)==0)와 함께 Comparator 를 따로 지정 하지 않 았 습 니 다.a 를 추가 하고 b 를 추가 할 때 false 를 추가 할 수 없습니다.SortedSet 의 size 도 증가 하지 않 습 니 다.SortedSet 에 서 는 같은 것 으로 보이 지만 SortedSet 에 서 는 중복 이 허용 되 지 않 습 니 다.
    실제로 Comparable 인 터 페 이 스 를 실현 한 자바 핵심 류 의 결 과 는 equlas 방법 과 일치 합 니 다.
    Comparable 인 터 페 이 스 를 실현 한 List 또는 배열 은 Collections.sort()또는 Arrays.sort()방법 으로 정렬 할 수 있 습 니 다.
    Comparable 인터페이스의 대상 을 실현 해야만 SortedMap(SortedSet)의 key 로 직접 사용 할 수 있 습 니 다.그렇지 않 으 면 밖에서 Comparator 정렬 규칙 을 지정 해 야 합 니 다.
    따라서 자신 이 정의 하 는 클래스 가 질서정연 한 집합 클래스 를 사용 하려 면 Comparable 인 터 페 이 스 를 실현 해 야 한다.예 를 들 어:
    
    **
     * description:          ,     Comparable   ,    
     * <br/>
     * author: shixinzhang
     * <br/>
     * data: 10/5/2016
     */
    public class BookBean implements Serializable, Comparable {
      private String name;
      private int count;
    
    
      public BookBean(String name, int count) {
        this.name = name;
        this.count = count;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getCount() {
        return count;
      }
    
      public void setCount(int count) {
        this.count = count;
      }
    
      /**
       *    equals
       * @param o
       * @return
       */
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof BookBean)) return false;
    
        BookBean bean = (BookBean) o;
    
        if (getCount() != bean.getCount()) return false;
        return getName().equals(bean.getName());
    
      }
    
      /**
       *    hashCode      
       *              ,    
       *    hashCode        31     ,     ,     
       * @return
       */
      @Override
      public int hashCode() {
        //   String   hashCode(),            
        int result = getName().hashCode();
        //   31,     count
        result = 31 * result + getCount();
        return result;
      }
    
      @Override
      public String toString() {
        return "BookBean{" +
            "name='" + name + '\'' +
            ", count=" + count +
            '}';
      }
    
      /**
       *    TreeSet     BookBean  ,           
       * @param another
       * @return
       */
      @Override
      public int compareTo(Object another) {
        if (another instanceof BookBean){
          BookBean anotherBook = (BookBean) another;
          int result;
    
          //          
          result = getCount() - anotherBook.getCount();   
    
         //     String      
         //result = getName().compareTo(anotherBook.getName());
    
          if (result == 0){  //      ,     。           
            result = getName().compareTo(anotherBook.getName());
          }
          return result;
        }
        //       0
        return 0;
      }
    
    
    상기 코드 는 equlas(),hashCode()방법 도 다시 썼 으 며,사용자 정의 클래스 를 비교 하려 면 이 방법 을 다시 써 야 합 니 다.
    뒤에 compare To 를 다시 쓸 때 어떤 속성 을 판단 하고 다음 속성 을 비교 하 며 모든 속성 을 비교 해 야 합 니 다.
    Comparable 인 터 페 이 스 는 자바 집합 프레임 의 일부분 에 속한다.
    Comparator 맞 춤 형 정렬
    Comparator 는 java.util 패키지 아래 에서 도 하나의 인터페이스 입 니 다.JDK 1.8 이전 에는 두 가지 방법 만 있 었 습 니 다.
    
    public interface Comparator<T> {
    
      public int compare(T lhs, T rhs);
    
      public boolean equals(Object object);
    }
    
    
    JDK 1.8 이후 여러 가지 방법 이 추가 되 었 습 니 다.

    기본적으로 모두 Function 과 관련 된 것 인 데,여기 서 는 1.8 새로 추 가 된 것 을 잠시 소개 하지 않 는 다.
    위 내용 에서 알 수 있 듯 이 자연 정렬 을 사용 하려 면 Comparable 을 실현 하고 내부 에 comparaTo 방법 을 다시 써 야 합 니 다.
    한편,Comparator 는 외부 에서 정렬 규칙 을 제정 한 다음 에 정렬 정책 매개 변수 로 특정한 유형 에 전달 하 는 것 이다.예 를 들 어 Collections.sort(),Arrays.sort()또는 내부 질서 있 는 집합(예 를 들 어 SortedSet,SortedMap 등)이다.
    사용 방식 은 주로 세 단계 로 나 뉜 다.
    1.Comparator 인터페이스의 실현 클래스 를 만 들 고 대상 에 게 값 을 부여 합 니 다.
    compare 방법 에서 사용자 정의 클래스 에 대한 정렬 규칙
    2.Comparator 대상 을 매개 변수 로 정렬 클래스 에 전달 하 는 방법
    3.정렬 클래스 에 compare 방법 에 사용 할 사용자 정의 클래스 추가
    예 를 들 어:
    
     // 1.       Comparator      
        Comparator comparator = new Comparator() {
          @Override
          public int compare(Object object1, Object object2) {
            if (object1 instanceof NewBookBean && object2 instanceof NewBookBean){
              NewBookBean newBookBean = (NewBookBean) object1;
              NewBookBean newBookBean1 = (NewBookBean) object2;
              //               compareTo   ,       
              return newBookBean.getCount() - newBookBean1.getCount();
            }
            return 0;
          }
        };
    
        //2.            TreeSet      
        TreeSet treeSet = new TreeSet(comparator);
    
        //3.  TreeSet        1   compare           
        treeSet.add(new NewBookBean("A",34));
        treeSet.add(new NewBookBean("S",1));
        treeSet.add( new NewBookBean("V",46));
        treeSet.add( new NewBookBean("Q",26));
    
    
    사실은 알 수 있 듯 이 Comparator 의 사용 은 전략 모델 로 전략 모델 에 익숙 하지 않 은 학생 들 은 여 기 를 클릭 하여 볼 수 있다.전략 모델:인터넷 소설의 고정 적 인 방식 에 대해 알 수 있다.
    정렬 클래스 에 Comparator 인터페이스 참조 가 있 습 니 다.
    Comparator comparator;
    우 리 는 다양한 사용자 정의 정렬 규칙 의 Comparator 구현 클래스 를 입력 하여 같은 클래스 에 대해 서로 다른 정렬 정책 을 제정 할 수 있 습 니 다.
    총결산
    자바 의 두 가지 정렬 방법:
    Comparable 자연 정렬.(실체 클래스 구현)
    Comparator 는 맞 춤 형 정렬 입 니 다.(실체 클래스 를 수정 할 수 없 을 때 호출 자 에서 직접 만 듭 니 다)
    동시에 존재 할 때 Comparator(맞 춤 형 정렬)의 규칙 으로 비교 합 니 다.
    일부 일반적인 데이터 형식(예 를 들 어 String,Integer,Double...)에 대해 그들 은 기본적으로 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 실현 하 며 우 리 는 직접 사용 할 수 있다.
    일부 사용자 정의 클래스 에 대해 서로 다른 상황 에서 서로 다른 비교 전략 을 실현 해 야 할 수도 있 습 니 다.우 리 는 Comparator 인 터 페 이 스 를 새로 만 든 다음 에 특정한 Comparator 를 사용 하여 비교 할 수 있 습 니 다.
    이것 이 바로 Comparable 과 Comparator 의 차이 점 이다.
    읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기