`

equals() 与 Comparable

 
阅读更多

在浏览 Javadoc 时,Java 开发人员常常会遇到 SortedSet 类型(它在 JDK 中唯一的实现是 TreeSet)。 因为 SortedSet 是 java.util 包中唯一提供某种排序行为的 Collection,所以开发人员通常直接使用它而不会仔细地研究它。 清单 4 展示了:

清单 4. SortedSet,我很高兴找到了它!

import java.util.*;

public class UsingSortedSet {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
            new Person("Ted", "Neward", 39),
            new Person("Ron", "Reynolds", 39),
            new Person("Charlotte", "Neward", 38),
            new Person("Matthew", "McCullough", 18)
        );
        
        SortedSet ss = new TreeSet(new Comparator<Person>() {
            public int compare(Person lhs, Person rhs) {
                return lhs.getLastName().compareTo(rhs.getLastName());
            }
        });
        
        ss.addAll(perons);
        System.out.println(ss);
    }
}

使用上述代码一段时间后,可能会发现这个 Set 的核心特性之一:它不允许重复。 该特性在 Set Javadoc 中进行了介绍。 Set 是不包含重复元素的集合。 更准确地说,set 不包含成对的 e1 和 e2 元素,因此如果 e1.equals(e2) ,那么最多包含一个 null 元素。

但实际上似乎并非如此 — 尽管 清单 4 中没有相等的 Person 对象(根据 Person 的 equals() 实现), 但在输出时只有三个对象出现在 TreeSet 中。

与 set 的有状态本质相反,TreeSet 要求对象直接实现 Comparable 或者在构造时传入 Comparator,它不使用 equals() 比较对象; 它使用 Comparator/Comparable 的 compare 或 compareTo 方法。

因此存储在 Set 中的对象有两种方式确定相等性:大家常用的 equals() 方法和 Comparable/Comparator 方法,采用哪种方法取决于上下文。

更糟的是,简单的声明两者相等还不够,因为以排序为目的的比较不同于以相等性为目的的比较: 可以想象一下按姓排序时两个 Person 相等,但是其内容却并不相同。

一定要明白 equals()Comparable.compareTo() 两者之间的不同 — 实现 Set 时会返回 0。 甚至在文档中也要明确两者的区别。

分享到:
评论

相关推荐

    java,Comparable接口实例

    所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。 2.实现什么方法 int ...

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    “一致性相等”的陷阱

    关于Object类中的equals()方法与Comparable接口中的compareTo()方法之间有何种关联,之前还真没考虑过。通过java.net看到此文之后,收获了一点儿新知识,希望大家也能如此。  方法equals()与Comparable接口中的...

    实现元素比较1

    1. ==、equals、compareTo的关系 3. Comparable接口自然排序 4. comparator定制排序 5. 重写equals方法的标准

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、...Comparable接口、equals()方法、hashCode()方法

    U201814655-CS1806-杨雨鑫-第19章编程题1

    (2)TwoTuple, T2&gt;必须实现Comparable接口 (3)TwoTuple, T2&gt;必须覆盖equals方法和toString方法

    第19章编程题 1

    (2)TwoTuple, T2&gt;必须实现Comparable接口 (3)TwoTuple, T2&gt;必须覆盖equals方法和toString方法

    第19章编程题+1

    (2)TwoTuple, T2&gt;必须实现Comparable接口 (3)TwoTuple, T2&gt;必须覆盖equals方法和toString方法

    第19章编程题提交1

    (2)TwoTuple, T2&gt;必须实现Comparable接口 (3)TwoTuple, T2&gt;必须覆盖equals方法和toString方法

    java集合知识-map、set等

    是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 ...

    新版java教程 全套javase零基础到高级视频教程小白自学编程下载地址

    ·玩转集合框架迭代器和HashCode和Equals重新排序 实战 ·实战teratori迭代器和自定义Comparable:排序接口 ·玩转ava操作文件File类常用操作 ·案例实战IO流Input、Output Stream流 ·详细常见Object、Math、String...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 14: Consider implementing Comparable 4 Classes and Interfaces Item 15: Minimize the accessibility of classes and members Item 16: In public classes, use accessor methods, not public fields Item ...

    autoworld:汽车世界

    提供一个toString、一个equals 和一个hashCode。 确保车牌可以保存在 OutputStream 中。 实现 Comparable 接口。 DIV 创建一个枚举 DIV。 将枚举放在包 be.vdab.vehicles.div 中。 这个枚举是一个单例,意味着...

    Java容器.xmind

    底层哈希表,基于hashCode的equals的比较方式,线程不安全,存取速度快。 SortedSet 标记: interface TreeSet 标记: class 实现comparable接口,元素是以二叉树的形式存放的。线程不安全 CopyOnWriteArraySet 标记:...

    Java服务器端开发面试.doc

    Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

    java常用工具类的使用

    1. Java工具概述 很多人初学程序时,总是在想,那么多的算法该怎么写呀?那么多的数据结构都不熟悉,该怎么实现呀?总是担心英语不好程序学不精通,数学不好写程序无法达到巅峰。学的程序越多,不懂的知识越多。...

    Java学习笔记-个人整理的

    {4.9}Comparable与Comparator}{86}{section.4.9} {4.9.1}Comparable}{86}{subsection.4.9.1} {4.9.2}Comparator}{87}{subsection.4.9.2} {4.10}包装类}{87}{section.4.10} {4.11}集合的复制}{88}{section.4.11}...

    JAVA基础课程讲义

    进程与程序的区别 168 JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行...

Global site tag (gtag.js) - Google Analytics