Java中的comparable接口和Comparator接口的区别
一.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接口的区别的更多相关文章
- Java中的Comparable<T>和Comparator<T>接口
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- java中Comparatable接口和Comparator接口的区别
1.不同类型的排序规则 .自然排序是什么? 自然排序是一种升序排序.对于不同的数据类型,升序规则不一样: BigDecimal BigInteger Byte Double Float Int ...
- Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...
- 来吧,一文彻底搞懂Java中的Comparable和Comparator
大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...
- Java中的集合(十一) 实现Map接口的TreeMap
Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...
- Comparable接口与Comparator接口的比较————总结
之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...
- Java中的集合(十三) 实现Map接口的Hashtable
Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...
随机推荐
- NOSQL -- mongoDB的了解与安装(Wins10)
NOSQL -- mongoDB的了解与安装 首先看看什么是nosql: 我的理解:非关系型数据库,大多是以map形式存储,map<key,value>,适合存储,查询.redis也是no ...
- MYSQL--服务器的安装
MYSQL--服务器的安装 学java已经好久了,但是还是没有学会安装数据库,这次重装系统后自己学了学,昨天晚上刚刚装好,卸载了,再装一次,就想着把它笔记下来.要不又忘了.. 1.删除你的服务.在cm ...
- php 日志模块源码解析
php日志模块设计 Monolog 是PHP的一个日志类库解析 整体介绍:monolog日志模块遵循 PSR3 的接口规范.主要有日志格式类接口(格式化日志信息),处理类接口(写日志的驱动,通过扩展写 ...
- Tomcat压缩传输设置
1.配置位于server.xml文件中的Connector节点下,具体参数如下: 参数 默认值 参数说明 compression off 是否开启压缩传输 compressableMimeType t ...
- 使用AndroidStudio运行eclipse开发的app项目
由于AS和eclipse开发的APP项目格式不同,所以直接用AS运行eclipse项目是行不通的. 下面给大家讲解一下如何在AS上成功运行eclipse项目 首先有这么个eclipse项目文件夹 然后 ...
- AI工具(星形工具)(光晕工具)(移动复制)(柜子绘制)5.12
星形工具;基本操作与矩形一样,拖动星形工具绘制,点击键盘上箭头增加星形的角数.下箭头减少星形的角数. 选择星形工具在屏幕单击,出现星形对话框,可以设置半径1半径2,角点数.图中的星形就可以用星形工具绘 ...
- python学习 面向对象高级编程
---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...
- leetcode python 001
给定一个数组,和一个数字target,要求返回和为target的两个数组成员的下标. import numpy as npimport time #### 构造题目 , x数组大小x=100000l1 ...
- jdk8-lanbda方法引用和构造引用
1.方法引用概念及实例 1.对象实例方法 语法格式: 对象::实例方法名称 注意点: 实例方法必须和被实现的接口中定义的方法的参数列表和返回值一致.一般适合于一个方法就实现了的. 2.类::静态方法 ...
- Java的file类
package IO; import java.io.File; import java.io.IOException; public class FileDemo01 { public static ...