如何决定使用 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 是降序。

 

参考:

 

posted @ 2021-11-27 15:40  残城碎梦  阅读(91)  评论(0编辑  收藏  举报