黑马程序员技术交流社区
标题:
我在hashSet列表中添加objec对象,为什么无法删除
[打印本页]
作者:
H._张_♂
时间:
2014-4-11 14:23
标题:
我在hashSet列表中添加objec对象,为什么无法删除
本帖最后由 H._张_♂ 于 2014-4-11 14:24 编辑
我的问题都在注释里面,我理解不了情况。
复制代码
import java.util.HashSet;
import java.util.Set;
public class HashCodeTest {
/**
* 这是一个要用来测试HashCode的类
* @author 张三
* @version v1.1
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Person> set = new HashSet<Person>();
Person p1=new Person(10);
Person[] p = new Person[2];
set.add(p1);//set中一个元素
p1.setAge(11);//p1的age改成11
System.out.println(set.remove(p1));//移走P1,输出false,说明p1没有被移走,这是为什么?
System.out.println(set.contains(p1));//输出false,集合中不包含p1,说明p1不在集合中,p1究竟去哪里了?
System.out.println(set.size());//结果为1.说明p1没有被移走,究竟存的是谁?怎么拿出来?
p= set.toArray(p);//将set中的所有元素变成p数组
System.out.println(p[0]);//输出为11,说明set集合中还有年龄为11的这个对象
}
}
class Person {
int age;
Person(int age){
this.age=age;
}
public void setAge(int age){
this.age=age;
}
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
if(this.age==p.age){
return true;
}
return false;
}
@Override
public int hashCode(){
return age+age*34;}
@Override
public String toString(){
return String.valueOf("person"+age);
}
}
复制代码
作者:
H._张_♂
时间:
2014-4-11 14:24
本帖最后由 H._张_♂ 于 2014-4-11 14:25 编辑
。。。手残自己回复了。。悲剧
作者:
491138002
时间:
2014-4-11 15:47
remove()是Set类的方法,Set.remove()是Person的方法,是要删除参数值相同的元素
可以用list类来做就可以达到你要的效果,或是用ArrayList类来也可以
作者:
NO?
时间:
2014-4-11 15:56
当你学到后面时候你就会知道为什么?hashset的很多方法是根据hashcode()和equals()来寻找你要判断、寻找、删除的元素,开始你指定的p1的age属性是10;然后把p1存到集合,后面又改变了p1 的age属性为11;你这么一改,hashcode算出来的值就会不一样,集合会按照现在的hashcode运算的值去寻找p1,而p1存在了以前的位置上,一直没有改变。集合怎么找的到。虽然对象还是一个。
import java.util.HashSet;
import java.util.Set;
public class HashCodeTest {
/**
* 这是一个要用来测试HashCode的类
* @author 张三
* @version v1.1
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Person> set = new HashSet<Person>();
Person p1=new Person(10);
Person[] p = new Person[2];
set.add(p1);//set中一个元素
p1.setAge(11);[color=Sienna]//问题在这、、、//、、、、、、、、、、、、、、、、、、、[/color]
System.out.println(set.remove(p1));//移走P1,输出false,说明p1没有被移走,这是为什么?
System.out.println(set.contains(p1));//输出false,集合中不包含p1,说明p1不在集合中,p1究竟去哪里了?
System.out.println(set.size());//结果为1.说明p1没有被移走,究竟存的是谁?怎么拿出来?
p= set.toArray(p);//将set中的所有元素变成p数组
System.out.println(p[0]);//输出为11,说明set集合中还有年龄为11的这个对象
}
}
class Person {
int age;
Person(int age){
this.age=age;
}
public void setAge(int age){
this.age=age;
}
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
if(this.age==p.age){
return true;
}
return false;
}
@Override
public int hashCode(){
return age+age*34;}
@Override
public String toString(){
return String.valueOf("person"+age);
}
}
复制代码
作者:
呆呆沙师妹
时间:
2014-4-11 15:58
本帖最后由 呆呆沙师妹 于 2014-4-11 16:10 编辑
这个问题毕向东老师的基础视频中提到过。
hashSet集合调用实例对象的hashCode方法和equals方法保证集合中元素的唯一性。
与hash有关的集合类中使用对象hashCode方法计算出的hashCode值作为索引,来提高查找定位效率。
在Person类中,hashCode值等于age+age*34,创建p1实例时,hashCode值为350,当p1添加进集合后,修改了p1的age值为11,此时对p1进行删除时,重新计算的hashCode值为385,集合中内p1的hashCode值依然为350,故而查找删除失败。
你可以试试将p1的age值重新修改为10,删除就能正常进行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2