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的Comparator和Comparable
Comparable和Comparator接口都可用作普通意义上对象间的比大小,但两个接口在实例化方面的用法不尽相同,接下来我们就来详细对比Java中的Comparable排序接口和Comparator比较器接口
主要介绍了Java Comparable 和 Comparator 的详解及区别的相关资料,Comparable 自然排序和Comparator 定制排序的实例,需要的朋友可以参考下
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java...
第5 版 清华大学出版社 “SCJP学习指南” 人民邮电出版社 “Java 编程思想” 第3版 机械工业出版社 教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 ...
CollectionDemo ##关于学习 ###多用 Google,少用某度;...TreeSetDemo1.java 讲解 TreeSet 的一些知识和用法实例程序 ##参考资料 ###大部分来自 StackOverFlow Java : Comparable vs Comparator What
在Java程序设计过程中,对应日期和时间的格式化,还有一个简单的格式化方式,就是java.text.SimpleDateFormat,该类中用字符串指定日期和时间的格式,字符串中的字符称为模式字符,模式字符区分大小写。常见的模式...
Comparator的区别 List Map 高并发与多线程 JVM 类加载器 JVM 监控 性能调优 常用参数 调优案例 设计模式 框架 Spring 基础 实例 源码分析 Spring MVC Spring Boot MyBatis 基础 MyBatis Plus 数据库 MySQL 前端 Vue...
{4.9}Comparable与Comparator}{86}{section.4.9} {4.9.1}Comparable}{86}{subsection.4.9.1} {4.9.2}Comparator}{87}{subsection.4.9.2} {4.10}包装类}{87}{section.4.10} {4.11}集合的复制}{88}{section.4.11}...