在浏览 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。 甚至在文档中也要明确两者的区别。
分享到:
相关推荐
所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。 2.实现什么方法 int ...
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
关于Object类中的equals()方法与Comparable接口中的compareTo()方法之间有何种关联,之前还真没考虑过。通过java.net看到此文之后,收获了一点儿新知识,希望大家也能如此。 方法equals()与Comparable接口中的...
1. ==、equals、compareTo的关系 3. Comparable接口自然排序 4. comparator定制排序 5. 重写equals方法的标准
Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、...Comparable接口、equals()方法、hashCode()方法
(2)TwoTuple, T2>必须实现Comparable接口 (3)TwoTuple, T2>必须覆盖equals方法和toString方法
(2)TwoTuple, T2>必须实现Comparable接口 (3)TwoTuple, T2>必须覆盖equals方法和toString方法
(2)TwoTuple, T2>必须实现Comparable接口 (3)TwoTuple, T2>必须覆盖equals方法和toString方法
(2)TwoTuple, T2>必须实现Comparable接口 (3)TwoTuple, T2>必须覆盖equals方法和toString方法
是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 ...
·玩转集合框架迭代器和HashCode和Equals重新排序 实战 ·实战teratori迭代器和自定义Comparable:排序接口 ·玩转ava操作文件File类常用操作 ·案例实战IO流Input、Output Stream流 ·详细常见Object、Math、String...
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学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 ...
提供一个toString、一个equals 和一个hashCode。 确保车牌可以保存在 OutputStream 中。 实现 Comparable 接口。 DIV 创建一个枚举 DIV。 将枚举放在包 be.vdab.vehicles.div 中。 这个枚举是一个单例,意味着...
底层哈希表,基于hashCode的equals的比较方式,线程不安全,存取速度快。 SortedSet 标记: interface TreeSet 标记: class 实现comparable接口,元素是以二叉树的形式存放的。线程不安全 CopyOnWriteArraySet 标记:...
Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...
1. 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}...
进程与程序的区别 168 JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行...