黑马程序员技术交流社区
标题: TreeSet集合的一個問題。 [打印本页]
作者: cs8630323 时间: 2013-12-29 22:23
标题: TreeSet集合的一個問題。
本帖最后由 cs8630323 于 2014-1-1 16:40 编辑
- import java.util.*;
- import java.lang.*;
- class R implements Comparable
- {
- int count;
- public R(int count)
- {
- this.count=count;
- }
- 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;
- }
- public int compareTo(Object obj)
- {
- R r =(R)obj;
- return count>r.count?1: count<r.count?-1:0;
- }
- }
- public class Testjihe
- {
- public static void main (String[] args)
- {
- TreeSet ts=new TreeSet();
- ts.add(new R(5));
- // ts.add(new R(6)); 如果去掉斜槓
- ts.add(new R(-3));
- ts.add(new R(9));
- ts.add(new R(-2));
- System.out.println(ts);
- R first=(R)ts.first();
- first.count=20;
- R last=(R)ts.last();
- last.count=-2;
- System.out.println(ts);
- ts.remove(new R(5));
- System.out.println(ts);
- System.out.println(ts.remove(new R(-2)));
- ts.remove(new R(-2));
- System.out.println("1"+ts);
- }
- }
复制代码 主方法中// ts.add(new R(6)); 如果去掉斜槓的話,刪除new R(-2) false,爲什麼呢?
作者: 渐渐不懂了 时间: 2013-12-30 12:54
重写equal方法必须重写hashcode方法!所以你懂得
作者: 刘汉文 时间: 2013-12-30 23:08
本帖最后由 刘汉文 于 2013-12-30 23:17 编辑
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\459787839\QQ\WinTemp\RichOle\9~8Y$8V7VXM}X9VB(U(O4$U.jpg
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\459787839\QQ\WinTemp\RichOle\9~8Y$8V7VXM}X9VB(U(O4$U.jpg
因为TreeSet底层为二叉树数据结构,上面程序中的R对象是一个正常重写了equals方法和comparable方法类,这两个方法都以R对象的count属性作为判断的依据。可以看到程序第一次输出的结果是有序排列的。此时小值在左边,大值在右边。
当改变R对象的count属性,程序的输出结果也发生了改变,而且包含了重复元素。一旦改变了TreeSet集合里可变元素的属性,当再试图删除该对象时,TreeSet会先选择5作为节点开始比较,所以count为5的R对象可以删除成功,之后删除count为-2的R对象时,如果有count为6的R对象,则以其为节点比较,比较结果比6小,所以往左边与20比较,发现还小,继续向左,发现没有元素,所以false。
而没有6,则选择最靠近的5的-2作为节点,所以可以删除。
总结:与HashSet在处理这些对象时将非常复杂,而且容易出错。为了让程序更具健壮,推荐HashSet和TreeSet集合中只放入不可变对象。
作者: cs8630323 时间: 2014-1-1 16:31
高手,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |