java对象的4种比较方法
2017-09-25 22:09
239 查看
概述
在java中,存在4种对象(含基础数据类型)的比较方式:==、equals、compareTo和compare。以及两种比较策略:引用比较和值比较。具体如下表所示。比较 | 基本数据类型 | 对象 |
---|---|---|
==、!= | 值比较 | 引用比较。使用”==”进行对象引用比较有以下限制:比较引用是否为null;用于枚举比较时是值比较,因为每个枚举常量只有一个对象;检查两个引用是否指向同一个对象,通常对象的比较应该用equals |
equals | 无 | 比较值的相等性。所有类都继承了该方法,但要进行值比较需要对equals方法复写,来实现比较逻辑。未复写的该方法的行为同”==”,是引用比较。通常equals首先进行”==”判断,是同一个对象则可快速返回 |
compareTo | 无 | Comparable< T >的接口。比较值并返回1(大于)、0(等于)、小于(-1)。如果对象是具有自然顺序的或想要进行Collections.sort()或Arrays.sort(),可以实现Comparable接口。如String、Double、Interger等 |
compare | 无 | Comparator< T >的一个接口。比较两个对象的值。典型应用是将实现该接口的类作为工具类,传入如sort()之类的方法或用于排序的数据结构如TreeMap或TreeSet中进行对象排序。在下列场景中可能需要Comparator对象:多重比较,需要提供不同的排序方式。如要对一个具有name、ID、age、height的Person类进行排序,那么需要定义Comparator传入sort()方法;系统类为任意对象提供比较方法。如定义一个Comparator用于比较String的length;策略模式在需要将算法表现为一个对象的场景中实现策略模式,可将其作为参数或存储在数据结构中。如果类对象具有自然排序序列,则不需要该接口。 |
注意1:如果复写了equals()方法,也应该复写hashCode()方法。HashSet和HashMap之类的数据结构使用hashCode()来散列,如果不复写,在应用于这些数据结构时可能工作不正常。
注意2:一般情况下,如果a.equals(b)是true,那么a.compareTo(b) == 0也应该是true。一个例外是BigDecimal类,因为BigDecimal的equals是在value值和scale都相同才为true,而compareTo是value值相同scale不同也返回0。如:
BigDecimal bd = new BigDecimal(1.2, MathContext.DECIMAL32); BigDecimal bd2 = new BigDecimal(1.2, MathContext.DECIMAL64); bd.equals(bd2); // return false bd.compareTo(bd2); // return 0
代码示例
// 1. 值比较 int a = 5; int b = 5; int c = 6; a == b; // return true a == c; // return false // 2. equals比较 // MyClass未复写equals方法 class MyClass { private int myVirable; MyClass() {} MyClass(int virable) { this.myVirable = virable; } } MyClass obj1 = new MyClass(5); MyClass obj2 = new MyClass(5); MyClass obj3 = obj2; obj1.equals(obj2); // return false obj3.equals(obj1); // return true // MyClass复写equals方法 class MyClass { private int myVirable; MyClass() {} MyClass(int virable) { this.myVirable = virable; } @Override public boolean equals(Object obj) { if(obj instanceof MyClass) { MyClass o = (MyClass)obj; if (o.myVirable == this.myVirable) { return true; } } return false; } } MyClass obj1 = new MyClass(5); MyClass obj2 = new MyClass(5); obj1.equals(obj2); // return true // 3. compareTo比较 public class MyCompareClass implements Comparable<MyCompareClass> { private int code; MyCompareClass(int code) { this.code = code; } @Override public int compareTo(MyCompareClass o) { if(code > o.code) { return 1; } else if(code < o.code) { return -1; } else { return 0; } } } MyCompareClass comp1 = new MyCompareClass(7); MyCompareClass comp2 = new MyCompareClass(5); MyCompareClass comp3 = new MyCompareClass(9); MyCompareClass comp4 = new MyCompareClass(7); comp1.compareTo(comp2); // return 1 comp1.compareTo(comp3); // return -1 comp1.compareTo(comp4); // return 0 // 4. comapre比较 public class MyCompareClass { int code; MyCompareClass(int code) { this.code = code; } } // 实现比较器接口 class MyComparator implements Comparator<MyCompareClass>{ @Override public int compare(MyCompareClass o1, MyCompareClass o2) { if(o1.code > o2.code){ return 1; } else if(o1.code < o2.code){ return -1; } else { return 0; } } } MyCompareClass o1 = new MyCompareClass(7); MyCompareClass o2 = new MyCompareClass(5); MyCompareClass o3 = new MyCompareClass(9); List<MyCompareClass>list=new ArrayList<MyCompareClass>(); list.add(o1); list.add(o2); list.add(o3); Collections.sort(list, new MyComparator()); for(MyCompareClass e:list){ System.out.println(e.code); } // 输出为: // 5 // 7 // 9
另外在3.中类实现Comparable接口时,可直接使用Collections.sort(list进行排序。
参考:
http://www.cnblogs.com/CoolRandy/articles/3676695.html
相关文章推荐
- Java生成Boolean对象的三种方法之比较
- JAVA操作XML4种方法的比较
- java创建对象的4种方法
- java中compareTo和compare方法之比较,集合中对象的比较
- Java进阶:深入equals方法对象相等比较
- Java创建对象的4种方法
- 实现Java中对象比较的两个方法
- (转载)Java中如何遍历Map对象的4种方法
- java中string对象的”equal“方法和“==”运算符 与 c#中的比较
- Java中如何遍历Map对象的4种方法
- Java中如何遍历Map对象的4种方法
- Java 比较String对象的方法
- Java中如何遍历Map对象的4种方法
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- java比较自定义对象相等的方法
- Java中如何遍历Map对象的4种方法
- java编写比较对象相等equals方法
- Java中如何遍历Map对象的4种方法
- 比较两种php调用Java对象的方法
- Java中如何遍历Map对象的4种方法