合同equals与问候null,如下所示:
对于任何非空引用值
x,x.equals(null)应该return false.
这是相当奇特的,因为如果o1 != null和o2 == null,那么我们有:
o1.equals(o2) // returns false
o2.equals(o1) // throws NullPointerException
Run Code Online (Sandbox Code Playgroud)
这o2.equals(o1) throws NullPointerException是一件好事,因为它提醒我们程序员错误.然而,如果出于各种原因我们只是将其切换到了那个错误就不会被捕获o1.equals(o2),而这只会"默默地失败".
所以问题是:
o1.equals(o2)不应该return false投掷而不是一个好主意NullPointerException?anyObject.equals(null)总是扔掉,那会NullPointerException不是一个坏主意?Comparable相反,这就是Comparable合同所说的:
请注意,这
null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException偶数e.equals(null)返回false.
如果NullPointerException适合compareTo,为什么不适合equals?
注意:这是关于null的Comparable和Comparator合同的衍生产品
这段代码在Eclipse(20090920-1017)中编译并运行良好
import java.util.*;
public class SortNull {
static <T extends Comparable<? super T>>
Comparator<T> nullComparableComparator() {
return new Comparator<T>() {
@Override public int compare(T el1, T el2) {
return
el1 == null ? -1 :
el2 == null ? +1 :
el1.compareTo(el2);
}
};
}
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>(
Arrays.asList(3, 2, 1, null, null, 0)
);
Comparator<Integer> numbersComp = nullComparableComparator();
Collections.sort(numbers, numbersComp);
System.out.println(numbers);
// "[null, null, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个物体的Arraylist.这些对象具有属性或数据类型 - 'String'.我需要按字符串对Arraylist进行排序.怎么做到这一点?
如果我有一个我想要排序的元素列表,Java提供了两种方法来解决这个问题.
例如,假设我有一个Movie对象列表,我想按标题对它们进行排序.
我可以这样做的一种方法是通过调用静态java.util.Collections.sort()方法的单参数版本,并将我的电影列表作为单个参数.所以我会调用Collections.sort(myMovieList).为了使其工作,必须声明Movie类以实现java.lang.Comparable接口,并且必须在此类中实现所需的方法compareTo().
另一种排序方法是使用影片列表和java.util.Comparator对象作为参数调用静态java.util.Collections.sort()方法的双参数版本.我会调用Collections.sort(myMovieList,titleComparator).在这种情况下,Movie类不会实现Comparable接口.相反,在构建和维护影片列表本身的主类中,我将创建一个实现java.util.Comparator接口的内部类,并实现一个必需的方法compare().然后我将创建此类的实例并调用sort()的双参数版本.第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序.在上面的例子中,
我的问题是,为什么麻烦学习两种方式在Java中进行排序,当Collections.sort()的双参数版本执行第一个单参数版本所做的所有事情时,还有一个额外的好处就是能够对列表的元素进行排序基于几个不同的标准?在编码时必须记住这一点.你有一个基本机制,用Java来排序列表来了解.
查看以下代码:
@Override
public int compareTo(final Intersection o) {
if (o == null)
return 0;
double distance = t;
double distance2 = o.t;
if (distance == distance2)
return 0;
return distance2 > distance ? -1 : 1;
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好,但是在两个不同的条件场合返回0的事实确实让我感到有些困扰.如果我不动不过的变量赋值distance和distance2顶端,我的IDE警告我说,
if (o == null)
return 0;
Run Code Online (Sandbox Code Playgroud)
那将是'死'代码.如果是这种情况,在这种情况下甚至应该检查null吗?
我的意思是:
@Override
public int compareTo(final Intersection o) {
double distance = t;
double distance2 = o.t;
if (o == null)
return 0;
if (distance == distance2)
return 0;
return distance2 > …Run Code Online (Sandbox Code Playgroud) 我想根据其键值plz对地图进行排序,请参阅下面的代码
public static void main(String[] args) {
SortedMap map = new TreeMap();
// Add some elements:
map.put("2", "Two");
map.put("1", "One");
map.put("5", "Five");
map.put("4", "Four");
map.put("3", "Three");
map.put("10", "Ten");
map.put("12", "Twelve");
map.put("7", "Seven");
map.put("9", "Nine");
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println("key : " + key + " value :" + map.get(key));
}
}
Result Should come below
key : 1 value :One
key : 2 value :Two
key : 3 value :Three
key : 4 …Run Code Online (Sandbox Code Playgroud) java ×6
sorting ×2
arraylist ×1
collections ×1
comparable ×1
comparator ×1
equals ×1
generics ×1
null ×1
string ×1