我的输出:
[R(count属性:5), R(count属性:9), R(count属性:-3), R(count属性:-2)]
[R(count属性:-3), R(count属性:9), R(count属性:-3), R(count属性:-2)]
[R(count属性:-3), R(count属性:9), R(count属性:-3), R(count属性:-2)]
hs是否包含count为-3的R对象?false
hs是否包含count为5的R对象?false
[R(count属性:5), R(count属性:9), R(count属性:-3), R(count属性:-2)]
[R(count属性:-3), R(count属性:9), R(count属性:-3), R(count属性:-2)]
[R(count属性:-3), R(count属性:9), R(count属性:-3), R(count属性:-2)]
hs是否包含count为-3的R对象?false
hs是否包含count为5的R对象?false
2.这一句hs.remove(new R(-3)); //你new一个对象又remove等于没有变化,你想remove的话应该写成:
hs.remove(first);
3. hs.contains(new R(-3)); hs.contains(new R(5)); 你刚new的对象又没有add到集合,必然是false。建议你好好复习一下基础知识。把对象的引用和对象的初始化的概念理解清楚。
set集合是无序的,所以你没办法直接查。你可以通过:
Iterator<R> it=hs.iterator();去遍历
while(it.hasNext()){
Object obj=it.next(); //这样就得到了
}
你要想按索引能取到就用List集合。Set取不到。因为Set就没有get(index) 这个方法。
R r1=new R(5);
R r2=new R(-3);
R r3=new R(9);
hs.add(r1);
hs.add(r2);
hs.add(r3);
可以这样查吧?!
System.out.println("hs是否包含r1对象?"+hs.contains(r1));
System.out.println("hs是否包含r2对象?"+hs.contains(r2));
System.out.println("hs是否包含r3?"+hs.contains(r3));
R r1=new R(5);
R r2=new R(-3);
R r3=new R(9);
hs.add(r1);
hs.add(r2);
hs.add(r3);
可以这样查吧?!
System.out.println("hs是否包含r1对象?"+hs.contains(r1));
System.out.println("hs是否包含r2对象?"+hs.contains(r2));
System.out.println("hs是否包含r3?"+hs.contains(r3));
你这样也没法查,Set是无序的,和你add的顺序无关,你放进去也是一个随机顺序。你想按顺序就别用Set。你去查一查详细的学习一下Set集合、List集合和Map集合,你就明白了。
return this.count;
}還是那句,你hashCode寫錯了
是hashCode不是hashcode
==============================================================Iterator<R> it=hs.iterator();
R first=it.next(); first.count=-3;
還有這句極度有問題,set裡的這個元素可以說被你弄壞了
不過要說起來又要從一個很久很久的故事說起,樓主有心情還是自己去看看hash的原理
沒心情深究就記著改變和hash code/equals有關的值前先從 hash map/set里拿出來,改變了再放回去
R r2=new R(-3);
R r3=new R(9);
hs.add(r1);
hs.add(r2);
hs.add(r3);
可以这样查吧?!
System.out.println("hs是否包含r1对象?"+hs.contains(r1));
System.out.println("hs是否包含r2对象?"+hs.contains(r2));
System.out.println("hs是否包含r3?"+hs.contains(r3));
楼主如果这样使用,加上自己的hashCode重写方法名写对了的话,是可以得到true的。因为HashSet提供了contains这个方法,他也是通过将你传入的key进行hash,然后进行将Hashset里面的值进行比较,如果存在你则返回true。
R r1=new R(5);
R r2=new R(-3);
R r3=new R(9);
hs.add(r1);
hs.add(r2);
hs.add(r3);
可以这样查吧?!
System.out.println("hs是否包含r1对象?"+hs.contains(r1));
System.out.println("hs是否包含r2对象?"+hs.contains(r2));
System.out.println("hs是否包含r3?"+hs.contains(r3));
楼主如果这样使用,加上自己的hashCode重写方法名写对了的话,是可以得到true的。因为HashSet提供了contains这个方法,他也是通过将你传入的key进行hash,然后进行将Hashset里面的值进行比较,如果存在你则返回true。
集合里保存的只是对象的引用吧,底层怎么比较的就不用纠结了
R r1=new R(5);
R r2=new R(-3);
R r3=new R(9);
hs.add(r1);
hs.add(r2);
hs.add(r3);
可以这样查吧?!
System.out.println("hs是否包含r1对象?"+hs.contains(r1));
System.out.println("hs是否包含r2对象?"+hs.contains(r2));
System.out.println("hs是否包含r3?"+hs.contains(r3));
楼主如果这样使用,加上自己的hashCode重写方法名写对了的话,是可以得到true的。因为HashSet提供了contains这个方法,他也是通过将你传入的key进行hash,然后进行将Hashset里面的值进行比较,如果存在你则返回true。
集合里保存的只是对象的引用吧,底层怎么比较的就不用纠结了
嗯,是引用。但是同一个对象的引用是相同的。所以利用contains是可以比较的