Comparable和Comparator两接口的区别
程序员文章站
2022-03-10 16:05:55
...
comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)
方法用来排序
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。
具体例子:
public class UserInfo implements Comparable<UserInfo> {
private int id;
private String name;
private int age;
public UserInfo(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public int compareTo(@NonNull UserInfo o) {
return age > o.age ? 1 : (age == o.age ? 0 : -1);
}
@Override
public String toString() {
return "UserInfo[id=" + id + " name=" + name + " age=" + age + "]";
}
}
@Test
public void java8Test(){
List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(new UserInfo(0, "大强", 12));
userInfoList.add(new UserInfo(1, "大黄", 18));
userInfoList.add(new UserInfo(2, "大黑", 16));
userInfoList.add(new UserInfo(0, "大白", 52));
userInfoList.add(new UserInfo(0, "大红", 8));
userInfoList.add(new UserInfo(0, "大花", 16));
userInfoList.add(new UserInfo(0, "大菜", 36));
System.out.println("排序前");
for (UserInfo userInfo : userInfoList) {
System.out.println(userInfo);
}
Collections.sort(userInfoList);
System.out.println("排序后");
for (UserInfo userInfo : userInfoList) {
System.out.println(userInfo);
}
}
Comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)
方法用来排序
Comparator可以说是一个外比较器,个人认为有两种情况:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式(如:让人根据年龄排序,如果年龄一样,,根据姓名的自然顺序排序)
具体例子:
public class UserB {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public UserB(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "userB[id=" + id + " name=" + name + " age=" + age + "]";
}
}
@Test
public void java8Test(){
List<UserB> userList = new ArrayList<>();
userList.add(new UserB(0, "dog", 12));
userList.add(new UserB(1, "dog", 18));
userList.add(new UserB(2, "dog", 16));
userList.add(new UserB(0, "baby", 52));
userList.add(new UserB(0, "girl", 8));
userList.add(new UserB(0, "egg", 16));
userList.add(new UserB(0, "egg", 36));
System.out.println("排序前");
for (UserB userB : userList) {
System.out.println(userB);
}
Collections.sort(userList, new Comparator<UserB>() {
@Override
public int compare(UserB o1, UserB o2) {
if (o1.getName().compareTo(o2.getName()) == 0) {
if (o1.getAge() == o2.getAge()) {
return 0;
} else if (o1.getAge() > o2.getAge()) {
return 1;
} else {
return -1;
}
} else if (o1.getName().compareTo(o2.getName()) > 0) {
return 1;
} else {
return -1;
}
}
});
System.out.println("排序后");
for (UserB userB : userList) {
System.out.println(userB);
}
}
总结:
Comparatable | Comparator | |
---|---|---|
所在包 |
java.lang |
java.util |
使用场景 | 让集合元素自身具备比较性,让元素实现comparable接口,覆盖comparaeTo(T o)方法 | 当这个对象不支持自比较或者自比较函数不能满足你的要求 |
代码 |
Collections.sort(某个实现了Comparatable接口的对象集合) Collections.sort(userInfoList); |
Collections.sort(userList, new Comparator<UserB>() { ***** } |
上一篇: Matlab 均分圆形生成点
推荐阅读
-
Android 启动 Service(startservice和bindservice) 两种方式的区别
-
web服务器和应用服务器的区别是什么,简述两者的架构与工作原理
-
web服务器和应用服务器的区别是什么,简述两者的架构与工作原理
-
web服务器和应用服务器的区别,一分钟带你搞懂这两者的关联
-
web服务器和应用服务器的区别,一分钟带你搞懂这两者的关联
-
web服务器和应用服务器的区别,一文带你秒懂这两者的区别
-
锚文本和超链接的区别,五分钟让你搞懂这两者的使用方法
-
web服务器和应用服务器的区别,一文带你秒懂这两者的区别
-
锚文本和超链接的区别,五分钟让你搞懂这两者的使用方法
-
java 抽象类和接口的区别详细解析