`

Java中Comparable和Comparator区别(简单实例)

阅读更多

1、相同点:都是用来实现集合中元素大小的比较。


2、不同点: 


    1)Comparable采用的是内部比较法(本身有默认的比较规则),而Comparator属于外部比较法(一个外部的比较器,开发人员可以实现定义的比较规则)。 
    2)采用Comparable比较时,集合中的元素必须实现Comparable接口(比如String和Integer),使用的比较方法是:int compareTo(T o); 
    3)采用Comparator比较时,使用的比较方法是:int compare(T o1 ,T o2); 
    4)Comparable位于java.lang包中(无需导入),而Comparator位于java.util包中(需要导入)。

3、实例一:String类型元素的比较(采用Comparable)

 

package com.linwei;

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

public class StringComparable {

	public static void main(String[] args) {
		//String类已实现Comparable接口
		//public final class String implements java.io.Serializable, Comparable<String>, CharSequence(){}
		List<String> sList =new ArrayList<String>();
		sList.add("aa");
		sList.add("bb");
		sList.add("dd");
		sList.add("cc");
		sList.add("gg");
		sList.add("ee");
		
		System.out.println("排序前:"+sList);
		// 使用Collections中的sort(List<T> list)方法实现排序功能
		// public static <T extends Comparable<? super T>> void sort(List<T> list){}
		/* 
		 * extends :在泛型中表示继承或实现
		 * T extends Comparable:说明T类型必须实现Comparable接口
		 *  <? super T>  :说明List中泛型的类型必须为T类型或其子类型
		 * */
		Collections.sort(sList);
		System.out.println("排序后:"+sList);
	}
}

执行输出:
排序前:[aa, bb, dd, cc, gg, ee]
排序后:[aa, bb, cc, dd, ee, gg]

 

4、实例二:对自定义对象进行排序(使用Comparable实现)

    需求场景:实现KTV歌曲的排序功能(根据歌曲名称)

 

    代码如下:  

package com.linwei;

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

public class KTVComparable {
	private ArrayList<Song>  songList=new ArrayList<Song>();
	
	public ArrayList<Song> getSongList() {
		return songList;
	}

	public void setSongList(ArrayList<Song> songList) {
		this.songList = songList;
	}

	public void go(){
		System.out.println("排序前:"+songList);
		Collections.sort(songList);
		System.out.println("排序后:"+songList);
	}
	
	public static void main(String[] args) {
		KTVComparable box=new KTVComparable();
		Song song =new Song("aaa","xxx");
		Song song2 =new Song("bbb","yyy");
		Song song3 =new Song("ccc","zzz");
		box.getSongList().add(song2);
		box.getSongList().add(song);
		box.getSongList().add(song3);
		
		box.go();
	}
}

/**
 *  待排序的类必须实现Comparable接口
 */
class Song implements Comparable<Song> {
	private String title;    // 歌名
	private String artist;  // 歌手

	public Song(String title,String artist) {
		super();
		this.title = title;
		this.artist = artist;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String toString() {
		return title;
	}

	public String getArtist() {
		return artist;
	}

	public void setArtist(String artist) {
		this.artist = artist;
	}
	
	//覆写Comparable接口中的对象比较方法,比较当前对象与传入对象的大小
	public int compareTo(Song s) {
		//根据歌名进行排序(采用默认的排序方法)
		return title.compareTo(s.getTitle());
	}
}

 

5、实例三:对自定义对象进行排序(使用Comparator实现)

    需求场景:实现KTV歌曲的排序功能(根据歌曲名称及歌手名称进行排序)

    代码如下:

   

package com.linwei;

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

public class KTVComparator {
	private ArrayList<Song2>  songList=new ArrayList<Song2>();
	
	public ArrayList<Song2> getSongList() {
		return songList;
	}

	public void setSongList(ArrayList<Song2> songList) {
		this.songList = songList;
	}

	public void go(){
		System.out.println("排序前:"+songList);
		// 需要传入自定义的比较器对象
		Collections.sort(songList,new SongCompare());
		System.out.println("排序后:"+songList);
	}
	
	public static void main(String[] args) {
		KTVComparator box=new KTVComparator();
		Song2 song =new Song2("aaa","xxx");
		Song2 song2 =new Song2("bbb","yyy");
		Song2 song3 =new Song2("bbb","ddd");
		Song2 song4 =new Song2("eee","nnn");
		box.getSongList().add(song2);
		box.getSongList().add(song);
		box.getSongList().add(song3);
		box.getSongList().add(song4);
		
		box.go();
	}
}

/**
 * 无需实现任何特定的排序接口
 */
class Song2 {
	private String title;
	private String artist;

	public Song2(String title,String artist) {
		super();
		this.title = title;
		this.artist = artist;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

        public String getArtist() {
		return artist;
	}

	public void setArtist(String artist) {
		this.artist = artist;
	}

	@Override
	public String toString() {
		return "Song2 [title=" + title + ", artist=" + artist + "]";
	}
}

/**
 *  自定义的比较器(实现Comparator接口)
 */
class SongCompare implements Comparator<Song2>{
	// 覆写Comparator中的比较方法
	//先按歌名排序,如果 歌名相同,则再按歌手名排序
	public int compare(Song2 s1, Song2 s2) { 
		if(s1.getTitle().compareTo(s2.getTitle()) <0){
			return -1 ;
		}else if(s1.getTitle().compareTo(s2.getTitle()) >0){
			return 1 ;
		}else if(s1.getTitle().compareTo(s2.getTitle()) ==0){ 
			return s1.getArtist().compareTo(s2.getArtist());
		}else{
			return 0;
		}
	}
}

执行输出:
排序前:[Song2 [title=bbb, artist=yyy], Song2 [title=aaa, artist=xxx], Song2 [title=bbb, artist=ddd], Song2 [title=eee, artist=nnn]]

排序后:[Song2 [title=aaa, artist=xxx], Song2 [title=bbb, artist=ddd], Song2 [title=bbb, artist=yyy], Song2 [title=eee, artist=nnn]]

 

6、题外补充:关于Collections中的sort()方法的两个重载版本

 

    1) public static <T extends Comparable<? super T>> void sort(List<T> list) {} :代表由List元素上的compareTo()方法来决定顺序,因此该元素必须实现Comparable接口。

    2)public static <T> void sort(List<T> list, Comparator<? super T> c) {}:代表不会调用到List元素的compareTo()方法,而会使用Comparator中的compare()方法,因此该元素无需实现Comparable接口。

 

分享到:
评论

相关推荐

    java中Comparable和Comparator的区别

    在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...

    Java中Comparable和Comparator的区别

    在Java编程语言中,Comparable和Comparator接口是两个非常重要的组件,它们主要用来进行对象的比较和排序。了解它们之间的区别对于提升代码的可维护性和灵活性至关重要。 Comparable接口来源于java.lang包,它定义...

    Java中Comparable和Comparator 2种实现方式学习

    在Java编程语言中,排序是常见的操作,而`Comparable`和`Comparator`接口则是实现对象排序的两种主要方式。这篇文章将深入探讨这两种实现方式及其在实际编程中的应用。 首先,`Comparable`接口位于`java.lang`包下...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

    java 中Comparable与Comparator详解与比较

    在Java编程语言中,Comparable和Comparator接口用于比较对象的顺序,尤其在进行排序操作时非常关键。两者虽然目的相似,但使用方式和应用场景有所区别。 Comparable接口定义在`java.lang`包中,它只有一个方法`...

    java的Comparator和Comparable.docx

    在 Java 中,Comparator 和 Comparable 是两个非常重要的接口,它们用于对象的排序操作。这两个接口都是在 java.util 包中定义的,主要用于定制排序规则。 **一、Comparator 接口** Comparator 接口允许我们创建...

    Comparable与Comparator的区别Java开

    在Java编程语言中,`Comparable`接口和`Comparator`接口是两种重要的排序机制,它们用于对集合中的对象进行比较和排序。理解它们的区别对于任何Java开发者来说都是至关重要的。 首先,`Comparable`接口位于`java....

    Comparable接口和Comparator使用示例

    在本文中,我们将通过实例代码,详细介绍 Comparable 接口和 Comparator 的使用示例。 Comparable 接口 Comparable 接口是 Java 中的一个接口,它提供了一个通用的比较机制,允许对象之间进行比较。实现 ...

    对比Java中的Comparable排序接口和Comparator比较器接口

    在Java编程语言中,Comparable和Comparator接口用于对对象进行比较和排序。这两个接口在很多情况下都能派上用场,但它们的应用场景和实现方式有所不同。 首先,Comparable接口是排序接口,意味着一个类如果实现了...

    Java中实现Comparable和Comparator对象比较

    在实际使用时,我们可以将Comparator实例传递给Collections.sort()或Arrays.sort()方法,实现自定义排序: ```java LinkedList&lt;Person&gt; al = new LinkedList(); // 添加Person对象... Collections.sort(al, new ...

    浅析Java中comparator接口与Comparable接口的区别

    在Java编程语言中,Comparable和Comparator接口都用于比较对象,但它们之间存在一些关键区别,这对于理解和优化代码的可扩展性至关重要。 首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T...

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    Comparable接口和Comparator接口的比较

    Comparable接口和Comparator接口是Java中用于排序的关键组件,它们在数据结构如数组、集合和映射的排序过程中扮演着重要角色。接下来我们将深入探讨这两个接口的特性、用途以及它们之间的区别。 1. Comparable接口...

    class MyComparator implements Comparator类的算法 java

    在Java编程语言中,`Comparator`接口是一个非常重要的工具,它允许我们自定义对象的排序规则。`Comparator`可以用于任何实现了`Comparable`接口的类,或者当我们想要对不支持自然排序的对象进行排序时。标题提到的`...

    493.491.JAVA基础教程_常用类-使用Comparator实现定制排序(493).rar

    在Java编程语言中,排序是数据...通过这个教程,你应该能够理解如何利用`Comparator`在Java中实现自定义排序,这在处理复杂数据结构和业务逻辑时尤其有用。学习并熟练运用`Comparator`能够提高代码的灵活性和可读性。

    java中LinkedList任意排序实例

    在Java编程中,LinkedList是一个非常重要的数据结构,它实现了List接口,允许我们在列表的任何位置进行插入和删除操作。LinkedList内部使用双向链表实现,因此它的遍历速度比ArrayList快,但随机访问性能较差。本...

    JAVA_类集操作实例

    本教程将深入探讨Java中的类集操作实例,帮助你更好地理解和运用这些概念。 一、集合框架概述 Java集合框架是一组接口和类的集合,它为在Java程序中存储、管理和操作对象提供了统一的方法。主要接口包括List、Set和...

    Java泛型实例

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时就能进行类型检查...

Global site tag (gtag.js) - Google Analytics