hashCode()和equals()的问题!!
来源:2-1 歌曲类Song
慕沐7214750
2019-08-16 10:32:53
比如我创建了一个歌曲类,属性有歌曲id,歌曲名称,演唱者。我认为判断一首歌曲是否重复应该是判断它的歌曲id或者歌曲名称是否重复,因此我在equals中按照这个想法写进去,但是最后在测试类中得到的结果和我预期不一样,老师的演示只有三个属性都一样时才认为一首歌曲一样。是不是在equals方法中只能按照老师的写才行?那如果想实现我的想法有其他的方法吗?
/**
* 歌曲类
* @author Mr.chen
*
*/
public class Song {
private String Id;//歌曲ID
private String name;//歌曲名
private String singer;//演唱者
public Song(String Id,String name,String singer){
super();
this.Id = Id;
this.name = name;
this.singer = singer;
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "歌曲ID:" + Id + ", 歌曲名称:" + name + ", 演唱者:" + singer;
}
@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());
result = prime * result + ((singer == null) ? 0 : singer.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj.getClass() == Song.class){
Song song = (Song)obj;
return song.getId().equals(Id)||song.getName().equals(name);
}
return false;
}
}import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import priv.chen.musicplayer.Song;
/**
* 歌曲类测试
* @author Mr.chen
*
*/
public class SongTest {
public static void main(String[] args) {
Song song1 = new Song("m001", "123", "杨飞");
Song song2 = new Song("m001", "123", "张飞");
Set<Song> hs = new HashSet<Song>();
hs.add(song1);
hs.add(song2);
Iterator<Song> it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
// System.out.println(song1.equals(song2));
}
}
1回答
嗯对,因为你的 hashCode() 判断是的三个属性,而equals()判断的是两个属性。你要统一下,要么都是两个属性,要么都是三个属性。祝:学习愉快
相似问题