java比较:Comparable和Comparator

    xiaoxiao2025-02-14  12

    前言

    java中如果2个对象需要进行比较(对于某个成员对象的比较),可以有2种方式,实现接口Comparable和Comparator。它们之间还有区别。

    Comparable接口

    源码如下:

    public interface Comparable<T> { public int compareTo(T o); }

    这个接口主要是实现自身对象与其他对象的比较。只需要实现这个接口,就可以直接采取CompareTo进行对象的比较,内部实现具体字段的比较即可。 String就实现了此接口,源码如下:

    public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }

    Comparator接口

    源码如下:

    public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }

    这个比较可以实现2个对象之间的比较,想对于Comparable来说,就很独立了。所比较的类无需实现接口,由其他类实现接口,调用方法,将比较对象传递进去进行比较即可。同时还能灵活控制比较类型。如下:

    public class Compare implements Comparator<User> { private String type; public Compare(String type){ this.type = type; } public int compare(User user1, User user2) { if (type.equals("id")){ //TODO }else if (type.equals("name")){ //TODO } return 0; } }

    根据传递的不同参数,决定不同对象之间比较哪些属性即可。

    场景

    1.自定义详细的排序,采取Comparator即可。可调用Collections.sort()、Arrays.sort()方法。 2.TreeMap构造参数可传递Comparator。 其余随意。

    注: 当我们需要对中文等排序时,可结合刚刚的排序方法。如下所示,可比较出中文的先后顺序。

    String title1 = "北京; String title2 = "上海"; int title = Collator.getInstance(Locale.CHINA).compare(title1, title2);

    详细方法可参考其他文章: http://www.hollischuang.com/archives/1292

    转载请注明原文地址: https://ju.6miu.com/read-1296425.html
    最新回复(0)