美文网首页
Effective Java 第12条: 考虑实现Compara

Effective Java 第12条: 考虑实现Compara

作者: linyk3 | 来源:发表于2019-02-11 17:03 被阅读0次

    Object 对象中并没有声明 compareTo 方法. comparaTo 是 Comparable 接口中唯一的方法.

    类实现了Comparable接口,就表明它的实例具有内在的排序关系.

    对实现了Comparable 接口的对象数组进行排序很简单:

    Arrays.sort(a)
    

    去掉命令行参数列表中重复参数,并按照字母顺序打印:(String 实现了Comparable 接口):

    public class WordList {
        public staitc void mian(String[] args){
              Set<String> s = new TreeSet<String>();
              Collections.addAll(s, args);
              System.out.println(s);
        }
    }
    

    事实上,Java平台类库中的所有值类都实现了Comparable接口.

    Comparable 接口:

    public interface Comparable<T> {
        int comparaTo(T t);
    }
    

    comparaTo 方法的通用约定与equals方法的类似:
    将这个对象与指定的对象进行比较.
    如果该对象小于,等于或大于指定对象的时候,分别返回一个负整数,0或正整数.
    如果由于指定对象的类型而无法与该对象进行比较,则抛出ClassCastException异常.

    依赖于比较关系的类:

    • 有序集合类:TreeSet, TreeMap
    • 工具类: Collections, Arrays
      它们内部包含有搜索和排序算法.

    BigDecimal 的comparaTo方法与equals方法不一致:

    public class ComparaTo_equals {
        public static void main(String[] args) {
            BigDecimal bd1 = new BigDecimal("1.0");
            BigDecimal bd2 = new BigDecimal("1.00");
            Set hs = new HashSet<BigDecimal>();
            Set ts = new TreeSet<BigDecimal>();
            hs.add(bd1);
            hs.add(bd2);
            System.out.println(hs);   //[1.0, 1.00]  HashSet使用 BigDecimal 的equals来判断是否相等
            ts.add(bd1);
            ts.add(bd2);
            System.out.println(ts);    //[1.0]           TreeSet使用 BigDecimal 的compareTo来判断是否相等
        }
    }
    

    实现Comparable接口中的compareTo 方法:

    public class CaseInsensitiveString implements Comparable<CaseInsensitiveString>{
        private String s;
        public int compareTo(CaseInsensitiveString cis) {
            return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);
        }
        ... // Remainder omitted
        
    }
    

    相关文章

      网友评论

          本文标题:Effective Java 第12条: 考虑实现Compara

          本文链接:https://www.haomeiwen.com/subject/mubqeqtx.html