자바 Comparable 과 Comparator 의 상세 한 해석 및 차이
7378 단어 JavaComparableComparator구별
자바 에서 우리 에 게 두 가지 비교 체 제 를 제공 했다.Comparable 과 Comparator,그들 사이 에는 어떤 차이 가 있 습 니까?오늘 알 아 보 겠 습 니 다.
비교 가능 한 자연 정렬
Comparable 은 java.lang 패키지 아래 인터페이스 입 니 다.내부 에 하나의 방법 만 있 습 니 다 compare To():
public interface Comparable<T> {
public int compareTo(T o);
}
Comparable 은 클래스 를 실현 하 는 대상 을 비교 할 수 있 으 며 구체 적 인 비교 규칙 은 compare To 방법 중의 규칙 에 따라 진행 된다.이런 순 서 를 자연 순서 라 고 한다.compare To 방법의 반환 값 은 세 가지 상황 이 있 습 니 다.
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 의 차이 점 이다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.