Java 비교 및 비교기의 상세한 설명과 차이
Java는 두 가지 비교 메커니즘의 비교 및 비교기를 제공합니다. 그들 사이의 차이점은 무엇입니까? 오늘 알아 봅시다.
비슷한 자연적인 종류
비교할 수있는 것은 Java.lang 패키지의 인터페이스이며, 내부에 비교 ()가 다음과 같은 방법은 하나뿐입니다.
공개 인터페이스 비교 가능 <t> {public int compareto (t o);}비교할 수있는 클래스의 객체를 비교할 수 있습니다. 특정 비교 규칙은 비교 방법의 규칙에 따라 수행됩니다. 이 순서를 자연 순서라고합니다.
비교 방법의 반환 값이 다음과 같은 세 가지가 있습니다.
알아채다:
1. NULL은 클래스 나 객체가 아니기 때문에 비교 방법을 다시 작성할 때 e.compareto (null)의 경우에주의를 기울여야합니다. eequals (null)가 false를 반환하더라도 비교 방법은 null 포인터 예외 nullpointerexception을 적극적으로 던져야합니다.
2. 비교 방법을 다시 작성하기 위해 비슷한 클래스를 구현할 때, e1.compareto (e2) == 0의 결과는 일반적으로 e1.equals (e2)와 일치해야합니다. 이러한 방식으로, 앞으로, SortedSet 및 기타 컬렉션 컨테이너를 자연스러운 종류의 클래스에 따라 정렬 할 때 저장된 데이터의 순서는 상상력과 일치하도록 보장 할 수 있습니다.
어떤 사람들은 위의 두 번째 지점이 위반되면 어떻게 될지 궁금할까요?
예를 들어, 두 개의 객체 A와 B를 정렬 세트에 추가하면 AB는 (! a.equals (b) && a.compareto (b) == 0)를 만족시키고 다른 비교기가 지정되지 않으면 A와 B를 추가 할 때 False를 추가 할 때 정렬 세트의 크기가 동일하기 때문에 정렬 세트의 크기가 허용되지 않기 때문에 정렬 세트의 크기는 증가하지 않습니다.
실제로, 비슷한 인터페이스를 구현하는 모든 Java Core 클래스의 결과는 EqualAS 방법과 일치합니다.
Collections.sort () 또는 Array.Sort () 메소드를 사용하여 비슷한 인터페이스를 구현하는 목록 또는 배열.
비슷한 인터페이스를 구현하는 객체 만 SortedMap (SortedSet)의 키로 직접 사용할 수 있으며, 그렇지 않으면 비교기 정렬 규칙을 외부로 지정해야합니다.
따라서 자신을 정의하는 클래스가 순서대로 컬렉션 클래스를 사용하려면 다음과 같은 비슷한 인터페이스를 구현해야합니다.
** * 설명 : 테스트에 사용되는 엔티티 클래스 북은 비슷한 인터페이스, 자연 분류 * <br/> * 저자 : Shixinzhang * <br/> * 데이터 : 10/5/2016 */public class bookbean을 구현할 수 있고 비슷한 문자열 이름; 개인 int 수; public bookbean (문자열 이름, int count) {this.name = name; this.count = count; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public int getCount () {return count; } public void setCount (int count) {this.count = count; } / ** * retrite equals * @param o * @return * / @override public boolean equals (Object o) {if (this == o) true; if (! (o bookbean)) false를 반환합니다. Bookbean Bean = (BookBean) o; if (getCount ()! = bean.getCount ()) false를 반환합니다. return getName (). equals (bean.getName ()); } /*** 복제를 피하기 위해 모든 속성을 기반으로 해시 코드의 계산 방법을 다시 작성하십시오.* 계산 계수 31은 해시 코드를 계산할 때 나타납니다. 소수이며 다시 나눌 수 없으며 * @return */ @override public int ashcode () {// call string의 hashcode ()는 문자열 int result = getName ()의 내용 만 나타내는 문자열의 hashcode (). hashcode (); // 31을 곱하고 + count result = 31 * result + getCount (); 반환 결과; } @override public String toString () {return "BookBean {" + "name = '" + name +'/' + ", count =" + count +'} '; } / ** * BookBean을 TreesET에 추가 할 때이 방법은 * @param 다른 * @return * / @Override public int comporeto (Object oper) {if (다른 인스턴스 BookBean) {BookBean Otherbook = (Bookbean) 다른; int 결과; // 예를 들어, 책 가격별로 정렬하면 result = getCount () - Otherbook.getCount (); // 또는 string의 순서를 따르십시오. // result = getName (). compareto (Otherbook.getName ()); if (result == 0) {// 책 가격이 동일 할 때 제목을 비교하십시오. 모든 속성이 결과 = getName (). compareto (Otherbook.getName ())을 비교한지 확인하십시오. } 반환 결과; } // 반환 0 리턴 0; }위의 코드는 또한 Equileas () 및 hashcode () 메소드를 다시 작성했습니다. 사용자 정의 클래스는 이러한 방법을 비교하려면 이러한 방법을 다시 작성해야합니다.
나중에 비교를 다시 작성하면 특정 속성이 동일인지 판단하고 모든 속성을 한 번 비교해야합니다.
비슷한 인터페이스는 Java Collections 프레임 워크의 일부입니다.
비교기 사용자 지정 정렬
비교기는 또한 java.util 패키지의 인터페이스입니다. JDK 1.8 이전에는 두 가지 방법 만있었습니다.
공개 인터페이스 비교기 <t> {public int compare (t lhs, t rhs); Public Boolean Equals (Object Object);}JDK 1.8에 많은 새로운 방법이 추가되었습니다.
기본적으로, 그것들은 모두 기능과 관련이 있으며, 1.8에 새로 추가 된 것은 여기에 소개되지 않습니다.
위에서부터 자연 분류를 사용하려면 클래스가 비슷한 구현이 필요하며 비교 방법은 내부적으로 다시 작성됩니다.
비교기는 외부 적으로 정렬 규칙을 설정하고 collections.sort (), arrays.sort () 또는 일부 내부 주문 컬렉션 (예 : SortedSet, SortedMap 등)과 같은 정책 매개 변수로 특정 클래스로 전달합니다.
사용 방법은 주로 세 단계로 나뉩니다.
1. 비교기 인터페이스 구현 클래스를 만들고 객체에 값을 할당합니다.
비교 방법에서 사용자 정의 클래스에 대한 정렬 규칙 작성
2. 비교기 객체를 정렬 클래스의 메소드로 매개 변수로 전달합니다.
3. 비교 메소드에 사용 된 사용자 정의 클래스 추가 정렬 클래스에 추가
예를 들어:
// 1. 비교 인터페이스 비교를 구현하는 객체를 만듭니다. = new Comparator () {@override public int compart (Object Object1, Object Object2) {if (newbookbean && 객체 2 인스턴스) {NewBookBean NewBeen) 객체 1; NewBookBean NewBookBean1 = (NewBookBean) Object2; // 특정 비교 방법에 대한 자연 정렬의 비교를 참조하십시오. 여기에 밤나무 return newBookBean.getCount () -NewBookBean1.getCount (); } 반환 0; }}; // 2. 이 객체를 Treeset Treeset의 생성자에게 공식 매개 변수로 전달하십시오. // 3. 1 단계의 비교 메소드에서 설계된 클래스의 객체를 트리 셋에 treeset treeset.add (new Newbookbean ( "a", 34))에 추가합니다. treeset.add (New Newbookbean ( "S", 1)); treeset.add (New Newbookbean ( "V", 46)); treeset.add (New Newbookbean ( "Q", 26));실제로, 우리는 비교기의 사용이 전략 모델임을 알 수 있습니다. 전략 모델에 익숙하지 않은 학생들은 여기를 클릭하여 볼 수 있습니다. 전략 모드 : 온라인 소설의 고정 루틴에 대해 알아보십시오.
비교기 인터페이스에 대한 참조는 정렬 클래스에서 유지됩니다.
비교기 <? 슈퍼 k> 비교기;
우리는 다양한 사용자 지정 정렬 규칙 비교기 구현 클래스를 통과하고 동일한 클래스에 대한 다양한 정렬 전략을 공식화 할 수 있습니다.
요약
Java의 두 가지 정렬 방법 :
비슷한 자연 분류. (엔티티 클래스 구현)
비교기는 맞춤형입니다. (엔티티 클래스를 수정할 수없는 경우 발신자에서 직접 생성됩니다)
동시에 존재하면 비교를 위해 비교기 규칙 (맞춤형 정렬)을 사용합니다.
일부 일반 데이터 유형 (예 : String, Integer, Double ...)의 경우 기본적으로 비교 가능한 인터페이스를 구현하고 직접 사용할 수있는 비교 방법을 구현합니다.
일부 사용자 정의 클래스의 경우 다른 상황에서 다른 비교 전략을 구현해야 할 수도 있습니다. 새로운 비교기 인터페이스를 작성한 다음 특정 비교기 구현을 사용하여 비교할 수 있습니다.
이것은 비교할 수있는 것과 비교기의 차이입니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!