在java中要实现自定义类的比较,提供了以下两个接口:

Comparable(内部排序) int compareTo(Object obj);返回值为int,默认升序排序
Comparator(外部排序) int compare(Object ob1,Object obj2);返回值为int,排序灵活


 java.lang.Comparable接口(内部比较器)java.lang
若一个类实现了Comparable(排序接口)接口,就意味着该类支持排序
存放该类的Collection或数组,可以直接通过Collection.sort()或着Arrays.sort进行排序 实现了Comparable接口的类可以直接存放在TreeSet或者TreeMap中
public int compareTo(T obj);
返回值的三种情况:
1.正数:当前对象大于目标对象
2.0
3.符输
import java.util.Set;
import java.util.TreeSet; //Person类的比较器(按照年龄升序)
class Test2 { public static void main(String[] args) {
Set<Person> set = new TreeSet<>();
set.add(new Person("张三",20));
set.add(new Person("李四",21));
set.add(new Person("李四",22));
System.out.println(set);
} }
class Person implements Comparable<Person> {
private String name;
private int age; public Person(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} public void setName(String name) {
this.name = name;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} public int compareTo(Person o) {
// if (this.age > o.age ) {
// return 1 ;
// }else if (this.age < o.age ){
// return -1 ;
// }else {
// return this.name.compareTo(o.name) ;
// }
// }
return o.getAge()-this.getAge(); }
}

 Comparator(1.2  java.util)外部比较器
Comparator(外部排序接口):若用控制某个自定义类的顺序而该类本身不支持排序(类没有实现Comparable接口)
我们可以建立一个该类的"比较器"来进行排序
比较器实现Comparator接口即可 "比较器:"实现了Comparator接口的类作为比较器,通过该比较器来进行类的排序
int compare(T o1,T o2)返回值与compareTo返回值完全一样
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet; //Person类的比较器(按照年龄升序)
class AscAgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1,Person o2){
return o2.getAge() - o1.getAge();
} public static void main(String[] args) {
Set<Person> set = new TreeSet<>(new AscAgeComparator());
set.add(new Person("张三",20));
set.add(new Person("李四",19));
System.out.println(set);
}
}
class Person {
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
 Comparable与Comparator相比比较方式已经个固定,不够灵活
实现了Comparator接口进行第三方排序--策略模式,此方法更加灵活,可以轻松改变 Comparable是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,是一个内部比较器(自己去和别人比)
Comparator接口是比较器接口,类本身不支持排序,专门由若干个第三方的比较器(实现了Comparator接口的类)来进行类的排序,
是一个外部比较器(策略模式) 重复元素的判断
TreeSet与TreeMap依靠Comparator或Comparable接口来区分重复元素 自定义类要想保存在TreeSet或者TreeMap中:

1.要么该类直接实现Comparable接口,覆写CompareTo方法

2.要么实现一个比较器传入TreeSet或者TreeMap来进行外部比较 而HashSet与HashMap并不依赖比较接口。此时要想区分自定义元素是否重复,需要同时覆写equals与hashCode方法来判定两个元素内容
是否相等 覆写equals方法原则:
1.自反性:对于任何非空引用值x,x.equals(x)都返回true 2.对称性:对于任何非空的x,y,当且仅当x.equals(y)返回true,y.equals(x)
也返回true 3.传递性:s对于任何非空的x,y,z,如果x.equals(y)返回true,y.equals(z)返回true返回true,那么x.equals(z)也返回true 4.一致性:对于任何非空的x,y,若x与y中属性没有改变,则多次调用x.equals(y)始终返回true或者false 5.非空性:对于任何非空引用x,x.equals()null一定返回false 先调用hashCode计算出对象hash码决定存放的桶
而后使用equals来比较元素是否相等,若相等,则不再放置元素;若equals返回false,则在相同桶之后,使用链表将若干元素链起来 Object提供的hashcode方法默认使用对象的地址进行hash 若两个对象equals方法返回true,他们的hashcode必然要相等
反过来,若两个对象的hashcode相等,equals不一定相等 当且仅当equals与hashcode方法均返回true,才认为两个对象真正相等 哈希表的意义:
为什么要分桶来存放元素?
为了优化查找次数而存在通过查找与之相同的哈希值,在对应的桶和链表里面查找所需要的元素 另外:String类天然实现了Comparable接口,所以天然具备可比较性,重写了Comparable接口中的int compareTo方法,比较的是字符串长度
他有两个compareTo方法,另一个是compareToIgnoreCase
Set接口和Map接口关系
Set实际上内部就是Map,保存的单个元素储存在map的key,不能有重复
其中的hashSet判断两个对象是否重复,判断依据是equals(判断两个对象地址是否相等)与hashCode 元素要想保存在TreeSet中,要么元素本身所在类实现Comparable,要么通过外部传入Comparator map中key不能重复,value可以重复,默认为空
hashCode取得任意一个对象的哈希码
equals比较两个对象是否相等
 

												

比较器Comparable和Comparator的更多相关文章

