Java中Comparable和Comparator有什么区别和适用场景?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1336个文字,预计阅读时间需要6分钟。
目录 + 1. Comparable + 2. Comparator + 3. Comparable与Comparator的区别
1.Comparable是java.lang包中的一个排序接口。
2.只需一个类实现了Comparable接口,就可以表示该类支持排序。
3.实现了Comparable接口的类,直接输出了这个接口。
目录 1.Comparable 2.Comparator 3.Comparable和Comparator的区别 Comparable1. Comparable是java.lang包中的一个排序接口。
2. 只要一个类实现了这个接口就可以意味着这个类支持排序。
3.实现了这个类的接口的列表或者数组可以可以使用Collections.sort或Arrays.sort进行排序。
4.该接口的定义:
1 public interface Comparable<T> 2 { 3 public int compareTo(T o); 4 }
T表示可以与这个对象进行比较的那些对象的类型。
这个方法只有一个coompareTo接口。实现这个接口的类必须要重写这个方法。
比较的规则:
- 如果该对象和指定比较的对象相等,那么返回0。
- 如果该对象比指定比较的对象大,那么返回正数。
- 如果该对象比指定比较的对象小,返回负数。
实例:
实现Comparable的类:
class Person implements Comparable<Person>{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } /** * 重新的compareTo方法。 * @param person 用于指定的比较的对象。 * @returns 如果当前对象的年龄和指定对象的年龄相等则返回0,如果当前对象的年龄大于指定对象 * 的年龄则返回正数。如果当前对象的年龄比指定对象的年龄小,则返回负数。 */ @Override public int compareTo(Person person) { return this.age - person.age; } }
note:这里为了演示,没有进行封装。
进行比较演示:
import java.util.Arrays; public class Test { public static void main(String[] args) { // 创建一个Person数组。 Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)}; // 排序之前 System.out.print("排序之前:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } // 排序之后 Arrays.sort(persons); System.out.println("排序之后:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } } }
结果:
Comparator1.Comparator是java.util中的一个比较的接口。
2. 如果我们想要控制某个类的次序,而这个类并没有继承Comparable接口,那么我们就可以使用Comparator接口。
3. 比较的规则:大致和上面的规则相同,不过也有不同的地方,详情请看下面的代码。
4.源代码:
package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 使用步骤
- 首先创意一个类实现Comparatro接口。note:这个类为你要比较的类的比较类。eg:如果你要想要比较Person对象,那么不要让Person实现这个接口,而是创建一个新的类叫做:PersonComparator,使用这个类实现Comparator。
- 比较时,传递比较器即可。
实例:
要比较的类class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } 该类的比较类
class PersonComparator implements Comparator<Person> { /** * 用来比较两个对象的年龄。 * @param p1 用来比较的第一个对象。 * @param p2 用力比较的第二个对象。 * @return 如果两个对象相等,则返回零。如果第一个对象大于第二个对象,则返回正数。如果第二个对象大于第一个对象,则返回负数。 */ @Override public int compare(Person p1, Person p2) { return p1.age - p2.age; } }
比较演示:
import java.util.Comparator;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 创建一个Person数组。
Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};
// 排序之前
System.out.print("排序之前:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
// 排序之后
// 将比较器作为参数传入。
Arrays.sort(persons, new PersonComparator());
System.out.println("排序之后:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
}
}
也可以使用匿名数组:
import java.util.Comparator; import java.util.Arrays; public class Test { public static void main(String[] args) { // 创建一个Person数组。 Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)}; // 排序之前 System.out.print("排序之前:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } // 排序之后 // 将比较器作为参数传入。 Arrays.sort(persons, new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.age - p2.age; } }); System.out.println("排序之后:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } } }
效果:
1.两者不在一个包。Comparable在java.lang中,而Comparator在java.util包中。
2.实现Comparable的类通常是一个我们要经常使用的类。比如:java中的String类等等。需要修改源代码。而Comparator可以在不同修改源代码的情况下,来完成比较。从了保护了代码。
两个方法各有优劣。如果你的类需要经常使用比较的操作,那么可以考虑让这个了实现Comparable接口。如果你偶尔使用比较的操作,那么可以考虑使用Comparator。
注意:作者只是一个自学java的小白,如果文章有任何错误的地方,望各位编程大佬进行指正,谢谢。
本文共计1336个文字,预计阅读时间需要6分钟。
目录 + 1. Comparable + 2. Comparator + 3. Comparable与Comparator的区别
1.Comparable是java.lang包中的一个排序接口。
2.只需一个类实现了Comparable接口,就可以表示该类支持排序。
3.实现了Comparable接口的类,直接输出了这个接口。
目录 1.Comparable 2.Comparator 3.Comparable和Comparator的区别 Comparable1. Comparable是java.lang包中的一个排序接口。
2. 只要一个类实现了这个接口就可以意味着这个类支持排序。
3.实现了这个类的接口的列表或者数组可以可以使用Collections.sort或Arrays.sort进行排序。
4.该接口的定义:
1 public interface Comparable<T> 2 { 3 public int compareTo(T o); 4 }
T表示可以与这个对象进行比较的那些对象的类型。
这个方法只有一个coompareTo接口。实现这个接口的类必须要重写这个方法。
比较的规则:
- 如果该对象和指定比较的对象相等,那么返回0。
- 如果该对象比指定比较的对象大,那么返回正数。
- 如果该对象比指定比较的对象小,返回负数。
实例:
实现Comparable的类:
class Person implements Comparable<Person>{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } /** * 重新的compareTo方法。 * @param person 用于指定的比较的对象。 * @returns 如果当前对象的年龄和指定对象的年龄相等则返回0,如果当前对象的年龄大于指定对象 * 的年龄则返回正数。如果当前对象的年龄比指定对象的年龄小,则返回负数。 */ @Override public int compareTo(Person person) { return this.age - person.age; } }
note:这里为了演示,没有进行封装。
进行比较演示:
import java.util.Arrays; public class Test { public static void main(String[] args) { // 创建一个Person数组。 Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)}; // 排序之前 System.out.print("排序之前:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } // 排序之后 Arrays.sort(persons); System.out.println("排序之后:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } } }
结果:
Comparator1.Comparator是java.util中的一个比较的接口。
2. 如果我们想要控制某个类的次序,而这个类并没有继承Comparable接口,那么我们就可以使用Comparator接口。
3. 比较的规则:大致和上面的规则相同,不过也有不同的地方,详情请看下面的代码。
4.源代码:
package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 使用步骤
- 首先创意一个类实现Comparatro接口。note:这个类为你要比较的类的比较类。eg:如果你要想要比较Person对象,那么不要让Person实现这个接口,而是创建一个新的类叫做:PersonComparator,使用这个类实现Comparator。
- 比较时,传递比较器即可。
实例:
要比较的类class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } 该类的比较类
class PersonComparator implements Comparator<Person> { /** * 用来比较两个对象的年龄。 * @param p1 用来比较的第一个对象。 * @param p2 用力比较的第二个对象。 * @return 如果两个对象相等,则返回零。如果第一个对象大于第二个对象,则返回正数。如果第二个对象大于第一个对象,则返回负数。 */ @Override public int compare(Person p1, Person p2) { return p1.age - p2.age; } }
比较演示:
import java.util.Comparator;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 创建一个Person数组。
Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};
// 排序之前
System.out.print("排序之前:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
// 排序之后
// 将比较器作为参数传入。
Arrays.sort(persons, new PersonComparator());
System.out.println("排序之后:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
}
}
也可以使用匿名数组:
import java.util.Comparator; import java.util.Arrays; public class Test { public static void main(String[] args) { // 创建一个Person数组。 Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)}; // 排序之前 System.out.print("排序之前:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } // 排序之后 // 将比较器作为参数传入。 Arrays.sort(persons, new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.age - p2.age; } }); System.out.println("排序之后:"); for (Person p : persons) { System.out.print("name:" + p.name + ", age:" + p.age + " "); } } }
效果:
1.两者不在一个包。Comparable在java.lang中,而Comparator在java.util包中。
2.实现Comparable的类通常是一个我们要经常使用的类。比如:java中的String类等等。需要修改源代码。而Comparator可以在不同修改源代码的情况下,来完成比较。从了保护了代码。
两个方法各有优劣。如果你的类需要经常使用比较的操作,那么可以考虑让这个了实现Comparable接口。如果你偶尔使用比较的操作,那么可以考虑使用Comparator。
注意:作者只是一个自学java的小白,如果文章有任何错误的地方,望各位编程大佬进行指正,谢谢。

