如何决定使用 HashMap 还是 TreeMap?
TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。
TreeMap中默认是按照升序进行排序的,如果想要降序,需要通过自定义的比较器来实现。
定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:
- 如果参数字符串等于此字符串,则返回 0 值;
- 如果此字符串小于字符串参数,则返回一个小于 0 的值;
- 如果此字符串大于字符串参数,则返回一个大于 0 的值。
HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
Comparator的compare方法如何定义升序降序
1)升序代码(从小到大,o1-o2 > 0时就交换o1和o2的位置,即大的数都往后放)
public static void main(String[] args) {
Integer[] nums = new Integer[]{6, 8, 3, 0, 2};
Arrays.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
for (Integer i : nums) {
System.out.print(i + " ");
}
}
2)降序代码(从大到小)
public static void main(String[] args) {
Integer[] nums = new Integer[]{6, 8, 3, 0, 2};
Arrays.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (Integer i : nums) {
System.out.print(i + " ");
}
}
所以更多时候我们是直接记住了compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序。
参考: |