一.comparable和Comparator的区别

1、Comparable和Comparator都是用来实现集合中元素的比较、排序的。

2、Comparable是在类内部定义的方法实现的排序,位于java.lang下。

3、Comparator是在类外部实现的排序,位于java.util下。

4、实现Comparable接口需要覆盖compareTo方法,实现Comparator接口需要覆盖compare方法。

5、Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。

二.深度认识

首先Comparable这个接口是使用在你需要排序的元素类上的。

而Comparator不是使用在你需要排序的元素类上的,它需要实现一个子类对象,将子类对象传入可以排序的集合中(TreeSet)。

当你想去使用comparable接口时必须去修改源代码,因为他是建立在需要被排序的元素类上的。

那你要是想对String类进行你自己想要的排序怎么办呢?(举例子,不要抬杠)

首先你不能去修改源代码,第二String类是final类不能继承。

那么此时你就可以使用Comparator接口实现在类外的排序

三.实例

1.对元素类Node实现comparable接口

package com.cjm.lambda;

import java.util.Set;
import java.util.TreeSet;
/**
*
* @author 小明
*
*/
public class SetSortlambda {
public static void main(String[] args) {
Set<Node> set = new TreeSet<>();
set.add(new Node("zs",10));
set.add(new Node("zs1",110));
set.add(new Node("zs1",10));
set.add(new Node("zszx",100));
set.add(new Node("zzxs",10));
System.out.println(set);
}
}
/*
* 元素本生实现comparator接口
*/
class Node implements Comparable<Node> {
int num;
String str; public Node(String str,int num) {
this.str=str;
this.num = num;
} @Override
public int compareTo(Node o) {
if (this.str == null) {
return -1;
} else {
if (o.str == null) {
return 1;
} else {
if (this.str.length() < o.str.length()) {
return -1;
} else {
if (this.str.length() > o.str.length()) {
return 1;
} else {
if (this.num < o.num) {
return -1;
} else {
if (this.num > o.num) {
return 1;
} else {
return 0;
}
}
}
}
}
} } /* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return str+num;
} }

2.使用Comparator接口,实现一个Comparator接口的对象(采用内部类的方式)

package com.cjm.lambda;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet; /**
* Compararator接口实现排序
*
* @author 小明
*
*/ public class Text {
public static void main(String[] args) {
Set<Node> set = new TreeSet<>(new Comparator<Node>() { @Override
public int compare(Node node1, Node node2) {
if (node1.str.length() < node2.str.length()) {
return 1;
} else {
if (node1.str.length() > node2.str.length()) {
return -1;
} else {
if (node1.num < node2.num) {
return 1;
} else {
if (node1.num > node2.num) {
return -1;
} else {
return 0;
}
}
}
}
}
});
set.add(new Node("zs", 10));
set.add(new Node("zs1", 110));
set.add(new Node("zs1", 10));
set.add(new Node("zszx", 100));
set.add(new Node("zzxs", 10));
System.out.println(set);
}
}

Java中的comparable接口和Comparator接口的区别的更多相关文章

  1. Java中的Comparable<T>和Comparator<T>接口

    有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...

  2. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  3. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  4. Java:实现对象的比较 comparable接口和comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  5. java中Comparatable接口和Comparator接口的区别

    1.不同类型的排序规则 .自然排序是什么?   自然排序是一种升序排序.对于不同的数据类型,升序规则不一样:   BigDecimal BigInteger Byte Double Float Int ...

  6. Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

    Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...

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

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

  8. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

  9. Comparable接口与Comparator接口的比较————总结

    之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...

  10. Java中的集合(十三) 实现Map接口的Hashtable

    Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...

随机推荐

  1. Oracle12c版本中未归档隐藏参数

    In this post, I will give a list of all undocumented parameters in Oracle 12.1.0.1c. Here is a query ...

  2. 两个有序数组的中位数(第k大的数)

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...

  3. Qt Widgets——动作类与小部件菜单项

    本文主要涉及以下三个类: QAction ——QWidgetAction QActionGroup QAction可称为动作类,它一般可当作菜单中的项组成菜单,也可作为工具栏上的按钮,它主要由图标.文 ...

  4. kiss word memory post poly peri out ~p 4

    1● post p əust 在后面,邮件     2● peri 多   3● poly 周围,靠近  

  5. mac crontab时间断内随机时间执行定时任务

    首先需要了解crontab使用,这里不多,主要是时间断内随机时间: 然而crontab 并没有具体方法实现时间段内随机时间执行,我的办法如下: 这里测试一个例子: 执行一个数据存文件python脚本, ...

  6. hash与平衡二叉树的区别

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 https://blog.csdn.net/duan19920101/article/det ...

  7. 基于Quartz.NET 实现可中断的任务(转)

    Quartz.NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET 允许开发人员根据时间间隔(或天)来调度作业.它实现了作 ...

  8. NTT模板(无讲解)

    #include<bits/stdc++.h>//只是在虚数部分改了一下 using namespace std; typedef long long int ll; ; ; ; ; ll ...

  9. 锤子科技 Smartisan M1L 咖啡金 真皮背面 高配版 5.7

    http://www.smartisan.com/m1/#/os    快人一步的OS http://www.smartisan.com/shop/#/buyphone?c=coffee&v= ...

  10. 使用RxSwift 实现登录页面的条件绑定

    我们在使用MVC建构进行开发时,对登录页面用户名密码等进行的处理一般是这样的,点击登录按钮判断用户框以及密码框输入的合法性,用一堆if真是屎一般!或者用textfield的代理来进行响应其实也是屎一般 ...