1. 两种比较接口分析
在 “ 集合框架 ” 中有两种比较接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有两个:
1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
2 Comparable 接口
public interface Comparable<T> {public int compareTo(T o);
}

java.lang. Comparable 接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。  
1 ) int compareTo(Object o): 比较当前实例对象与对象 o ,如果位于对象 o 之前,返回负值,如果两个对象在排序中位置相同,则返回 0 ,如果位于对象 o 后面,则返回正值。
2 )在 Java 2 SDK 版本 1.4 中有二十四个类实现 Comparable 接口。下表展示了 8 种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
排序
BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
按数字大小排序
Character
按 Unicode 值的数字大小排序
String
按字符串中字符 Unicode 值排序
利用 Comparable 接口创建自己的类的排序顺序,只是实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。
这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort 和Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。
下面设计一个有序的类 Person ,它实现 Comparable 接口,以年龄为第一关键字,姓名为第二关键字升序排序。
 1 Person.java
 2 package com.zj.sort.comparable;
 3
 4 public class Person implements Comparable<Person> {
 5     private int age ;
 6     private String name ;
 7
 8     public Person( int age, String name) {
 9        this . age = age;
10        this . name = name;
11     }
12
13     public int compareTo(Person person) {
14        int cop = age - person.getAge();
15        if (cop != 0)
16            return cop;
17        else
18            return name .compareTo(person. name );
19     }
20
21     public int getAge() {
22        return age ;
23     }
24
25     public String getName() {
26        return name ;
27     }
28
29     public int hashCode() {
30        int result = 17;
31        result = 37 * result + age ;
32        result = 37 * result + name .hashCode();
33        return result;
34     }
35
36     public boolean equals(Object o) {
37        if (!(o instanceof Person))
38            return false ;
39        Person person = (Person) o;
40        return ( age == person. age ) && ( name .equals(person. name ));
41     }
42
43     public String toString() {
44        return ( age + "{" + name + "}" );
45     }
46 }

2.1 测试 Arrays.sort ()方法
ArraysSortUnit.java
import java.util.Arrays;
import com.zj.compare.Person;public class ArraysSortUnit {public static void main(String[] args) {Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),new Person(30, "Mary" ), new Person(20, "Ada" ),new Person(40, "Walton" ), new Person(61, "Peter" ),new Person(20, "Bush" ) };System. out .println(Arrays.toString (ps));Arrays.sort (ps);System. out .println(Arrays.toString (ps));}
}

结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.2 测试 Collections.sort ()方法
CollctionsSortUnit.java
package com.zj.sort.comparable;
import java.util.Arrays;
import java.util.Collections;
import com.zj.compare.Person;public class CollctionsSortUnit {public static void main(String[] args) {Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),new Person(30, "Mary" ), new Person(20, "Ada" ),new Person(40, "Walton" ), new Person(61, "Peter" ),new Person(20, "Bush" ) };System. out .println(Arrays.toString (ps));Collections.sort (Arrays.asList (ps));System. out .println(Arrays.toString (ps));}
}
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.3 测试 TreeSet
TreeSetUnit.java
package com.zj.sort.comparable;
import java.util.TreeSet;
import com.zj.compare.Person;public class TreeSetUnit {public static void main(String[] args) {TreeSet<Person> set = new TreeSet<Person>();set.add( new Person(20, "Tom" ));set.add( new Person(20, "Jeff" ));set.add( new Person(30, "Mary" ));set.add( new Person(20, "Ada" ));set.add( new Person(40, "Walton" ));set.add( new Person(61, "Peter" ));set.add( new Person(20, "Bush" ));System. out .println(set);}
}
结果:
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.4 测试 TreeMap
TreeMapUnit.java
package com.zj.sort.comparable;
import java.util.TreeMap;
import com.zj.compare.Person;public class TreeMapUnit {public static void main(String[] args) {TreeMap<Person, String> map = new TreeMap<Person, String>();map.put( new Person(20, "Tom" ), "Tom" );map.put( new Person(20, "Jeff" ), "Jeff" );map.put( new Person(30, "Mary" ), "Mary" );map.put( new Person(20, "Ada" ), "Ada" );map.put( new Person(40, "Walton" ), "Walton" );map.put( new Person(61, "Peter" ), "Peter" );map.put( new Person(20, "Bush" ), "Bush" );System. out .println(map);}
}
结果:
{20{Ada}=Ada, 20{Bush}=Bush, 20{Jeff}=Jeff, 20{Tom}=Tom, 30{Mary}=Mary, 40{Walton}=Walton, 61{Peter}=Peter}

