A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cs8630323 高级黑马   /  2013-12-29 22:23  /  1336 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 cs8630323 于 2014-1-1 16:40 编辑
  1. import java.util.*;
  2. import java.lang.*;

  3. class R implements Comparable
  4. {
  5.         int count;
  6.         public R(int count)
  7.         {
  8.            this.count=count;
  9.         }
  10.         public String toString()
  11.         {
  12.           return "R[count:"+count+"]";
  13.         }
  14.         public boolean equals (Object obj)
  15.         {
  16.            if (this==obj)
  17.            {
  18.                    return true;
  19.            }
  20.            if (obj!=null&&obj.getClass()==R.class)
  21.            {
  22.                    R r=(R)obj;
  23.                    if (r.count==this.count)
  24.                    {
  25.                            return true;
  26.                    }
  27.            }
  28.                      return false;
  29.         }

  30.         public int compareTo(Object obj)
  31.         {
  32.            R r =(R)obj;
  33.            return count>r.count?1: count<r.count?-1:0;
  34.         }
  35. }
  36.   public class Testjihe
  37.   {
  38.           public static void main (String[] args)
  39.           {
  40.                TreeSet ts=new TreeSet();
  41.                    ts.add(new R(5));
  42.           // ts.add(new R(6));    如果去掉斜槓
  43.                    ts.add(new R(-3));
  44.                    ts.add(new R(9));
  45.                    ts.add(new R(-2));
  46.                    System.out.println(ts);
  47.                    R first=(R)ts.first();
  48.                first.count=20;
  49.                    R last=(R)ts.last();
  50.                    last.count=-2;
  51.                    System.out.println(ts);
  52.                    ts.remove(new R(5));
  53.              System.out.println(ts);
  54.             System.out.println(ts.remove(new R(-2)));
  55. ts.remove(new R(-2));
  56.                         System.out.println("1"+ts);

  57.           }
  58.   }
复制代码
主方法中// ts.add(new R(6));    如果去掉斜槓的話,刪除new R(-2) false,爲什麼呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
重写equal方法必须重写hashcode方法!所以你懂得
回复 使用道具 举报
本帖最后由 刘汉文 于 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集合中只放入不可变对象。


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
刘汉文 发表于 2013-12-30 23:08
因为TreeSet底层为二叉树数据结构,上面程序中的R对象是一个正常重写了equals方法和comparable方法类, ...

高手,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马