  1. 比较器comparable与comparator的使用

    在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...

  2. Java的比较器Comparable与Comparator

    在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...

  3. Java原来如此-比较器(Comparable、Comparator)

    有时候需要对Collection或者不为单一数字的Array进行比较,有两种方法,1是实现Comparable接口,2是实现Comparator接口. 1.ComParable接口 Comparabl ...

  4. 比较器 comparable与comparator用法

    comparable 接口 Comparable<T> 类型参数:T - 可以与此对象进行比较的那些对象的类型 public interface Comparable<T> 此 ...

  5. 小白养成记——Java比较器Comparable和Comparator

    一.使用情景 1.  调用Arrays.sort()方法或Collections.sort()方法对自定义类的对象排序 以Arrays.sort()为例.假定有如下自定义的Person类 1 publ ...

  6. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  7. comparable和comparator

    Comparable Comparable可以认为是一个内部比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,在compareTo方法中指定具体的比较方法. comp ...

  8. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

  9. java中Comparable和Comparator两种比较器的区别

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

随机推荐

  1. 【前端_js】javascript中数组的map()方法

    数组的map()方法用于遍历数组,每遍历一个元素就调用回调方法一次,并将回调函数的返回结果作为新数组的元素,被遍历的数组不会被改变. 语法:let newAarray = arr.map(functi ...

  2. docker私有仓库操作(搭建、运行、添加、删除)

    目录 运行私有仓库 TIPS: 上传 把镜像放入私有仓库 验证 查看 TIPS: 垃圾回收 问题排查 参考:https://yeasy.gitbooks.io/docker_practice/cont ...

  3. nginx 配置相关解析

    nginx模块处理流程一般是这样的: 客户端发送HTTP请求 –> Nginx基于配置文件中的位置选择一个合适的处理模块 ->(如果有)负载均衡模块选择一台后端服务器 –> 处理模块 ...

  4. 遇到的一个Buffer too small问题

    在ROI中输出图像时遇到 经调试后发现是driver.Create时设置的波段数大于实际写入的波段数导致的 这里xImgIn.m_nBands有204,但实际写入的数据的bands只有3,修改时忘了修 ...

  5. 使用acme.sh申请&自动续期LetsEncrypt免费SSL证书(转)

    一.简介 LetsEncrypt是一个免费.自动.开放的证书颁发机构.acme.sh 实现了 acme 协议, 可以从 LetsEncrypt 生成免费的证书. 本文介绍如何使用acme.sh来签发并 ...

  6. 【Android】【问题解决记录】Error obtaining UI hierarchy :Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

    在使用uiautomatorviewer时遇到两类Error obtaining UI hierarchy报错,分别是: Error while obtaining UI hierarchy XML ...

  7. 【servlet】Servlet快速入门&使用Eclipse发布web项目

    创建时间:6.15 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是ja ...

  8. Go如何使用数据库、缓存

    database/sql 接口 Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口database/sql,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要是按照 ...

  9. Unity 渲染教程(一):矩阵

    转载:http://gad.qq.com/program/translateview/7181958 创建立方体网格.· 支持缩放.位移和旋转. · 使用变换矩阵. · 创建简单的相机投影. 这是关于 ...

  10. python测试开发django-69.templates模板过滤器filter

    前言 templates 模板里面过滤器 filter 的作用是对变量的出来,比如小写转大写,替换一些特殊字符,对列表取值,排序等操作. 内置的过滤器有很多,本篇拿几个常用的过滤器做案例讲解下相关的功 ...