java treeset treemap_Java TreeMap/TreeSet

首先要说明的是,TreeMap仍然是Map,而不是Tree。同样的,TreeSet仍然是Set,而不是Tree。也就是说TreeMap和TreeSet不能当成树来使用,只是它们的底层是使用红黑树来实现的。

TreeMap实现了java.util.SortedMap接口,是一个已经排好序的Map。

TreeMap映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

有两种方式使用TreeMap。

1.元素自然排序,即放入容器中的元素实现java.lang.Comparable接口。

package org.zzj;

import java.util.TreeMap;

public class TreeMapTest {

public static void main(String[] args) {

TreeMap treeMap = new TreeMap();

Person p1 = new Person("张三", 21);

Person p2 = new Person("李四", 15);

Person p3 = new Person("孙五", 26);

Person p4 = new Person("赵六", 18);

treeMap.put(p1, "");

treeMap.put(p2, "");

treeMap.put(p3, "");

treeMap.put(p4, "");

System.out.println(treeMap);

p3.setAge(12);

System.out.println(treeMap);

}

}

class Person implements Comparable {

private String name;

private int age;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int compareTo(Person o) {

return this.age - o.age;

}

@Override

public String toString() {

return "name:" + name + "; age:" + age + "\n";

}

}输出

{name:李四; age:15

=, name:赵六; age:18

=, name:张三; age:21

=, name:孙五; age:26

=}

{name:李四; age:15

=, name:赵六; age:18

=, name:张三; age:21

=, name:孙五; age:12

=}当把孙五的年龄改为最小的时候,他仍然排在了最后,这说明

元素的顺序在放入容器的时候就已经确定了。

2.使用排序器

package org.zzj;

import java.util.Comparator;

import java.util.TreeMap;

public class TreeMapTest {

public static void main(String[] args) {

TreeMap treeMap = new TreeMap(

new Comparator() {

@Override

public int compare(Person o1, Person o2) {

return o1.getAge() - o2.getAge();

}

});

Person p1 = new Person("张三", 21);

Person p2 = new Person("李四", 15);

Person p3 = new Person("孙五", 26);

Person p4 = new Person("赵六", 18);

treeMap.put(p1, "");

treeMap.put(p2, "");

treeMap.put(p3, "");

treeMap.put(p4, "");

System.out.println(treeMap);

p3.setAge(12);

System.out.println(treeMap);

}

}

class Person {

private String name;

private int age;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "name:" + name + "; age:" + age + "\n";

}

}输出:

{name:李四; age:15

=, name:赵六; age:18

=, name:张三; age:21

=, name:孙五; age:26

=}

{name:李四; age:15

=, name:赵六; age:18

=, name:张三; age:21

=, name:孙五; age:12

=}

如果既没有让元素实现java.lang.Comparable接口,也没有在TreeMap的构造器中传入排序器,则会在添加元素的抛出错误。

显然,使用排序器有利于解耦。

HashMap通常比TreeMap快一些(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。  类似于HashSet,TreeSet也是基于TreeMap实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值