美文网首页Java学习笔记
TreeSet底层数据结构

TreeSet底层数据结构

作者: 李霖神谷 | 来源:发表于2017-04-28 12:18 被阅读190次
import java.util.TreeSet;

class Z implements Comparable{
    int age;

    public Z(int age) {
        super();
        this.age = age;
    }
    public boolean equals(Object obj){
        return true;
    }
    public int compareTo(Object obj){
        return -1;
    }
}
public class JiHeDemo{
    public static void main(String[] args) {
        TreeSet set=new TreeSet();
        Z z=new Z(6);
        set.add(z);
        //输出为true,表明添加成功
        System.out.println(set.add(z));
        //下面将输出set,将看到两个元素
        System.out.println(set);
        //修改第一个元素的age变量
        (((Z)set.first())).age=9;
        //输出set集合的最后一个元素的age变量,将会看到也变成了9
        System.out.println((((Z)set.first())).age);
    }
}

程序中System.out.println(set.add(z));把同一个元素再次添加到Set集合中,因为该集合中 compareTo方法总返回1,虽然它的equals方法返回true,但是对于Set集合还是认为z对象和他自己不相等,因此TreeSet 可以添加两个z对象,其实他添加的是同一个元素,只是放在不同的位置上,所以当修改第一个元素最后一个元素也会改变。
如果向TreeSet中添加一个可变对象后,并且后面程序修改了该可变对象的File这将导致它与其他对象的大小顺序发生了变化,但TreeSet不会再次调整他们的顺序。

import java.util.TreeSet;

class R implements Comparable {
    int count;

    public R(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "R [count=" + count + "]";
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == R.class) {
            R r = (R) obj;
            if (r.count == this.count) {
                return true;
            }
        }
        return false;
    }

    // 重写compareTo方法,根据count来比较大小。
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        R r = (R) o;
        return count > r.count ? 1 : count < r.count ? -1 : 0;
    }

}

public class JiHeDemo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new R(5));
        ts.add(new R(-3));
        ts.add(new R(9));
        ts.add(new R(-2));
        System.out.println(ts);
        R first = (R) ts.first();
        // 对第一个元素count进行赋值
        first.count = 20;
        R last = (R) ts.last();
        last.count = -2;
        // 再次输出将看到TreeSet里的元素处于无序状态,且有重复元素。
        System.out.println(ts);
        // 删除Filed被改变的元素删除失败。
        System.out.println(ts.remove(new R(-2)));
        System.out.println(ts);
        // 删除Filed没有被改变的元素删除成功。
        System.out.println(ts.remove(new R(5)));
        System.out.println(ts);

    }
}

一旦改变TreeSet集合里的可变元素里的Filed当试图再删除时会删除失败。

相关文章

  • TreeSet集合API方法实例演示

    TreeSet TreeSet是NavigableSet接口的实现类,使用二叉树的数据结构维护元素的顺序。底层数据...

  • 什么是红黑树?

    最近研究JDK源码的时候,发现TreeMap和TreeSet底层数据结构是红黑树,当然,TreeSet其实本质上就...

  • 集合框架Set之TreeSet

    TreeSet Set 接口的一种实现类 它的底层实现是基于TreeMap(底层实现的数据结构是树结构,并不...

  • 面试官:从源码分析一下TreeSet(基于jdk1.8)

    这个TreeSet其实和HashSet类似。HashSet底层是通过HashMap实现的,TreeSet其实底层也...

  • 面试题:HashSet、TreeSet 和HashMap 的实现

    说下 TreeSet 和 HashSet 什么区别呢? 它们的区别点主要在他们的底层数据结构不同,HashSet ...

  • TreeSet底层数据结构

    程序中System.out.println(set.add(z));把同一个元素再次添加到Set集合中,因为该集合...

  • TreeSet

    TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据。compareTo方...

  • Java 集合 TreeSet

    TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树,保证元素唯一性的依据,compareTo方...

  • TreeSet源码初探

    附图: 前言: TreeSet是一个有序的集合,它的作用是提供有序的Set集合。底层数据结构是红黑树(是一种自平衡...

  • Comparable/Comparator分析

    源码来自jdk1.8 TreeMap, TreeSet, PriorityQueue等天生有序的数据结构,或是Ar...

网友评论

    本文标题:TreeSet底层数据结构

    本文链接:https://www.haomeiwen.com/subject/snpizttx.html