Java学习笔记

TreeSet底层数据结构

2017-04-28  本文已影响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当试图再删除时会删除失败。

上一篇 下一篇

猜你喜欢

热点阅读