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當試圖再刪除時會刪除失敗。