Comparable接口位于:java.lang包中。

Comparable接口:
  1. 实现了这个接口的类,会被强制进行自然排序。
    问题又来了:那什么是自然排序呢?
      自然排序:就是字典序排序,不分大小写。例如:a、A都排在b、B之前。
    做个简单的测试吧:
    现在有个需求,需要让你把用户进行自然排序。So,亲爱的小伙伴们,这应该
    怎么做呢?
    思路:创建一个用户类(User),且此类实现了Comparable接口,然后进行测试。
    记住了呦:
      Collections.sort();可以对列表进行排序。
      Arrays.sort();可以对数组进行排序哦。
    嘿嘿,Let's do a test!

  下面是User类的代码:

 package test;

public class User implements Comparable<User>{

	private String name;
private Integer age; public User(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
} /*
* 先比较name,
* 大于,返回1
* 等于,接着比较age
* age:大于,返回1
* 等于,返回0
* 小于,返回-1
* 小于:返回-1
* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(User o) {
int flag = 0;
flag = this.getName().compareTo(o.getName());
if(flag == 0) {
flag = this.getAge().compareTo(o.getAge());
return flag;
}else {
return flag;
}
} }

  下面是做测试的代码UserTest:

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; public class UserTest { public static void print(List<User> list) {
for(User u : list) {
System.out.println(u);
}
} public static void print(User[] array) {
for(int i=0; i<array.length; i++) {
System.out.println(array[i]);
}
} public static void main(String[] args) { List<User> users = new ArrayList<User>();
users.add(new User("a",12));
users.add(new User("C",25));
users.add(new User("B",12));
users.add(new User("A",15));
users.add(new User("b",19));
users.add(new User("c",17));
users.add(new User("a",22)); System.out.println("排序前:");
print(users); System.out.println();
System.out.println(); System.out.println("排序后:");
Collections.sort(users);
print(users); User[] users2 = new User[]{
new User("a",12),
new User("C",25),
new User("B",12),
new User("A",15),
new User("b",19),
new User("c",17),
new User("a",22)
}; System.out.println("排序前:");
print(users2); System.out.println();
System.out.println(); System.out.println("排序后:");
Arrays.sort(users2);
print(users2);
} }

  小伙伴们想一下,程序运行的结果应该是什么?

  哈哈,结果应该是:

   A 15
   B 12
   C 25
   a 12
   a 22
   b 19
   c 17

 
可能有的小伙伴想的是:
   a 12
   A 15
   a 22
   B 12
   b 19
   c 17
   C 25
 
嘿嘿,上面的结果,也是我第一次考虑出的结果,程序运行后得到并不一样怎么办?哪里有错呢?看了几遍,感觉命名没错哈?!No, 还是有错,并不是代码有错哦,而是你出错了!
嘿嘿,请小伙伴仔细看User中的compareTo方法:
    在compareTo方法中的第二行:flag = this.getName().compareTo(o.getName()); 这句话就是罪魁祸首,还真是可恶啊!!!该死,嘻嘻!
    有没有小伙伴看出什么的呢?
    好啦,flag = this.getName().compareTo(o.getName());这句话中也有compareTo方法,在api中找到String的compareTo(String)方法,小编发现了一个重大新闻、重大新闻、重大新闻!!!
    重要的事情说三遍:String的compareTo(String)方法中有这个说明:
      按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
      按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
      按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
    这意味着什么呢?意味着:字符串的排序虽是字典顺序排序,但是大小写有分别。A的Unicode值在a的Unicode前面,所以A排在a的前面咯。
    所以这个问题就解决了。
    String的compareTo(String)方法的下面,还有一个让小编看了特兴奋的方法!!!是什么呢?哈哈,是compareToIgnoreCase(String)方法啦。
    从方法的名字就能理解:使用这个方法进行比较字符串时,忽略、忽略、忽略大小写,哈哈!!!
    当然,这只是小编的猜想,具体是什么作用?还是得看实际的结果对吧!测试的结果如下:
User [name=a, age=12]
User [name=A, age=15]
User [name=a, age=22]
User [name=B, age=12]
User [name=b, age=19]
User [name=c, age=17]
User [name=C, age=25]

  是不是和之前的猜想一样呢!哈哈,今天Comparable接口就到这里了,ByeBye!!!

Comparable接口与Comparator接口的比较————Comparable接口详解的更多相关文章

  1. Mybatis中接口和对应的mapper文件位置配置详解

    Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...

  2. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  3. 【高速接口-RapidIO】4、Xilinx RapidIO核详解

    一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25G ...

  4. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  5. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

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

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

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

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

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

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

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

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

  10. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

随机推荐

  1. 【6.28校内test】T1 Jelly的难题1

    Jelly的难题[题目链接] 废话一句:今天中考出成绩,感觉大家考的都超级棒,不管怎样,愿大家成为最好的自己. 好了废话完了,下面是题解部分: SOLUTION: 首先你可能发生的,是看不懂题: 定睛 ...

  2. js知识点——2之navigator

    navigator(领航者) 1.appCodeName(返回浏览器的代码名) var x= navigator; document.write("CodeName:"+x.app ...

  3. phpstorm 不能选择 php language level

    最近需要更改phpstorm中的php language level发现更改不了 解决方法是在PHP 下面的Composer中勾选了同步 composer php版本的原因 取消勾选,点击应用就可以了

  4. JavaSE--面向对象

    面向对象(Object Oriented) 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位, ...

  5. .net core 调用webservice

    原文:.net core 调用webservice 1.点击core项目添加链接的服务 2.键入对应的webservice地址,下载对应的代理服务 4.由于.net core  代理类只支持异步方法  ...

  6. IDEA的快捷方式

    一,IDEA的快捷方式1,F8单步执行 2,F9运行调试 3,CTRL +鼠标左键=进入查看定义 4,CTRL+alt +鼠标左键=查看实现 5,Shift+F6重命名 6,alt +intsert= ...

  7. NTFS,FAT32和exFAT文件系统的区别

    NTFS,FAT32和exFAT文件系统的区别 本文所有资料来源于网络,仅做个人学习使用,如有侵权,请联系删除 1.什么是文件系统 文件系统是系统对文件的存放排列方式,不同格式的文件系统关系到数据是如 ...

  8. node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法

    换个电脑,重新搭配环境的时候遇到的问题.node.js已经在官网进行下载安装了,但是VScode里面显示不是内部的命令,也不是可运行的程序 但是在cmd控制台还是能查到的 借助网上的方法进行了测试和调 ...

  9. “\xef\xbb\xbf”爬坑记录

    今天早上帮同事写了脚本,大致功能:从文本中读取域名,加密存储成按照自己定义的格式.但是一个简单的代码居然出现了错误.初始的代码如下: # coding:utf-8 import hashlib imp ...

  10. 查看 php 编译参数

    /app/php/bin/php -i|grep configure 范例 4: [root@VM-001 ~]# /app/php/bin/php -i|grep configure Configu ...