為什么我寫(xiě)了hashcode方法后還是返回false?
代碼
public class Class {
String id;//課程
String name;
public String getId() {
return id;
}
public String getName() {
return name;
}
public void set(String name,String id){
this.id=id;
this.name =name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Class))
return false;
Class other = (Class) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
/////////////////
public void stuCourse(){//測(cè)試學(xué)生選擇課程
System.out.println("測(cè)試學(xué)生選擇課程2");
Student stu=new Student(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
stu.set("小明","1"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
System.out.println("***歡迎學(xué)生"+stu.name+"選課***"); ? ? ? ? ?
? ? Scanner input=new Scanner(System.in); ? ? ? ? ? ? ? ??
? ? while(true){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? System.out.println("請(qǐng)問(wèn)您要選擇多少門(mén)課程?"); ? ? ? ? ? ? ??
? ? int a=input.nextInt(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if(a!=0){
? ? if(a<=courseClass.size()){ ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?for(int i=0;i<a;i++){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? System.out.println("請(qǐng)輸入課程id:"); ? ? ? ? ? ? ?
? ? String kcid=input.next(); ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? for(Class cl:courseClass){ ? ? ? ? ? ? ? ? ? ? ??
? ? if(cl.id.equals(kcid)){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?stu.cla.add(cl);//保存選擇的課程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }else{
? ? ?System.out.println("課程大于課程總量!"); ? ? ? ? ? ? ? ? ?
? ? ? ? ?continue;
? ? ? }
? ? }else{
? ? System.out.println("至少選1門(mén)課程??!");
? ? continue;
? ? }
? ? xuanze();
break;
? ? }
}
public void xuanze(){//輸出總共選擇的課程
? ? for(Class c:Student.cla){
? ? System.out.println("選擇了 課程"+c.id+":"+c.name);
? ? }
? ? }
//set的contains 方法
public void testSetContains(){
System.out.println("測(cè)試學(xué)生已選擇的課程名稱:");
String names=input.next();
Class cla3 = new Class();
cla3.name=names;
System.out.println("取得課程:"+names);
System.out.println("是否包含課程:"+cla3.name+":"+student.cla.contains(cla3));
}
2022-03-23
謝謝你的支持不能再贊同。。。New"Few"。。。
2017-11-19
你重寫(xiě)的hashCode()方法中把id也計(jì)算進(jìn)去了,然而你后面給Class對(duì)象添加屬性的時(shí)候只添加了name屬性的值,id值相當(dāng)于為null,所以肯定和Set集合中有id值的元素的哈希碼是不相等的。
2017-07-04
只要變量名name就好 ,id不用,試試
2017-05-30
你的hashcode()方法有問(wèn)題,你的result結(jié)果有兩個(gè)值(實(shí)際上你只用到的name的):
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
2017-04-17
} else if (!name.equals(other.name))
return false;
return true;
}
這個(gè)地方,直接第一個(gè)false就結(jié)束方法了,第二個(gè)true沒(méi)有執(zhí)行