javase-一个Java的Set的remove问题

问题描述

一个Java的Set的remove问题

为什么改变值后,无法删除?

 package mytest;

import java.util.HashSet;
import java.util.Set;

public class Key {
    int i;
    public Key(int i) {
        this.i = i;
    }
    public int hashCode() {
        return i;
    }
    public boolean equals(Object obj) {
        return i == ((Key)obj).i;
    }

    public static void main(String[] args) {
        Set<Key> set = new HashSet<Key>();
        Key k1 = new Key(1);
        Key k2 = new Key(2);
        set.add(k1);
        set.add(k2);

        System.out.println("原来:"+set);
        set.remove(k1);
        System.out.println("删除k1后:"+set);
        k2.i = 1;
        System.out.println("改变k2.i为1后:"+set);
        boolean f = set.remove(k2);//这里为什么失败?
        System.out.println("是否删除k2?:"+f);
        System.out.println("删除操作后:"+set);

        k2.i = 2;
        System.out.println("改变k2.i为2后:"+set);
        f = set.remove(k2);
        System.out.println("是否删除k2?:"+f);
        System.out.println("删除操作后:"+set);
    }
}

解决方案

因为你改变了作为hash值的字段。hashset只会在hash值对应的表中查找。
进一步说,hash不能违法如下规则:
如果hash相同,未必对象相等,但是如果hash不同,则对象一定不相等。
进一步说,你不应该让一个对象在生命周期内改变它的hash。如果你让i作为hash值得,要么,这个字段不许在创建后被设置。
要么,只允许通过拷贝对象,再创建对象的方式设置i。

解决方案二:

这个是因为改了i属性的值后,hashcode的值就变了,在HashSet中映射的位置就不同了,所以删不掉。

解决方案三:

http://bbs.csdn.net/topics/270008780看看这篇帖子就明白了

解决方案四:

你可以这里做,先把k2,从set删除了,再把k2.i = 1;放入到set

解决方案五:

先copy一下,然后再从set中删除,再加入这个copy后的对象。

解决方案六:

k2.i = 1使用k2不在HashSet中了;k2在k2.i=2的HashSet位置上

解决方案七:

JAVA DOM中的一个问题

时间: 2025-01-24 08:42:44

javase-一个Java的Set的remove问题的相关文章

但没有用remove函数-编写了一个Java循环报数的问题,应该是哪里卡住了过不去,求大神指点

问题描述 编写了一个Java循环报数的问题,应该是哪里卡住了过不去,求大神指点 public class Jump {/*1-100号人循环报数,报到7的倍数的输出,第一轮输出714,...98第二轮99报1输出513....不管是第几轮,输出完50个数结束.*/ public static void main(String[] args) { int arr_all[] = new int[101]; int m = 1; int i = 1; int out = 0; int count =

jdk-我在Java官网下载了一个Java,Java官网只提供JRE吗?,我没有在目录里找到JDK呢?

问题描述 我在Java官网下载了一个Java,Java官网只提供JRE吗?,我没有在目录里找到JDK呢? 解决方案 http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 找到对应的下载 解决方案二: 你下载的是JRE,里面不包含JDK的,需要下载JDK来安装.

自己动手写一个java版简单云相册_java

动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件. 用户可以下载其他人上传的图片. 用户可以查看其他所有人的图片. 用户只能删除通过自己IP上传的图片. 用到的技术: 文件上传下载.设计模式.Dom4j.xPath等. 先看下2个页面: 源代码: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns=

sql-我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现?

问题描述 我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现? 我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现? 解决方案 http://blog.chinaunix.net/uid-20752328-id-3451931.html 这里有一篇文章可以解决你的问题你可以点击进去看看; 如果回答对您有帮助请采纳 解决方案二: 说明数据整理不合理吧 解决方案三: 你应该优化数据库结构,或你

编译-一个java新手在编程路上遇到的问题

问题描述 一个java新手在编程路上遇到的问题 路过的大牛瞄一眼,谢谢...大一学生一枚,java学到网络编译了,最近在实现ftp服务器,目前还没写出来,心情十分郁闷,我觉得自己要成为编程员的随机应变能力还不够,编程路上的困惑,曾经也遇过类似状况求个回复. 解决方案 没什么,大一的时候让我自己去实现一个ftp服务器,我也觉得挺困难的.所以你要上大学啊. 解决方案二: 困惑:坚持.不会:学习.前排 解决方案三: 任何知识都有一个主干,首先要了解基本的原理,然后再学习细节.如果你是自学,一定要注意这

java-求一个Java实现的卡尔曼滤波算法

问题描述 求一个Java实现的卡尔曼滤波算法 现在做一个无线的定位系统,求一个Java实现的卡尔曼滤波算法 解决方案 参考:http://blog.csdn.net/ouyang_linux007/article/details/7563998http://download.csdn.net/detail/daibinok2008/4175968 解决方案二: https://code.google.com/p/efficient-java-matrix-library/wiki/KalmanF

服务器-这些因素如何影响一个java web网站的并发数

问题描述 这些因素如何影响一个java web网站的并发数 服务器tomcat:最大连接数(maxThreads)和(acceptCount) 缓存redis:最大连接数(maxActive).最大空闲连接数(maxIdle) 数据源c3p0:最大连接数(maxPoolSize) 请教大牛解释这些参数和整个web网站并发数的关系

生成一个java编制的可执行文件

执行 将java编织成.class后,如果只是用java 命令来执行总觉得不是太过瘾,找个办法生成像exe文件一样用鼠标双击便可执行的文件,应该是很有趣的啊.本文主要介绍了一种生成java可执行程序的方法.这里我用了一个名字叫做exe4j的免费小软件,感觉不错.下面我将我把java的.class文件生成可执行文件的流程讲一下.首先:将你要选择好你即将发布的.class文件就不用细说了,下面是创建jar文件,这里我用一个名字叫做test.class的文件来举例,另外注意还要编写一个确定main_c

通过一个Java应用服务器使用JRuby on Rails和XML增强Ajax

Ruby on Rails 框架提供了一些非常方便的 XML 特性,这使使用数据库数据 进行开发和为 JavaScript 应用程序提供 XML 格式的数据库数据变得更加简单 .JavaScript 还具有内置的 XML 解析功能,因此可以非常轻松地接收和解析 XML 格式的数据.但是,如果要在不部署额外服务器的情况下接入 Java 应用程序,该如何做呢?这正是 JRuby 的工作.JRuby on Rails 是 Ruby on Rails 框架的 Java 实现,通过将 Ruby 应用程序部