java lang(Comparable接口) 和java util(Comparator接口)分析比较

//Comparable 接口强行对实现它的每个类的对象进行整体排序。 -- 自然排序。类的compareTo称为自然比较方法。

public interface Comparable<T> {
    public int compareTo(T o);
}

  此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

  实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射(接口 java.util.SortedMap<K,V>)中的键或有序集合(接口 java.util.SortedSet<E>)中的元素,无需指定比较器(接口 java.util.Comparator<T>)。

compareTo 方法的返回值有三种情况:

  1. e1.compareTo(e2) > 0 即 e1 > e2
  2. e1.compareTo(e2) = 0 即 e1 = e2
  3. e1.compareTo(e2) < 0 即 e1 < e2

注意:

1.由于 null 不是一个类,也不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 的情况,即使 e.equals(null) 返回 false,compareTo 方法也应该主动抛出一个空指针异常 NullPointerException。

2.Comparable 实现类重写 compareTo 方法时一般要求 e1.compareTo(e2) == 0 的结果要和 e1.equals(e2) 一致。这样将来使用 SortedSet 等根据类的自然排序进行排序的集合容器时可以保证保存的数据的顺序和想象中一致。

接口实现的例子:

import java.util.ArrayList;
import java.util.Collections;

public class Car implements Comparable<Object>{
	public String name;
	public int price;

	public Car(String name, int price){
		this.name = name;
		this.price = price;
	}

	public String toString() {
		return this.name + ":" + this.price;
	}

	@Override
	public int compareTo(Object o) {
		if ( o instanceof Car) {
			Car  car = (Car)o;
			int result;

			result = this.price - car.price;
//			当car的price相同时,比较其name,按String的comparaTo()方法排序
			if (result == 0) {
				result = this.name.compareTo(car.name);
			}
			return result;
		}
		return 0;
	}

	public static void main(String[] args) {
		ArrayList<Car> all = new ArrayList<Car>();
		all.add(new Car("兰博基尼", 400));
		all.add(new Car("宝马", 100));
		all.add(new Car("奔驰", 95));
		all.add(new Car("法拉利", 300));

		System.out.println(all);
		Collections.sort(all);
		System.out.println(all);
	}

}

打印出:

[兰博基尼:400, 宝马:100, 奔驰:95, 法拉利:300]
[奔驰:95, 宝马:100, 法拉利:300, 兰博基尼:400]

Comparator 比较器接口(策略设计模式)

  我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么可以建立一个该类的比较器来排序,这个比较器只需要实现Comparator接口即可。

public interface Comparator<T> {
     int compare(T o1, T o2);
     boolean equals(Object obj);
}

使用方式主要分三步:

1.创建一个 Comparator 接口的实现类,并赋值给一个对象在 compare 方法中针对自定义类写排序规则

2.将 Comparator 对象作为参数传递给 排序类的某个方法

3.向排序类中添加 compare 方法中使用的自定义类

接口操作例子:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Car {
	public String name;
	public int price;

	public Car(String name, int price){
		this.name = name;
		this.price = price;
	}

	public String toString() {
		return this.name + ":" + this.price;
	}
	public static void main(String[] args) {
		ArrayList<Car> all = new ArrayList<Car>();
		all.add(new Car("兰博基尼", 400));
		all.add(new Car("宝马", 100));
		all.add(new Car("奔驰", 95));
		all.add(new Car("法拉利", 300));

		System.out.println(all);
		Collections.sort(all, new MyComparator());
		System.out.println(all);	

	}

}

class MyComparator implements Comparator<Car> {

	@Override
	public int compare(Car o1, Car o2) {
		// TODO Auto-generated method stub
		int result = o1.price - o2.price;
		if ( result != 0) {
			return result;
		} else {
			return o1.name.compareTo(o2.name);
		}
	}

}

打印出:

[兰博基尼:400, 宝马:100, 奔驰:95, 法拉利:300]
[奔驰:95, 宝马:100, 法拉利:300, 兰博基尼:400]

Comparable 和 Comparator比较

Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。
而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。

前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。

我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。

时间: 2024-12-25 05:21:08

java lang(Comparable接口) 和java util(Comparator接口)分析比较的相关文章

java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/QueuedThreadPool$1

1.错误描述 [WARNING] FAILED qtp1691065417{8<=8<=8/254,0}: java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/QueuedThreadPool$1 [WARNING] FAILED [email protected]: java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/QueuedThreadPool

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager 问题: 使用Springboot打包为war部署于Tomcat7中报错 java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.get

maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

本篇文章主要介绍了"maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener ",主要涉及到maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener 方面的内容,对于maven web 项目中启动报错jav

java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/DefaultClassFinder$InfoBuildingV

问题: 严重: Unable to read class [com.spml.action.AddUserAction] java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/DefaultClassFinder$InfoBuildingVisitor at com.opensymphony.xwork2.util.finder.DefaultClassFinder.readClassDef(DefaultClas

Spring Boot常见问题(二)Unable to start embedded container; nested exception is java.lang.NoSuchMethodError: org.apache.tomcat.util.scan.StandardJarScanner.setJarScanFilter(Lorg/apache/tomcat/JarScanFilter;

问题描述:通过Spring Boot官方提供的方式,写出如下HelloWorld代码. @Controller @EnableAutoConfiguration public class HelloWorld { @RequestMapping("/wu") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exce

Exceptionin thread &quot;main&quot; java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjav

在eclipse上运行hadoop报错:Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjav,这个问题折腾了我很久,后来找到方法解决. 描述一下:电脑是win8.1的64位操作系统,在机子上安装了redhat虚拟机,部署了hadoop环境,在win8的eclips

Caused by: java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.classloader.ReloadingClassLoader

今天学习到strusts2与spring的整合,把原来可以交给spring产生的东西都扔给了它,终于拜托了繁琐的代码,只专心于逻辑开发就OK了,现在连strusts的action都可以交给spring容器产生了! 在strusts2和spring整合的时候,必不可少的一个jar包就是struts2-spring-plugin.jar,但是需要注意的是,如果jar包的版本冲突也会报异常的,今天本博就遇到了这样一个问题. Unable to load configuration. - bean -

java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/TextUtils

java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/String;)Ljava/lang /Object;”异常,导致该异常的是jsonplugin的jar包与Struts2的jar包不匹配引起的. jsonplugin-0.33.jar     Struts 2 JSON Plugin 0.33 匹配 Struts 2.1.x Compatiblejsonplugin-0.32.ja

Maven项目Eclipse启动时报错: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

Eclipse中启动Maven项目时报如下错误: 严重: Error configuring application listener of class org.springframework.web.util.IntrospectorCleanupListener java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener at org.apache.catalina.lo

java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别

java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别 一.java.lang.System.arraycopy() 该方法的声明: /* @param src 源数组 * @param srcPos 源数组中的起始位置 * @param dest 目标数组 * @param destPos 目标数组中的起始位置 * @param length 需要被复制的元素个数 * @exception IndexOutOfBoundsExcep