`

Java中的TreeMap、Comparable、Comparator

 
阅读更多

我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来存储的,只要compareTo的返回结果为0就表示两个对象相等,那么就存不进去两个对象,后put的就把前面的覆盖掉,甚至我们都不用重写equasls和hashCode方法,而只需要实现Comparable接口来重写comparareTo方法就行了,但是我们不能保证在应用中不会用到HashMap,所以保持良好的习惯,当我们定义了一个对象之后习惯性的重写equals和hashCode方法。

 
  测试Comparable接口:
 
  第一次比较:定义一个User类,实现Comparable接口,按照年龄排序,我们让equals为true,而hashCode也始终相等。
 
  
 
复制代码
public class User implements Comparable<User> {
    private String id;
    private String name;
    private Integer age;
 
    public User() {
    }
 
    public User(String id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
 
    @Override
    public boolean equals(Object obj) {
        return true;
    }
    
    @Override
    public int hashCode() {
        return 0;
    }
    public int compareTo(User o) {
        return this.age > o.getAge() ? 1 : this.age == o.getAge() ? 0 : -1;
    }
}
复制代码
  测试代码:
 
复制代码
public class TestUser {
    public static void main(String[] args) {
        Map<User, Integer> userHashMap = new HashMap<User, Integer>();
        User user1 = new User("1", "Jay", 30);
        User user2 = new User("2", "Jolin", 21);
        User user3 = new User("3", "Jack Cheng", 22);
        User user4 = new User("4", "Bruce Lee", 22);
        userHashMap.put(user1, 100);
        userHashMap.put(user2, 200);
        userHashMap.put(user3, 300);
        userHashMap.put(user4, 400);
        
        System.out.println(userHashMap);
        
        Map<User, Integer>  userTreeMap = new TreeMap<User, Integer>();
        userTreeMap.put(user1, 100);
        userTreeMap.put(user2, 200);
        userTreeMap.put(user3, 300);
        userTreeMap.put(user4, 400);
        
        System.out.println(userTreeMap);
    }
}
复制代码
  结果:
 
{User [name=Jay, age=30]=400}
{User [name=Jolin, age=21]=200, User [name=Jack Cheng, age=22]=400, User [name=Jay, age=30]=100}
  结论:对于HashMap而言,只要key的equals相等就表示两个元素相等,HashMap就存不进去;而TreeMap是不管equals和hashCode的,只要compareTo相等就表示两个元素相同,就存不进去。
 
  2.第二次比较:现在我们按照id来重写hashCode和equals方法,如下:
 
复制代码
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
复制代码
测试代码不变,还是上面的测试代码,结果:
 
{User [name=Jolin, age=21]=200, User [name=Jay, age=30]=100, User [name=Bruce Lee, age=22]=400, User [name=Jack Cheng, age=22]=300}
{User [name=Jolin, age=21]=200, User [name=Jack Cheng, age=22]=400, User [name=Jay, age=30]=100}
说明:HashMap只要equals不等那就表示不等,而对于TreeMap如果compareTo相等,那么2个元素就相等,并且排序是按照compareTo方法定义的排序规则。
 
 
 
接下来再在测试代码里面添加List测试:
 
复制代码
        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);
        
        System.out.println(userList);
        
        Collections.sort(userList);
        System.out.println(userList);
复制代码
结果:
 
{User [name=Jolin, age=21]=200, User [name=Jay, age=30]=100, User [name=Bruce Lee, age=22]=400, User [name=Jack Cheng, age=22]=300}
{User [name=Jolin, age=21]=200, User [name=Jack Cheng, age=22]=400, User [name=Jay, age=30]=100}
[User [name=Jay, age=30], User [name=Jolin, age=21], User [name=Jack Cheng, age=22], User [name=Bruce Lee, age=22]]
[User [name=Jolin, age=21], User [name=Jack Cheng, age=22], User [name=Bruce Lee, age=22], User [name=Jay, age=30]]
当调用sort方法之后List里面的元素就按照age排序了。
分享到:
评论

相关推荐

    java 中Comparable与Comparator详解与比较

    在Java编程语言中,Comparable和Comparator接口用于比较对象的顺序,尤其在进行排序操作时非常关键。两者虽然目的相似,但使用方式和应用场景有所区别。 Comparable接口定义在`java.lang`包中,它只有一个方法`...

    java 中 TreeMap排序

    在Java编程语言中,`TreeMap`是一种基于红黑树数据结构实现的键值对容器,与`HashMap`不同,`TreeMap`自动按照键的自然顺序或者自定义的比较器进行排序。当我们需要存储的数据有特定的排序需求时,`TreeMap`便成为一...

    对比Java中的Comparable排序接口和Comparator比较器接口

    例如,Java中的String、Integer等内置类都实现了Comparable接口,可以方便地进行比较和排序。当你有一个实现了Comparable接口的对象列表或数组时,可以直接使用Collections.sort()或Arrays.sort()对其进行排序。...

    TreeMap in Java_java_treemap_

    Java中的`TreeMap`是一个基于红黑树(Red-Black Tree)数据结构的有序映射容器。它维护了键的自然顺序或者根据提供的比较器进行排序。`TreeMap`类继承自`AbstractMap`,实现了`NavigableMap`、`SortedMap`接口,因此...

    Java中实现Comparable和Comparator对象比较

    Java提供了两种方式来实现对象的排序:Comparable接口和Comparator接口。这两种接口都用于定义比较规则,但使用场景和方式有所不同。 首先,Comparable接口是Java.lang包中的一个接口,它包含一个方法`compareTo(T ...

    java中TreeMap排序的示例代码

    Java 中 TreeMap 排序的示例代码 Java 中的 TreeMap 排序是 Java 语言中一种常用的数据结构排序方法。TreeMap 是一个有序的 Map 集合,它可以根据键的自然顺序或自定义的比较器进行排序。 TreeMap 排序的优点 1. ...

    TreeMap源码

    TreeMap是Java集合框架中的一种有序映射数据结构,它实现了SortedMap接口,提供了按自然顺序或自定义比较器顺序存储键值对的能力。在深入理解TreeMap的源码之前,我们首先要了解其背后的基石——红黑树。 红黑树...

    557.555.JAVA基础教程_集合-TreeMap两种添加方式的使用(557).rar

    Java编程语言中的集合框架是开发过程中不可或缺的一部分,而TreeMap作为集合框架中的一员,它是一种有序的Key-Value存储结构,适用于需要保持插入顺序或按照自然排序的场景。本教程将详细讲解TreeMap的两种主要添加...

    Java提高篇之TreeMap编程开发技术共24页.pdf

    在Java编程语言中,`TreeMap`是`java.util`包下的一种有序的键值对存储结构,它基于红黑树(Red-Black Tree)算法实现。`TreeMap`提供了许多高级功能,如排序、迭代顺序等,适用于需要保持数据有序性的场景。本资料...

    Treemap-4.1.2

    TreeMap是一种数据结构,它是Java集合框架的一部分,位于`java.util`包中。它实现了一个映射接口,其中键(keys)是唯一的,并且通过自然排序或者自定义比较器进行排序。TreeMap内部使用红黑树算法来维护键值对的...

    java 按对象属性排序

    Java中的`Comparable`接口定义了`compareTo()`方法,用于比较对象的顺序。当我们需要对一个类的对象进行自然排序时,可以实现这个接口。例如,在`User`类中,如果我们有一个`age`属性,我们可以这样实现: ```...

    浅谈java中的TreeMap 排序与TreeSet 排序

    在Java编程语言中,`TreeMap` 和 `TreeSet` 是两种基于红黑树数据结构实现的集合类,它们都提供了自动排序的功能。本文将详细探讨 `TreeMap` 和 `TreeSet` 的排序机制以及如何自定义排序规则。 首先,`TreeMap` 是...

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    `Comparable`接口是Java中一个重要的接口,它定义了一个`compareTo()`方法。任何类如果实现了`Comparable`接口,就表明该类的实例可以进行比较。例如,`String`类已经实现了`Comparable`,所以我们可以直接比较两个...

    java Compare示例

    总的来说,`Comparable`和`Comparator`是Java中实现对象排序的两种主要手段,它们提供了强大的灵活性和可扩展性,使得我们可以根据需求自由地控制对象的比较逻辑。在阅读提供的"javaCompare"文件时,你将深入理解这...

    492.490.JAVA基础教程_常用类-自定义类实现Comparable自然排序(492).rar

    当一个类实现了`Comparable`接口后,其对象可以在使用了`Comparator`接口的集合类(如`TreeSet`或`TreeMap`)中自动进行自然排序。这意味着集合中的对象会按照`compareTo`方法定义的顺序进行排列。 **自定义类与...

    Java集合讲义大全.docx

    Java 集合框架是 Java 语言中的一种数据结构,提供了多种类型的集合类,以满足不同的应用场景。Java 集合框架的主要特点是提供了一种通用的集合操作接口,通过不同的集合类实现不同的数据结构。 1. 主要集合概述 ...

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

Global site tag (gtag.js) - Google Analytics