大家看看我这代码打印equals是为什么,我想不通.第二次打印了两次更我想不通,
import java.util.HashSet;
import java.util.Set;
public class lessons2 {
public static void main(String[] args) {
testForHashSet2();
}
public static void testForHashSet2() {
System.out.println("----- testForHashSet2 -----------");
HashSet<MyObject2> set = new HashSet<MyObject2>();
MyObject2 obj = null;
for (int i = 0; i < 3; i++) {
obj = new MyObject2("java2000" + i, i);
set.add(obj);
System.out.println(set.size()+obj.getName());
}
}
}
class MyObject2 {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
MyObject2(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
System.out.println(",,equals");
if (obj == null || !(obj instanceof MyObject2)) {
return false;
}
MyObject2 o = (MyObject2) obj;
return this.age == o.age && this.name.equals(o.name);
}
public int hashCode() {
return 1;
}
}
import java.util.HashSet;
import java.util.Set;
public class lessons2 {
public static void main(String[] args) {
testForHashSet2();
}
public static void testForHashSet2() {
System.out.println("----- testForHashSet2 -----------");
HashSet<MyObject2> set = new HashSet<MyObject2>();
MyObject2 obj = null;
for (int i = 0; i < 3; i++) {
obj = new MyObject2("java2000" + i, i);
set.add(obj);
System.out.println(set.size()+obj.getName());
}
}
}
class MyObject2 {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
MyObject2(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
System.out.println(",,equals");
if (obj == null || !(obj instanceof MyObject2)) {
return false;
}
MyObject2 o = (MyObject2) obj;
return this.age == o.age && this.name.equals(o.name);
}
public int hashCode() {
return 1;
}
}
----- testForHashSet2 -----------
1java20000
,,equals
2java20001
,,equals
,,equals
3java20002
,另外它为什么在java2000这后出现,而不是在这之前出现
还有2java20001之后为什么它就特殊出现两个呢
在put的时候他不是随便就put的,它还要比较key是不是相等了
所以就调用了equals方法,每次put都要检查一下
因为Map的key不能重复
第二次,里面有一个对象,调用一次equals方法,所以输出一次,,equals 再输出2java20001
第三次,里面有两个对象,调用二次equals方法,所以输出两次,,equals 再输出3java20002
如果楼主不想打印equals,可以吧hashcode方法重写一下,如下:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}打印结果:
----- testForHashSet2 -----------
1java20000
2java20001
3java20002
import java.util.Set;
public class TestHashSet {
public static void main(String[] args) {
testForHashSet2();
}
public static void testForHashSet2() {
System.out.println("----- testForHashSet2 -----------");
HashSet set = new HashSet();
MyObject2 obj = null;
for (int i = 0; i < 3; i++) {
obj = new MyObject2("java2000" + i, i);
set.add(obj);
System.out.println(set.size()+obj.getName());
}
}
}
class MyObject2 {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
MyObject2(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
System.out.println(",,equals");
if (obj == null || !(obj instanceof MyObject2)) {
return false;
}
MyObject2 o = (MyObject2) obj;
return this.age == o.age && this.name.equals(o.name);
}
public int hashCode() {
return this.name.hashCode() + this.age * 1000; //确保当名字和年龄不相同时hashcode不同,与 equals方法实现一致
}
} 这个程序的输出还是
----- testForHashSet2 -----------
1java20000
2java20001
3java20002
说明即使hashcode不一样,还是调用了equals方法
System.out.println(",,equals");
if (obj == null || !(obj instanceof MyObject2)) { //看这里,如果equals()方法被调用,将打印 ,,equals,然而结果中没有打印!!
return false;
}
MyObject2 o = (MyObject2) obj;
return this.age == o.age && this.name.equals(o.name);
}