【Java】java中的compareTo和compare的区别
compare
从这里可以看出,compare是Comparator接口中的一个类,再看一下源代码中的解释
Compares its two arguments for order. Returns a negative integer,
zero, or a positive integer as the first argument is less than, equal
to, or greater than the second
如果第一个参数小于第二个参数,就返回一个负数,如果等于就返回0,如果大于就返回一个正数。
再看compareTo方法
首先,他是Comparable接口中的一个方法,
然后String类继承了Comparable接口,并实现了comparteTo方法
来看具体方法的实现:
- public int compareTo(String anotherString) {
- int len1 = value.length;
- int len2 = anotherString.value.length;
- int lim = Math.min(len1, len2);
- char v1[] = value;
- char v2[] = anotherString.value;
- int k = 0;
- while (k < lim) {
- char c1 = v1[k];
- char c2 = v2[k];
- if (c1 != c2) {
- return c1 - c2;
- }
- k++;
- }
- return len1 - len2;
- }
让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:
- class Student implements Comparable<Student>{
- private String name;
- private int age;
- private float score;
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
- public String toString()
- {
- return name+"\t\t"+age+"\t\t"+score;
- }
- @Override
- public int compareTo(Student o) {
- // TODO Auto-generated method stub
- if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
- return -1;//由高到低排序
- else if(this.score<o.score)
- return 1;
- else{
- if(this.age>o.age)
- return 1;//由低到高排序
- else if(this.age<o.age)
- return -1;
- else
- return 0;
- }
- }
- }
- public class ComparableDemo01 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Student stu[]={new Student("zhangsan",20,90.0f),
- new Student("lisi",22,90.0f),
- new Student("wangwu",20,99.0f),
- new Student("sunliu",22,100.0f)};
- java.util.Arrays.sort(stu);
- for(Student s:stu)
- {
- System.out.println(s);
- }
- }
- }
结果
但是在设计类的时候,往往没有考虑到让类实现Comparable接口,那么我们就需要用到另外的一个比较器接口Comparator。
从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。
新建3个类
Student.java
- package map;
- public class Student {
- private String name;
- private int age;
- private float score;
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public float getScore() {
- return score;
- }
- public void setScore(float score) {
- this.score = score;
- }
- @Override
- public String toString() {
- return name + "\t\t" + age + "\t\t" + score;
- }
- }
StudentComparator.java
- package map;
- import java.util.Comparator;
- public class StudentComparator implements Comparator<Student> {
- public int compare(Student o1, Student o2) {
- if (o1.getScore() > o2.getScore())
- return -1;
- else if (o1.getScore() < o2.getScore())
- return 1;
- else {
- if (o1.getAge() > o2.getAge())
- return 1;
- else if (o1.getAge() < o2.getAge())
- return -1;
- else
- return 0;
- }
- }
- }
测试类
- public class Test {
- public static void main(String[] args) {
- Student stu[] = { new Student("zhangsan", 20, 90.0f),
- new Student("lisi", 22, 90.0f),
- new Student("wangwu", 20, 99.0f),
- new Student("sunliu", 22, 100.0f) };
- java.util.Arrays.sort(stu, new StudentComparator());
- for (Student s : stu) {
- System.out.println(s);
- }
- }
- }
结果跟上面的一样。
【Java】java中的compareTo和compare的区别的更多相关文章
- Java中“==”、“compareTo()”和“equals()”的区别
在比较两个对象或者数据大小的时候,经常会用到==.compareTo()和equals(),尤其是在接入了Comparable接口后重写compareTo方法等场景,所以我们来理一下这三个的区别. 1 ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- Java线程中run和start方法的区别
http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法 ...
- Java Web 中 过滤器与拦截器的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- Java -- Thread中start和run方法的区别
一.认识Thread的 start() 和 run() 1.start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发 ...
- JAVA多线程中start方法与run方法区别
start()方法告诉jvm该线程准备运行,jvm通过调用任务的run()方法执行任务. 一个任务类必须实现Runnable接口,而任务必须从线程运行. 实现Runnable接口后必须重写run()方 ...
- Java框架中Struts和Struts2框架的区别
struts1 与 struts2 的区别:1.都是 MVC 的 WEB 框架,2 struts1的老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架 ...
- Java集合类中的Iterator和ListIterator的区别
注意:内容来自网络他人文章! 最近看到集合类,知道凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合:(Iterato ...
- java nio中,HeapByteBuffer与DirectByteBuffer的区别
HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...
随机推荐
- etcd使用经历
etcd是一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现.etcd与zookeeper相比算是轻量级系统,两者的一致性协议也一样,etcd的raft比zookeeper的pax ...
- BroadcastReceiver用法
动态注册广播接收器 1.创建一个Receiver继承BroadcastReceiver,并重写onReceiver() 2.在Activity的OnCreate()中添加广播接收器想要接收的actio ...
- mysql索引之八:myisam压缩(前缀压缩)索引
myisam使用前缀压缩来减少索引的大小,从而让更多的索引可以放入内存中,默认只压缩字符串,但通过参数配置也可以对整数做压缩,myisam压缩每个索引块的方法是,先完全保存索引块中的第一个值,然后将其 ...
- Docker -- resolve "join node timeout" error
在worker节点机器上通过docker swarm join 到 manger node时,报Timeout错误,如下: Error response from daemon: Timeout wa ...
- 如何在 Internet Explorer 11中开启 WebGL
原文地址:http://www.hiwebgl.com/?p=1210 国外开发者Francois Remy在泄露版Windows Blue附带的Internet Explorer 11中发现,Web ...
- 关于datatable对象的用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- Java面向对象-String类
1,实例化String对象 有两种方式,我们直接看代码: package com.java1234.chap03.sec08; public class Demo1 { public static v ...
- Spring AOP基于注解的“零配置”方式实现
为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar.除此之外,Spring AOP还需要依赖一个a ...
- leetcode421
public class Solution { public int FindMaximumXOR(int[] nums) { , mask = ; ; i >= ; i--) { mask = ...
- 最长回文子串(Mirrored String II)
Note: this is a harder version of Mirrored string I. The gorillas have recently discovered that the ...