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));

    }

}

http://img.mukewang.com/climg/5d5615a80001830b11240162.jpg

写回答

1回答

好帮手慕雪

2019-08-16

嗯对,因为你的 hashCode() 判断是的三个属性,而equals()判断的是两个属性。你要统一下,要么都是两个属性,要么都是三个属性。祝:学习愉快

0

0 学习 · 2907 问题

查看课程