有的时候在面试时会被问到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>接口的更多相关文章

  1. Java中的集合(十二) 实现Map接口的WeakHashMap

    Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...

  2. java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator

    Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...

  3. Java中的comparable接口和Comparator接口的区别

    一.comparable和Comparator的区别 1.Comparable和Comparator都是用来实现集合中元素的比较.排序的. 2.Comparable是在类内部定义的方法实现的排序,位于 ...

  4. 来吧,一文彻底搞懂Java中的Comparable和Comparator

    大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...

  5. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  6. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  7. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  8. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  9. Java中的Enumeration、Iterable和Iterator接口详解

    前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...

随机推荐

  1. 怎么用ABBYY创建属于自己的PDF

    怎么创建一份属于自己的PDF文档呢?由于PDF格式文件具有跨平台.支持超长文件.安全可靠性高等诸多优势,在日常办公学习中应用越来越广泛.而随着技术的发展,各种办公软件也对PDF提供越来越多的支持,但P ...

  2. 开放平台-web实现QQ第三方登录

    应用场景     web应用通过QQ登录授权实现第三方登录.   操作步骤     1  注册成为QQ互联平台开发者,http://connect.qq.com/     2  准备一个可访问的域名, ...

  3. asp.net 程序,单击按钮时 同时实现打开页面并处理值

    来源:http://blog.csdn.net/nvhaixx/article/details/12430757 1)在网页中添加用于处理的客户端事件: <script language=&qu ...

  4. python 字典访问的三种方法

    定义字典 dic = {'a':"hello",'b':"how",'c':"you"} 方法一: for key in dic: prin ...

  5. jquery技巧总结

    jquery技巧总结一.简介 1.1.概述随着WEB2.0及ajax思想在互联网上的快速发展传播,陆续出现了一些优秀的Js框架,其中比较著名的有Prototype.YUI.jQuery.mootool ...

  6. The connection to adb is down, and a severe error has occured.

    启动android模拟器时.有时会报The connection to adb is down, and a severe error has occured.的错误.在网友说在任务管理器上把所有ad ...

  7. windows证书地址

    C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys 用certutil -sto ...

  8. 【Redis】使用Redis Sentinel实现Redis HA

    阅读目录 1 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 18000 sent ...

  9. Redis简单使用方法说明

    安装 www.redis.io下载安装包tar zxvf redis.tar.gzcd redismakecd src && make install移动文件,便于管理:mkdir - ...

  10. Android的CursorLoader用法小结

    工作内容集中到Contact模块,这个应用查询数据的地方很多,其使用了CursorLoader这个工具大大简化了代码复杂度.Android自3.0提供了Loader机制,当时google的API只是简 ...