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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yp324 中级黑马   /  2013-6-4 15:21  /  1137 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yp324 于 2013-6-4 19:53 编辑

public static void main()
{
        Collection c = new HashSet();
        Demo d1 = new Demo(1,2);
        Demo d2 = new Demo(3,4);
        Demo d3 = new Demo(5,6);
        c.add(d1);
        c.add(d2);
        c.add(d3);
        System.out.println(c.size());
        d3.setY(9);
        c.remove(d3);
        System.out.println(c.size());
}

class Demo
{
        int x,y;
        Demo(intx,int y)
        {
                this.x=x;
                this.y=y;
        }
        public void setY(int y)
        (
                this.y=y;
        )
}
为什么两次的打印结果都为3

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

5 个回复

正序浏览
你好你的这段代码我验证了一下是可以删除d3这个对象的,为什么呢?刚开始我也纳闷,其实你细看一下就会发现
你的Demo类没有复写继承自Object类中的equals方法,这样不管你怎么修改d1,d2,d3都是可以删除。
import java.util.*;
class DemoTest
{
        public static void main(String[] args)
        {
        Collection c = new HashSet();
        Demo d1 = new Demo(1,2);
        Demo d2 = new Demo(3,4);
        Demo d3 = new Demo(5,6);
        c.add(d1);
        c.add(d2);
        c.add(d3);
        System.out.println(c.size());
        d3.setY(9);
                c.remove(d3);
        //System.out.println(c.remove(d3));
        System.out.println(c.size());
        }
}

class Demo
{
       
        int x,y;
     Demo(int x,int y)
     {
        this.x=x;
        this.y=y;
     }
     public void setY(int y)
        {
        this.y=y;
        }
      
}

运行结果是
3
true
2
我打印了一下remove函数的返回结果,是true说明remove方法成删除了。
回复 使用道具 举报
你的打印调用的应该是size()方法。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 鼓励

查看全部评分

回复 使用道具 举报
因为hashset添加、删除对象的时候是通过hashcode来判断哈希码值和equals比较的,而你把d3的值修改过后,d3的值发生了改变所以删除不成功

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
hashset添加对象的时候是判断hashcode和比较equals,根据hashcode决定对象的位置,equals看是否重复。 删除的时候也要判断这两项。删除一个对象时,先要判断hashcode找到对象的位置,再比较equals。   应该是 因为更改了值value ,所以删除没有成功。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
额 ,你的代码错了吧 。c.size?应该是 c.size()吧。
我帮你改了一下 你看看哈
  1. import java.util.Collection;
  2. import java.util.HashSet;


  3. public class Test1 {
  4.        
  5.         public static void main( String[] agrs)
  6.         {
  7.                 Collection c = new HashSet();
  8.                 Demo d1 = new Demo(1,2);
  9.                 Demo d2 = new Demo(3,4);
  10.                 Demo d3 = new Demo(5,6);
  11.                 c.add(d1);
  12.                 c.add(d2);
  13.                 c.add(d3);
  14.                 System.out.println(c.size());
  15.                 d3.setY(9);
  16.                 c.remove(d3);
  17.                 System.out.println(c.size());
  18.         }

  19.        
  20.        
  21.        

  22. }
  23. class Demo
  24. {
  25.         int x,y;
  26.         Demo(int x,int y)
  27.         {
  28.                 this.x=x;
  29.                 this.y=y;
  30.         }
  31.         public void setY(int y)
  32.         {
  33.                 this.y=y;
  34.         }
  35. }
复制代码
输出的答案是 3、2

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

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