Java中的Comparable<T>和Comparator<T>接口
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别)。
1) 在使用普通数组的时候,如果想对数据进行排序,可以调用java.util.Arrays.sort()。但要通过该方式对数组进行排序,还需要数组中的对象实现Comparable<T>接口。
package org.lyk.entities; public class Book implements Comparable<Book>
{
private String name;
private double price; public Book(String name,double price)
{
super();
this.name = name;
this.price = price;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public double getPrice()
{
return price;
} public void setPrice(double price)
{
this.price = price;
} @Override
public String toString()
{
return "Book [name=" + name + ", price=" + price + "]";
} @Override
public int compareTo(Book o)
{
if(this.price < o.price)
return -1;
else if(this.price > o.price)
return 1;
else
return 0;
} }
测试代码:
package org.lyk.main; import org.lyk.entities.*;
import org.lyk.interfaces.*; import java.math.*;
import java.sql.*;
import java.text.*;
import java.util.*; public class Main
{
public static void main(String[] args)
{
Book[] books = new Book[]
{
new Book("Java编程思想", 73.8),
new Book("Java从入门到精通", 40.7),
new Book("疯狂Java讲义(第3版 附光盘)", 91.3),
new Book("O'Reilly:Head First Java", 47.3),
new Book("Java Web整合开发王者归来", 78.8)
}; Arrays.sort(books); for(Book item : books)
{
System.out.println(item);
}
}
}
2)现在如果一个类已经开发完成,或者这个类由第三方提供,在这个类中没有实现Comparable<T>接口。此时我们已经不能修改Book类,那么要实现Book数组的排序,就必须借助另外一个Comparator<T>接口。
package org.lyk.entities; public class Book
{
private String name;
private double price; public Book(String name,double price)
{
super();
this.name = name;
this.price = price;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public double getPrice()
{
return price;
} public void setPrice(double price)
{
this.price = price;
} @Override
public String toString()
{
return "Book [name=" + name + ", price=" + price + "]";
}
}
实现Comparator<T>的BookComparator类。
package org.lyk.entities; import java.util.Comparator; public class BookComparator implements Comparator<Book>
{ @Override
public int compare(Book o1, Book o2)
{
if(o1.getPrice() < o2.getPrice())
return -1;
else if(o1.getPrice() > o2.getPrice())
return 1;
else
return 0;
}
}
测试代码:
package org.lyk.main; import org.lyk.entities.*;
import org.lyk.interfaces.*; import java.math.*;
import java.sql.*;
import java.text.*;
import java.util.*; public class Main
{
public static void main(String[] args)
{
Book[] books = new Book[]
{
new Book("Java编程思想", 73.8),
new Book("Java从入门到精通", 40.7),
new Book("疯狂Java讲义(第3版 附光盘)", 91.3),
new Book("O'Reilly:Head First Java", 47.3),
new Book("Java Web整合开发王者归来", 78.8)
}; Arrays.sort(books,new BookComparator()); for(Book item : books)
{
System.out.println(item);
}
}
}
小结:
一个类实现Comparable<T>接口,那么这个类本身就具有了被排序的功能。
一个类如果没有实现Comparable<T>接口,要使该类在数组中能排序,就要另外再写一个针对该类的排序类,新写的类必须实现Comparator<T>功能。
也就是说,一个是自己有比较功能,另一个是让第三方类实现比较功能。
Java中的Comparable<T>和Comparator<T>接口的更多相关文章
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator
Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...
- Java中的comparable接口和Comparator接口的区别
一.comparable和Comparator的区别 1.Comparable和Comparator都是用来实现集合中元素的比较.排序的. 2.Comparable是在类内部定义的方法实现的排序,位于 ...
- 来吧,一文彻底搞懂Java中的Comparable和Comparator
大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
1. Java中线程的创建有两种方式: (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...
- [转] Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- Java中的Enumeration、Iterable和Iterator接口详解
前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...
随机推荐
- 解决windows系统80端口被占用问题
在windows下部署web应用(80端口),启动时提示bind 80端口失败 检查端口占用: netstat -ano | findstr 发现System进程 (pid=4) 占用了端口 然而本机 ...
- Intent的详细解析以及用法
Intent的详细解析以及用法 Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...
- ORA-01013:用户请求取消当前的操作
ORA-01013:用户请求取消当前的操作 在测试一个通过ODBC连接ORACLE数据库的VB程序时,总是出现该错误,估计应该是数据量比较大,导致超时. 查到解决方法有如下四种 (选任意一种即可): ...
- 类型参数约束 : Controller where T : class,new()
这是类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class | T必须是一个类(class)类型,不能是结构( ...
- window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-ts-vc11-x86)整合
window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-t ...
- 【jmeter】测试报告优化<一>
具体问题如下: 1.Date report这里的时间没有正确显示出来 2.Summary里的字段Min Time和Max Time显示的是NaN,没有显示正确的时间. 本文主要解决上述两个问题,具体报 ...
- 【转】libvirt kvm 虚拟机上网 – Bridge桥接
libvirt kvm 虚拟机上网 – Bridge桥接 2013 年 7 月 3 日 / 东东东 / 暂无评论 目录 [hide] 1 Bridge桥接原理 2 在host机器配置桥接网络 2.1 ...
- 三. ServerSocket用法
一.构造ServerSocket 构造方法 (1)new ServerSocket( ) (2)new ServerSocket(int port,int backlog) (3)new Server ...
- FlashBuilder(FB/eclipse) 打开多个无效
FB也即Eclipse. 想要打开多个FB,只需要新建多个FB的快捷方式,然后在路径上面加上参数 -data "具体路径" 再打开即可. 如: "C:\Program F ...
- Chrome安装FlashPlayer Debug
首先: 在谷歌浏览器上打开chrome://plugins 找到 Adobe Flash Player 然后将谷歌自带的版本停用,如果已经安装了for Netscape版,则会显示另外一个版本.(建议 ...