zz java compare 接口相关推荐

  1. java compare接口_javaCompare接口及泛型

    一.Compare接口 要对一个类的两个对象进行排序可以调用sort方法,但是如果一个类想要自己定义排序的方式就需要实现Compare接口.java.lang.Compare,具体的见API文档.只有 ...

  2. Java Comparator接口

    Java Comparator接口 代码演示 演示1. package Practice;import java.util.ArrayList;import java.util.Collections ...

  3. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  4. java多线程查询_利用Java函数式接口处理多线程查询

    Java函数式接口 有且只有一个抽象方法的接口被称为函数式接口. @FunctionalInterface注解: 该注解可用于一个接口的定义上, 一旦使用该注解来定义接口, 编译器将会强制检查该接口是 ...

  5. java滥用接口_吐槽一下项目中的代码坏味道:滥用java常量

    我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...

  6. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...

  7. java类接口的区别_【Java基础】java接口和类的区别-瑶瑶吖的回答

    基本语法区别 Java中接口和抽象类的定义语法分别为interface与abstract关键字. 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为 ...

  8. java 实现接口后重写方法报错

    java 实现接口后重写方法报错 java 实现接口后重写方法报错 The method contextDestroyed(ServletContextEvent) of type InitListe ...

  9. Java 利用接口实现回调

    在 Java 支持方法指针之前,Java 接口不能提供一种实现回调的好方法.如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧.  熟悉 MS-Windows 和 X Window ...

  10. java一个接口执行结束释放内存_java的灵魂--JVM虚拟机

    JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM体系结构 1.类加载器 负责加载class文件,class文件在文件开头有特定的文件标示, 并且ClassLoader只负责class文件的 ...

最新文章

  1. Python 爬取图片链接并且解析
  2. python中是干嘛的-学 Python 都用来干嘛的?
  3. BZOJ-1880-Elaxia的路线-SDOI2009-SPFA+拓扑排序
  4. cisco 交换机vlan-trunk的配置详解及应用实例:
  5. springboot工程的热部署
  6. php 邮箱开发教程,php开发中表单验证邮箱及URL的教程
  7. MacOS Apple M1 安装ARM架构的JDK及动态切换版本
  8. 一文了解Docker核心概念和安装配置
  9. 怎么将短连接修改为长连接_回音壁怎么选?Redmi这个还不错
  10. xpath以某个字符开始_XPATH简单使用
  11. linux 隐藏显示终端光标
  12. 最全面详细讲解Oracle入门(新手必看)
  13. 网吧服务器ip地址修改,BXP服务器下的网吧ip地址怎么更改
  14. android sim卡pin,如何设置手机的SIM卡的PIN码?
  15. uniapp 跳转到商品详情页
  16. 从零开始- Android刷机指南一
  17. 学人工智能以后去哪里工作?学AI可以做什么?
  18. 苹果新专利:用AR眼镜来控制iPhone屏幕输出,保护隐私
  19. 如何理解信息隐藏和局部化?
  20. 「kd指标」kd指标原理

热门文章

  1. paip.提升用户体验------c++ 拖曳使用总结..
  2. 锻造恒生O45:致广大而尽精微
  3. Julia : 正则表达式
  4. 达观数据:Tornado原理浅析及应用场景探讨
  5. Julia: Array的确很强大
  6. 阿里云高级架构师张然:混合云开放网络生态的探索与实践
  7. 云栖回顾|龙蜥论坛圆桌环节都有哪些精彩观点?
  8. 杰克·韦尔奇的101条经典语录
  9. 毕设题目:Matlab优化电价
  10. 【通信】基于matlab GUI循环码编译码器【含Matlab源码 692期】