一.前言
本系列文章以研究源码为主,源码原理和设计次之,应用最弱。因为现在能读懂源码,要搞清楚设计和原理尚需火候,至于应用网上大把大把的有,读懂了源码应用也就是小事了。
二.
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
- 当两个对象需要比较的时候,使用Comparable & Comparator。
- 比较的两个对象可以是基本类型包装对象,也可以是除此之外的其它对象。
- 需要进行对象比较的场合,排序:
- Collections.sort(List<T>),Arrays.sort(Object[]);
- 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了,要么用对象本身比较,要么用比较器比较两个对象
分享到:
相关推荐
- **Comparable与Comparator**:`Comparable`接口用于定义对象自身的排序规则,`Comparator`接口用于定义外部的排序规则。 - **Collection与Collections**:`Collection`是集合接口,`Collections`则是集合工具类,...
本文将深入探讨两种主要的排序方法:实现`Comparator`接口和实现`Comparable`接口。 首先,让我们理解数组的基本概念。在Java中,数组是一种有序的数据集合,可以存储相同类型的数据元素。它们在内存中占据连续的...
使用`Comparable`接口或者自定义`Comparator`对`EventGroup`进行排序。 2. **数据加载与排序**: 在获取数据后,我们需要遍历数据源并根据日期对`EventGroup`对象进行排序。可以使用`Collections.sort()`方法,...
2. 对于Set,如TreeSet,它会自动根据元素的Comparable或Comparator进行排序。 3. 对于Map,如TreeMap,同样依赖于键的Comparable或Comparator。 总结来说,Java集合框架是Java编程中的基石,理解并熟练运用集合...
Comparator 可以看成一种算法的实现,在需要容器集合 collection 需要比较功能的时候,来指定这个比较器。这可以看出一种设计模式,将算法和数据分离,就像 C++ STL 中的函数对象一样。例如: ```java Comparator ...
使用`Comparator`接口或自然排序(Comparable)可以自定义元素的排序规则。 6. **并发编程**: Java集合框架提供了线程安全的实现,如`ConcurrentHashMap`和`CopyOnWriteArrayList`,它们在多线程环境下表现更优...
8. **Comparable和Comparator接口**:Comparable接口用于元素自身的自然排序,比如String类实现了Comparable,可以根据字典顺序比较。Comparator接口则用于提供自定义的比较规则,常用于TreeSet和TreeMap。 9. **...
9. **Comparable与Comparator接口**:Comparable用于定义对象的自然排序,Comparator用于自定义排序规则。两者在面试中常被问及它们的区别及其应用场景。 10. **多态**:多态是面向对象的重要特性,涉及方法的重写...
8. **比较器Comparator和Comparable接口**: `Comparator`接口用于自定义排序规则,而`Comparable`接口则用于对象自身的比较。JDK 5对这两个接口进行了增强,使得排序功能更为灵活。 9. **NIO(New IO)**: 新的IO...
3. **`Comparable`接口与`Comparator`类**:`Comparable`用于对象的自然排序,实现了这个接口的对象可以直接进行比较。`Comparator`则提供了自定义比较逻辑,可以用于集合排序、插入等操作。 4. **类初始化与变量...
- **Comparable和Comparator接口**:Comparable用于自然排序,Comparator用于自定义排序。 - **Iterable接口**:用于迭代遍历集合元素,如for-each循环。 - **Optional类**:Java 8引入,用于处理可能为空的对象,...
- 排序与比较:理解Comparable和Comparator接口,以及它们在排序中的应用。 3. **多线程** - 线程状态:知道新建、就绪、运行、阻塞和死亡这五种线程状态。 - 同步机制:掌握synchronized关键字,死锁、活锁、...
如果需要自定义排序规则,可以实现Comparable接口或者提供一个Comparator对象。 1. **Comparable接口**:当元素自身具备比较逻辑时,实现Comparable接口。例如,Integer类已经实现了Comparable接口,因此可以直接...
8. **Comparable接口和Comparator接口** - **Comparable**:实现了Comparable接口的类可以进行自然排序,例如Integer、String等类。 - **Comparator**:Comparator接口用于自定义比较规则,可以在不修改源类的情况...
- **Comparable**:需要被比较的对象自身实现该接口,通常用于自然排序。 - **Comparator**:独立于对象之外的比较器,可以自定义比较逻辑。 ### 总结 Java集合框架为开发者提供了丰富的数据结构选项,包括但不...
容器是Java集合框架的基础概念,它们用于存储对象的集合。容器分为两大类:集合(Collection)和映射(Map)。 - **集合**:用来存储不重复元素的容器,如List和Set。 - **映射**:用来存储键值对(key-value pair)的...
- 对象需要实现`Comparable`接口或提供`Comparator`对象来指定排序规则。 #### Collections工具类中的sort()方法如何比较元素 - `Collections.sort()`方法可以对`List`进行排序。 - 如果`List`中的元素实现了`...
Java集合框架汇总 1.集合框架结构图 1 2.两种特殊的Java容器类List和Set分析 2 3. Collection 接口: 2 4.Iterator 接口: 3 5.List接口: 3 ...8.Comparable接口和Comparator接口: 7 9. 集合框架面试题 7