【转】java ==、equals、compareTo、compare、sort在比较上的应用

来源:互联网 发布:linux内核态和用户态 编辑:程序博客网 时间:2024/05/28 15:28
关于java语言中的比较:

1、
        ==是运算符,equals、compareTo是方法。

2、
        ==运算符的结果和equals方法的返回值都是 boolean型,结果有true、false两个值,用于比较两者是否相等;
        comparaTo方法和
compare方法的返回值是int型,结果有大于、小于、等于三种值,用于给数据排序,负数表示小于、0表示相等、正数表示大于。

4、
        ==是比较地址(当操作数是封装类型时),
当操作数是基本数据类型时,比较两者的值;

5、
        equals是Object类中的方法,自定义类自动继承Object类,无需显式写出。
        
        Object中equals方法的实现是直接用==运算符比较,即比较两者的地址。
        public boolean equals(Object  obj) {
            return this == obj;
        }

        一般实际需求都是比较内容,而不是地址,所以当需要比较时,我们都会重写equals方法,在equals方法中可能又要用到hashCode方法。
        八大基本数据类型的封装类型均重写了equals方法:
 
        public boolean equals(Object  obj) {    // 以Integer 封装类型为例
            if ( obj instanceof Integer ){   //  用 instanceof判断是否是同一数据类型,否则不相等
                    return this.value==((Integer) obj ).intValue();    //  拆封,直接比较基本类型数据的值
                }
             return false; 

        }

 6、
        comparaTo方法是Comparable接口中的方法,
compare方法是Comparator接口中的方法。
        两个接口定义的主要目的是一样,都是为了实现排序:Collections.sort,只是
Comparable接口在类定义时就需实现,而如果类定义时没有考虑到排序问题,则需要用comparator接口扩展实现:

  1. public static <T extends Comparable<? super T>> void sort(List<T> list) {  
  2.     Object[] a = list.toArray();  
  3.     Arrays.sort(a);      
  4.     ListIterator<T> i = list.listIterator();  
  5.           for (int j=0; j<a.length; j++) {  
  6.                i.next();  
  7.                i.set((T)a[j]);  
  8.            }  
  9.  }
 
  1. public static <T> void sort(List<T> list,Comparator<? super T> c) {  
  2.     Object[] a = list.toArray();  
  3.     Arrays.sort(a,(Comparator)c);      
  4.     ListIterator<T> i = list.listIterator();  
  5.           for (int j=0; j<a.length; j++) {  
  6.                i.next();  
  7.                i.set((T)a[j]);  
  8.            }  
  9.  }
0 0