Comparable 和 Comparator的区别?
1.前言
Comparable 和 Comparator的区别? 可能有的小伙伴们还不是很清楚,这两个接口都是用于对象比较的。下面写两个简单的例子比较下两个接口的使用方法。
2.Comparable接口
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo():
public interface Comparable<T> {
public int compareTo(T o);
}
例子:
package com.wk.collections.compare;
import java.io.Serializable;
public class Book implements Serializable, Comparable {
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;
}
private String name;
private int count;
Book(String name, int count) {
this.name = name;
this.count = count;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", count=" + count +
'}';
}
@Override
public int compareTo(Object another) {
if (another instanceof Book) {
Book anotherBook = (Book) another;
int result;
result = getCount() - anotherBook.getCount();
if (result == 0) { //当书价一致时,再对比书名。保证所有属性比较一遍
result = getName().compareTo(anotherBook.getName());
}
return result;
}
return 0;
}
}
package com.wk.collections.compare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ComparableTest {
public static void main(String[] args) {
List<Book> books = new ArrayList<Book>(100);
Book book;
for (int i = 0; i < 70; i++) {
book = new Book("天书" + i, i);
books.add(book);
}
//打乱顺序
Collections.shuffle(books);
books.stream().forEach(System.out::println);
Collections.sort(books);
books.stream().forEach(System.out::println);
}
}
3.Comparator接口
Comparator可以认为是是一个外比较器,有两种情况可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较;
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。
Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
Comparator 在 java.util 包下,也是一个接口
例子:
package com.wk.collections.compare;
public class Book2 {
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;
}
private String name;
private int count;
Book2(String name, int count) {
this.name = name;
this.count = count;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", count=" + count +
'}';
}
}
package com.wk.collections.compare;
import java.util.Comparator;
public class BookComparator implements Comparator<Book2> {
@Override
public int compare(Book2 book1, Book2 book2) {
return book1.getCount() - book2.getCount();
}
}
package com.wk.collections.compare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ComparatorTest {
public static void main(String[] args) {
List<Book2> books = new ArrayList<Book2>(100);
Book2 book;
for (int i = 0; i < 70; i++) {
book = new Book2("天书" + i, i);
books.add(book);
}
//打乱顺序
Collections.shuffle(books);
books.stream().forEach(System.out::println);
Collections.sort(books, new BookComparator());
books.stream().forEach(System.out::println);
}
}