package com.hxzy.demo001;
import java.util.HashSet;
class RectObject {
public int x;
public int y;
public RectObject(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final RectObject other = (RectObject) obj;
if (x != other.x) {
return false;
}
if (y != other.y) {
return false;
}
return true;
}
}
public class Example {
public static void main(String[] args) {
HashSet<RectObject> set = new HashSet<RectObject>();
RectObject r1 = new RectObject(3, 3);
RectObject r2 = new RectObject(5, 5);
RectObject r3 = new RectObject(3, 6);
set.add(r1);
set.add(r2);
set.add(r3);
for (RectObject rectObject : set) {
System.out.println(rectObject.hashCode());
}
r3.y=7;
for (RectObject rectObject : set) {
System.out.println(r3.equals(rectObject));
System.out.println(rectObject.equals(r3));
}
System.out.println("删除前的大小size:" + set.size());
System.out.println(set.contains(r3));
System.out.println(set.remove(r3));
System.out.println("删除后的大小size:" + set.size());
}
}

根据contains的描述:
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)). Specified by: contains(...) in Set, Overrides: contains(...) in AbstractCollection Parameters: o element whose presence in this set is to be tested Returns: true if this set contains the specified element
既然System.out.println(r3.equals(rectObject)); System.out.println(rectObject.equals(r3));返回在rectObject为r3时返回值都为true;为何set.contains(r3)的返回值为false?
确定是否存在element是根据hashCode确定的,r3.y=7;之后r3的hashcode()返回值改变了,所以set.remove(r3);失败返回值为false;元素个数
不理解。
System.out.println("是否包含元素:");
for (RectObject rectObject : set) {
System.out.println(rectObject.x + ":"+rectObject.y+"--"+set.contains(rectObject));
}
运行这个代码返回值竟然是:true false true;
看到一种说法,hashcode重写应该保证,同一对象的返回值不改变,暂时只能这么理解了。
https://blog.csdn.net/violet_echo_0908/article/details/50152915
hashCode重写原则:

代码中明显违反了该原则