深入理解TreeSet

简要介绍

  • TreeSet简介
  • TreeSet
    是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet,
    Cloneable, java.io.Serializable接口。
  • TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
  • TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
  • TreeSet 实现了Cloneable接口,意味着它能被克隆。
  • TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
  • TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
  • TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。

源码

使用

public static void main(String[] args) {
        testTreeSetAPIs();
    }

    // 测试TreeSet的api
    public static void testTreeSetAPIs() {
        String val;

        // 新建TreeSet
        TreeSet tSet = new TreeSet();
        // 将元素添加到TreeSet中
        tSet.add("aaa");
        // Set中不允许重复元素,所以只会保存一个“aaa”
        tSet.add("aaa");
        tSet.add("bbb");
        tSet.add("eee");
        tSet.add("ddd");
        tSet.add("ccc");
        System.out.println("TreeSet:" + tSet);

        // 打印TreeSet的实际大小
        System.out.println("tSet.size():"+tSet.size());

        // 导航方法
        // floor(小于、等于)
        System.out.println("floor bbb:"+tSet.floor("bbb"));

        // lower(小于)
        System.out.println("lower bbb:"+tSet.lower("bbb"));
        // ceiling(大于、等于)
        System.out.println("ceiling bbb:" + tSet.ceiling("bbb"));
        System.out.println("ceiling eee:"+tSet.ceiling("eee"));
        // ceiling(大于)
        System.out.println("higher bbb:"+tSet.higher("bbb"));
        // subSet()
        System.out.println("subSet(aaa, true, ccc, true):"+tSet.subSet("aaa", true, "ccc", true));
        System.out.println("subSet(aaa, true, ccc, false):"+ tSet.subSet("aaa", true, "ccc", false));
        System.out.println("subSet(aaa, false, ccc, true):"+ tSet.subSet("aaa", false, "ccc", true));
        System.out.println("subSet(aaa, false, ccc, false):"+ tSet.subSet("aaa", false, "ccc", false));
        // headSet()
        System.out.println("headSet(ccc, true): "+ tSet.headSet("ccc", true));
        System.out.println("headSet(ccc, false):"+tSet.headSet("ccc", false));
        // tailSet()
        System.out.println("tailSet(ccc, true):"+tSet.tailSet("ccc", true));
        System.out.println("tailSet(ccc, false):"+ tSet.tailSet("ccc", false));

        // 删除“ccc”
        tSet.remove("ccc");
        // 将Set转换为数组
        String[] arr = (String[]) tSet.toArray(new String[0]);
        for (String str : arr)
            System.out.printf("for each : %s\n", str);

        // 打印TreeSet
        System.out.println("TreeSet:"+tSet);

        // 遍历TreeSet
        for (Iterator iter = tSet.iterator(); iter.hasNext();) {
            System.out.println("iter :"+iter.next());
        }

        // 删除并返回第一个元素
        val = (String) tSet.pollFirst();
        System.out.println("pollFirst="+val+"set="+tSet);

        // 删除并返回最后一个元素
        val = (String) tSet.pollLast();
        System.out.println("pollLast="+val+"set="+tSet);

        // 清空HashSet
        tSet.clear();

        // 输出HashSet是否为空
        System.out.println("tSet.isEmpty():"+tSet.isEmpty());
    }

/************************打印结果*************************
TreeSet:[aaa, bbb, ccc, ddd, eee]
tSet.size():5
floor bbb:bbb
lower bbb:aaa
ceiling bbb:bbb
ceiling eee:eee
higher bbb:ccc
subSet(aaa, true, ccc, true):[aaa, bbb, ccc]
subSet(aaa, true, ccc, false):[aaa, bbb]
subSet(aaa, false, ccc, true):[bbb, ccc]
subSet(aaa, false, ccc, false):[bbb]
headSet(ccc, true): [aaa, bbb, ccc]
headSet(ccc, false):[aaa, bbb]
tailSet(ccc, true):[ccc, ddd, eee]
tailSet(ccc, false):[ddd, eee]
for each : aaa
for each : bbb
for each : ddd
for each : eee
TreeSet:[aaa, bbb, ddd, eee]
iter :aaa
iter :bbb
iter :ddd
iter :eee
pollFirst=aaaset=[bbb, ddd, eee]
pollLast=eeeset=[bbb, ddd]
tSet.isEmpty():true
************************************************************/

重点总结

  1. TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。

  2. TreeSet是非线程安全的。

  3. TreeSet实现java.io.Serializable的方式。当写入到输出流时,依次写入“比较器、容量、全部元素”;当读出输入流时,再依次读取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值