`
zy19982004
  • 浏览: 661864 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

容器学习九:Comparable & Comparator

 
阅读更多

一.前言

     本系列文章以研究源码为主,源码原理和设计次之,应用最弱。因为现在能读懂源码,要搞清楚设计和原理尚需火候,至于应用网上大把大把的有,读懂了源码应用也就是小事了。

 

二. Comparable & Comparator

package java.lang;

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

 

package java.util;

//一般情况,x.equals(y)<======>compare(x, y)==0,但不是必须的
//x,y对象在物理是毫无关系的(除非x,y是同一对象)
//为了逻辑上的相等,我们才重写euqals方法;为了排序,我们才重写compare方法
//所以x.equals(y)和compare(x, y)的充分必要条件完全是逻辑上的概念,由使用者自己决定
//你可以让这种充分必要条件不成立,只要你能保证你代码是正常的。
public interface Comparator<T> {
    int compare(T o1, T o2);
    //重写object.equals方法
    boolean equals(Object obj);
}
 

三.什么时候使用Comparable & Comparator

  1. 当两个对象需要比较的时候,使用Comparable & Comparator。
  2. 比较的两个对象可以是基本类型包装对象,也可以是除此之外的其它对象。
  3. 需要进行对象比较的场合,排序:
    1. Collections.sort(List<T>),Arrays.sort(Object[]);
    2. TreeMap,插入数据时根据二叉树的规则,确定插入数据的位置。当然检索数据就一样了。

 

四.TreeMap插入数据源码

public V put(K key, V value) {
        ......
        //comparator是初始化TreeMap指定的比较器
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                //如果指定了比较器,就用此比较器比较两个对象。此时会有一个专门的比较器来比较两个对象。
                cmp = cpr.compare(key, t.key);
                //根据比较的结果-1,0,1,来确定插入位置
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                //如果未指定比较器,就使用对象本身作为比较器。此时对象本身需实现Comparable接口。
                cmp = k.compareTo(t.key);
                //根据比较的结果-1,0,1,来确定插入位置
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        ......
    }
 

五.Collections.sort方法源码

Collctions.java
//不指定比较器,list存放的对象必须实现Comparable接口
public static <T extends Comparable<? super T>> void sort(List<T> list) {
	Object[] a = list.toArray();
        //对list对应的数组排序
	Arrays.sort(a);
        //同排序后的数组,重新给list赋值
	ListIterator<T> i = list.listIterator();
	for (int j=0; j<a.length; j++) {
	    i.next();
	    i.set((T)a[j]);
	}
}

//指定比较器
public static <T> void sort(List<T> list, Comparator<? super T> c) {
	Object[] a = list.toArray();
	Arrays.sort(a, (Comparator)c);
	ListIterator i = list.listIterator();
	for (int j=0; j<a.length; j++) {
	    i.next();
	    i.set(a[j]);
	}
}

//后面Arrays.sort的代码比较逻辑,就同TreeMap了,要么用对象本身比较,要么用比较器比较两个对象
0
0
分享到:
评论

相关推荐

    02-Java集合容器面试题(2020最新版)-重点.pdf

    - **Comparable与Comparator**:`Comparable`接口用于定义对象自身的排序规则,`Comparator`接口用于定义外部的排序规则。 - **Collection与Collections**:`Collection`是集合接口,`Collections`则是集合工具类,...

    ArraySort排序

    本文将深入探讨两种主要的排序方法:实现`Comparator`接口和实现`Comparable`接口。 首先,让我们理解数组的基本概念。在Java中,数组是一种有序的数据集合,可以存储相同类型的数据元素。它们在内存中占据连续的...

    根据父容器日期排序的ExpandableListView

    使用`Comparable`接口或者自定义`Comparator`对`EventGroup`进行排序。 2. **数据加载与排序**: 在获取数据后,我们需要遍历数据源并根据日期对`EventGroup`对象进行排序。可以使用`Collections.sort()`方法,...

    Java集合排序及java集合类详解参照.pdf

    2. 对于Set,如TreeSet,它会自动根据元素的Comparable或Comparator进行排序。 3. 对于Map,如TreeMap,同样依赖于键的Comparable或Comparator。 总结来说,Java集合框架是Java编程中的基石,理解并熟练运用集合...

    java中的排序.ppt

    Comparator 可以看成一种算法的实现,在需要容器集合 collection 需要比较功能的时候,来指定这个比较器。这可以看出一种设计模式,将算法和数据分离,就像 C++ STL 中的函数对象一样。例如: ```java Comparator ...

    第16章:Java集合.zip_java 集合_java集合

    使用`Comparator`接口或自然排序(Comparable)可以自定义元素的排序规则。 6. **并发编程**: Java集合框架提供了线程安全的实现,如`ConcurrentHashMap`和`CopyOnWriteArrayList`,它们在多线程环境下表现更优...

    java集合,java集合

    8. **Comparable和Comparator接口**:Comparable接口用于元素自身的自然排序,比如String类实现了Comparable,可以根据字典顺序比较。Comparator接口则用于提供自定义的比较规则,常用于TreeSet和TreeMap。 9. **...

    史上最全的Java面试题集锦.pdf

    9. **Comparable与Comparator接口**:Comparable用于定义对象的自然排序,Comparator用于自定义排序规则。两者在面试中常被问及它们的区别及其应用场景。 10. **多态**:多态是面向对象的重要特性,涉及方法的重写...

    java jdk 5学习笔记

    8. **比较器Comparator和Comparable接口**: `Comparator`接口用于自定义排序规则,而`Comparable`接口则用于对象自身的比较。JDK 5对这两个接口进行了增强,使得排序功能更为灵活。 9. **NIO(New IO)**: 新的IO...

    Java服务器端开发面试.doc

    3. **`Comparable`接口与`Comparator`类**:`Comparable`用于对象的自然排序,实现了这个接口的对象可以直接进行比较。`Comparator`则提供了自定义比较逻辑,可以用于集合排序、插入等操作。 4. **类初始化与变量...

    jdkAPI1.8中文版

    - **Comparable和Comparator接口**:Comparable用于自然排序,Comparator用于自定义排序。 - **Iterable接口**:用于迭代遍历集合元素,如for-each循环。 - **Optional类**:Java 8引入,用于处理可能为空的对象,...

    Java程序员面试之葵花宝典

    - 排序与比较:理解Comparable和Comparator接口,以及它们在排序中的应用。 3. **多线程** - 线程状态:知道新建、就绪、运行、阻塞和死亡这五种线程状态。 - 同步机制:掌握synchronized关键字,死锁、活锁、...

    Java集合排序及java集合类详解

    如果需要自定义排序规则,可以实现Comparable接口或者提供一个Comparator对象。 1. **Comparable接口**:当元素自身具备比较逻辑时,实现Comparable接口。例如,Integer类已经实现了Comparable接口,因此可以直接...

    Java集合框架[汇编].pdf

    8. **Comparable接口和Comparator接口** - **Comparable**:实现了Comparable接口的类可以进行自然排序,例如Integer、String等类。 - **Comparator**:Comparator接口用于自定义比较规则,可以在不修改源类的情况...

    Java之Collection总结

    - **Comparable**:需要被比较的对象自身实现该接口,通常用于自然排序。 - **Comparator**:独立于对象之外的比较器,可以自定义比较逻辑。 ### 总结 Java集合框架为开发者提供了丰富的数据结构选项,包括但不...

    Java集合排序及java集合类详解.pdf

    容器是Java集合框架的基础概念,它们用于存储对象的集合。容器分为两大类:集合(Collection)和映射(Map)。 - **集合**:用来存储不重复元素的容器,如List和Set。 - **映射**:用来存储键值对(key-value pair)的...

    Java集合容器面试题(2022最新版)-重点.docx

    - 对象需要实现`Comparable`接口或提供`Comparator`对象来指定排序规则。 #### Collections工具类中的sort()方法如何比较元素 - `Collections.sort()`方法可以对`List`进行排序。 - 如果`List`中的元素实现了`...

    Java集合框架总结

    Java集合框架汇总 1.集合框架结构图 1 2.两种特殊的Java容器类List和Set分析 2 3. Collection 接口: 2 4.Iterator 接口: 3 5.List接口: 3 ...8.Comparable接口和Comparator接口: 7 9. 集合框架面试题 7

Global site tag (gtag.js) - Google Analytics