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当试图再删除时会删除失败。
网友评论