老师我想问下equasl方法的问题 ,问题在文末。

老师我想问下equasl方法的问题 ,问题在文末。

package com.jiubx.player;
//歌曲类
public class Song {
 private String id;//id
 private String name;//歌曲名称
 private String singer;//演唱者
 public Song(String id,String name,String singer) {
  this.setId(id);
  this.setName(name);
  this.setSinger(singer);
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.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;
 }
 //重写hashCode()方法,不改变格式
 @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;
 }
 //重写equals()方法,比较两对象的属性是否全部相等
 @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))&&(song.getSinger().equals(singer));
   return (song.getId()==id)&&(song.getName()==name)&&(song.getSinger()==singer);
  }
  return false;
 }
 @Override
 public String toString() {
  return "歌曲id:" + id + ", 歌曲名称:" + name + ", 演唱者:" + singer ;
 }
 
}

package com.jiubx.player;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
//播放列表类
public class PlayList {
 private String playListName;//播放列表名称
 private Set<Song> songSet=null;//存放song对象的set集合
 Iterator<Song> it;//在迭代器中存放songSet集合中所有元素
 public PlayList(String playListName) {
  this.setPlayListName(playListName);
  songSet=new HashSet<Song>();//实例化set接口的实现类的对象
 }
 public String getPlayListName() {
  return playListName;
 }
 public void setPlayListName(String playListName) {
  this.playListName = playListName;
 }
 //向播放列表中添加song对象
 public void addToPlayList(Song song) {
  boolean flag=false;//判断该歌曲是否在播放列表中存在
  for(Song s:songSet) {
   //System.out.println(s.equals(song));
   if(s.equals(song)) {
    flag=true;
    System.out.println("该歌曲在播放列表中已存在,添加歌曲失败!");
   }
  }
  if(!flag) {
   songSet.add(song);
   System.out.println("向播放列表中添加歌曲"+song.getId()+"成功!");
  }
 }
 //删除播放列表中的歌曲
 public void deleteSongInPlayList(String id) {
  boolean flag=false;//判断播放列表中是否有此歌曲
  //如果播放列表中没有song对象(歌曲)则结束方法
  if(songSet.isEmpty()) {
   System.out.println("播放列表为空,无法删除歌曲!");
   return;
  }
  //使用增强型for循环遍历set集合,将集合中的元素与id进行比较
  for(Song song:songSet) {
   if(song.getId().equals(id)) {
    songSet.remove(song);
    System.out.println("删除歌曲id\""+id+"\"成功");
    flag=true;
    break;    //不用break避免可能有重复id,但会出现并发异常,用break只会删除重复id歌曲中先查询到的第一首歌曲
   }
  }
  if(!flag) {
   System.out.println("播放列表中没有此歌曲id,删除歌曲id\""+id+"\"失败!");
  }
 }
 //修改播放列表中的歌曲
 public void updateSongInPlayList(String id,Song song) {
  boolean flag=false;//判断播放列表中是否有此歌曲
  //如果播放列表中没有song对象(歌曲)则结束方法
  if(songSet.isEmpty()) {
   System.out.println("播放列表为空,无法修改歌曲!");
   return;
  }
  //使用增强型for循环遍历set集合,将集合中的元素与id进行比较
  for(Song song1:songSet) {
   if(song1.getId().equals(id)) {
    Scanner sc=new Scanner(System.in);
    songSet.remove(song1);//删除要修改的歌曲
    addToPlayList(song);
    System.out.println("修改歌曲id\""+id+"\"成功");
    flag=true;
    break;   //不用break避免可能有重复id,不用会出现并发异常,用break只会修改重复id歌曲中先搜索到的歌曲
   }
  }
  if(!flag) {
   System.out.println("播放列表中没有此歌曲id,修改歌曲id\""+id+"\"失败!");
  }
 }
 //通过歌曲id查询播放列表中的歌曲
 public void searchSongInPlayListById(String id) {
  boolean flag=false;//判断播放列表中是否有此歌曲
  //如果播放列表中没有song对象(歌曲)则结束方法
  if(songSet.isEmpty()) {
   System.out.println("播放列表为空,无法查询歌曲!");
   return;
  }
  //使用增强型for循环遍历set集合,将集合中的元素与id进行比较
  for(Song song:songSet) {
   if(song.getId().equals(id)) {
    System.out.println("查询歌曲id\""+id+"\"成功,歌曲的信息是:");
    System.out.println(song);
    flag=true;
    //break;    //不用break避免可能有重复id
   }
  }
  if(!flag) {
   System.out.println("播放列表中没有此歌曲id,查询歌曲id\""+id+"\"失败!");
  }
 }
 //通过歌曲名称查询播放列表中的歌曲
 public void searchSongInPlayListByName(String name) {
  boolean flag=false;//判断播放列表中是否有此歌曲
  //如果播放列表中没有song对象(歌曲)则结束方法
  if(songSet.isEmpty()) {
   System.out.println("播放列表为空,无法查询歌曲!");
   return;
  }
  //使用增强型for循环遍历set集合,将集合中的元素与id进行比较
  for(Song song:songSet) {
   if(song.getName().equals(name)) {
    System.out.println("查询歌曲名称\""+name+"\"成功,歌曲的信息是:");
    System.out.println(song);
    flag=true;
    //break; //不用break避免可能有重复name
   }
  }
  if(!flag) {
   System.out.println("播放列表中没有此歌曲名称,查询歌曲名称\""+name+"\"失败!");
  }
 }
 //显示播放列表中所有歌曲
 public void showAllSong() {
  if(songSet.isEmpty()) {
   System.out.println("播放列表为空!");
  }
  for(Song song:songSet) {
   System.out.println(song);
  }
 }
 public Set<Song> getSongSet() {
  return songSet;
 }
 public void setSongSet(Set<Song> songSet) {
  this.songSet = songSet;
 }
 
}

package com.jiubx.player;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

//播放器类
public class PlayListCollection {
 private Map<String,PlayList> playlistMap;
 Set<String> keySet;
 public PlayListCollection() {
  playlistMap=new HashMap<String,PlayList>();
 }
 //向播放器中添加播放列表
 public void addPlayListToMap(PlayList playlist) {
  playlistMap.put(playlist.getPlayListName(), playlist);
 }
 //从播放器删除播放列表
 public void deletePlayListInMap(PlayList playlist) {
  boolean flag=false;//判断播放器中是否有此播放列表
  keySet=playlistMap.keySet();
  //增强型for遍历Set集合中元素,并将之与要删除的播放列表对比
  for(String s:keySet) {
   if(s.equals(playlist.getPlayListName())) {
    playlistMap.remove(s);
    System.out.println("删除播放列表\""+s+"\"成功!");
    flag=true;
    break;
   }
  }
  if(!flag) {
   System.out.println("播放器中没有播放列表"+playlist.getPlayListName());
  }
 }
 //通过名字查询播放列表信息
 public PlayList searchPlayListInMapByName(String playListName) {
  keySet=playlistMap.keySet();
  //增强型for遍历Set集合中元素,并将之与要查询的播放列表对比
  for(String s:keySet) {
   if(s.equals(playListName)) {
    //playlistMap.get(s).showAllSong();
    return playlistMap.get(s);
   }
  }
  return null;
 }
 //显示所有播放列表名称
 public void showPlayListNameInMap() {
  Set<Entry<String,PlayList>> set=playlistMap.entrySet();
  for(Entry<String,PlayList> entry:set) {
   System.out.println(entry.getKey());
  }
 }
 public Map<String, PlayList> getPlaylistMap() {
  return playlistMap;
 }
 public void setPlaylistMap(Map<String, PlayList> playlistMap) {
  this.playlistMap = playlistMap;
 }
 
}

package com.jiubx.player;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

//播放器测试类
public class PlayerTest {
 // 测试Song类
 public void songTest() {
  Song song1 = new Song("s001", "左手指月", "萨顶顶");
  Song song2 = new Song("s002", "阿刁", "赵雷");
  Song song3 = new Song("s003", "黑暗骑士", "林俊杰");
  Song song4 = new Song("s003", "黑暗骑士", "林俊杰");
  Set<Song> ss = new HashSet<>();
  ss.add(song1);
  ss.add(song2);
  ss.add(song3);
  for (Song s : ss) {
   System.out.println(s.equals(song4));
  }
 }
 // 测试PlayList类
 public void playListTest() {
  Song song1 = new Song("s001", "左手指月", "萨顶顶");
  Song song2 = new Song("s002", "阿刁", "赵雷");
  Song song3 = new Song("s003", "黑暗骑士", "林俊杰");
  Song song4 = new Song("s003", "黑暗骑士", "林俊杰");
  PlayList playlist = new PlayList("主播放列表");
  playlist.addToPlayList(song1);
  playlist.addToPlayList(song2);
  playlist.addToPlayList(song3);
  playlist.addToPlayList(song4);
  System.out.println("删除前播放列表中的歌曲:");
  playlist.showAllSong();
  playlist.deleteSongInPlayList("s001");

  System.out.println("删除后播放列表中的歌曲:");
  playlist.showAllSong();
  System.out.println("通过id查询歌曲:");
  playlist.searchSongInPlayListById("s003");
  playlist.searchSongInPlayListById("s004");
  playlist.searchSongInPlayListByName("阿刁");

 }
 // 测试PlayListCollection类
 public void playListCollectionTest() {
  PlayList mainPlayList = new PlayList("主播放列表");
  mainPlayList.addToPlayList(new Song("s001", "左手指月", "萨顶顶"));
  mainPlayList.showAllSong();
  PlayListCollection plc = new PlayListCollection();
  plc.addPlayListToMap(mainPlayList);
  plc.showPlayListNameInMap();
  plc.searchPlayListInMapByName("主播放列表");
 }
 // 主菜单
 public void mainMenu() {
  System.out.println("****************************************");
  System.out.println("                 **主菜单**             ");
  System.out.println("                 1--播放列表管理            ");
  System.out.println("                 2--播放器管理           ");
  System.out.println("                 0--退出             ");
  System.out.println("****************************************");
 }
 // 播放列表管理菜单
 public void playlistMenu() {
  System.out.println("*******************************************************");
  System.out.println("           **播放列表管理**             ");
  System.out.println("           1--将歌曲添加到主播放列表         ");
  System.out.println("           2--将歌曲添加到普通播放列表     ");
  System.out.println("           3--通过歌曲id查询播放列表中的歌曲         ");
  System.out.println("           4--通过歌曲名称查询播放列表中的歌曲     ");
  System.out.println("           5--修改播放列表中的歌曲         ");
  System.out.println("           6--删除播放列表中的歌曲     ");
  System.out.println("           7--显示播放列表中的所有歌曲         ");
  System.out.println("           9--返回上一级菜单     ");
  System.out.println("********************************************************");
 }
 // 播放器菜单
 public void playerMenu() {
  System.out.println("*********************************************");
  System.out.println("           **播放器管理**             ");
  System.out.println("           1--向播放器添加播放列表            ");
  System.out.println("           2--从播放器删除播放列表           ");
  System.out.println("           3--通过名字查询播放列表信息            ");
  System.out.println("           4--显示所有播放列表名称           ");
  System.out.println("           9--返回上一级菜单             ");
  System.out.println("*********************************************");
 }

 public static void main(String[] args) {
  PlayerTest pt = new PlayerTest();
  Scanner sc = new Scanner(System.in);
  int input1, input2, input3;
  PlayList mainPlaylist = new PlayList("主播放列表");// 实例化主播放列表
  PlayListCollection plc = new PlayListCollection();// 实例化播放器
  plc.addPlayListToMap(mainPlaylist); // 默认将主播放列表添加到播放器中
  PlayList favouritePlayList;// 声明普通播放列表的引用变量
  boolean flag;// 判断播放器中是否存在此播放列表标志
  String playlistName;// 播放列表名称
  Set<String> keySet;// 将播放器中的所有播放列表名存入Set集合
  pt.songTest();
  // pt.playListTest();
  // pt.playListCollectionTest();
  while (true) {
   pt.mainMenu(); // 显示主菜单
   boolean playlistFlag = true;// 播放列表管理循环控制标志
   boolean playerFlag = true;// 播放器管理循环控制标志
   try {
    System.out.println("请输入需要进行的操作所对应的数字:");
    input1 = sc.nextInt();
   } catch (InputMismatchException e) {
    sc.next(); // 将输入错误的数据读取出来
    System.out.println("输入的数据格式有误!请输入数字。");
    continue;
   }
   switch (input1) {
   case 1:// 显示播放列表菜单
    while (playlistFlag) {
     pt.playlistMenu();
     while (true) {
      try {
       System.out.println("请输入需要进行的操作所对应的数字:");
       input2 = sc.nextInt();
       break;
      } catch (InputMismatchException e) {
       sc.next(); // 将输入错误的数据读取出来
       System.out.println("输入的数据格式有误!请输入数字。");
       continue;
      }
     }
     switch (input2) {
     case 1: // 将歌曲添加到主播放列表
      System.out.println("请输入添加的歌曲数目:");
      int count;
      while (true) {
       try {
        count = sc.nextInt();
        if (count < 1) {
         System.out.println("添加歌曲的数目无意义!");
         break;
        }
        break;
       } catch (InputMismatchException e) {
        sc.next(); // 将输入错误的数据读取出来
        System.out.println("输入的数据格式有误!请输入数字。");
        continue;
       }
      }
      for (int n = 1; n <= count; n++) {
       System.out.println("请输入第" + n + "首歌曲的id:");
       String strId = sc.next();
//       boolean idFlag = false;// 判断主播放列表是否存在相同id
//       for (Song song1 : mainPlaylist.getSongSet()) {
//        if (song1.getId().equals(strId)) {
//         idFlag = true;
//         break;
//        }
//       }
//       if (idFlag) {
//        System.out.println("该歌曲id在主播放列表中已存在,请输入其他歌曲id!");
//        n--;
//        continue;
//       }
       System.out.println("请输入第" + n + "首歌曲的名称:");
       String strName = sc.next();
       System.out.println("请输入第" + n + "首歌曲的演唱者:");
       String strSinger = sc.next();
       Song song = new Song(strId, strName, strSinger);
       mainPlaylist.addToPlayList(song);// 向主菜单中添加歌曲
      }
      break;
     case 2:// 将歌曲添加到普通播放列表
      flag = false;// 判断播放器中是否存在此播放列表标志
      System.out.println("请输入要添加歌曲的普通播放列表名称:");
      playlistName = sc.next();
      if (playlistName.equals(mainPlaylist.getPlayListName())) {
       System.out.println("添加失败,请输入要添加歌曲的普通播放列表名称,不能输入主播放列表名称!");
       break;
      }
      keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合
      for (String s : keySet) { // 遍历Set集合
       if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表
        flag = true;
        System.out.println("请输入添加的歌曲数目:");
        int count2;
        while (true) {
         try {
          count2 = sc.nextInt();
          if (count2 < 1) {
           System.out.println("添加歌曲的数目无意义!");
           break;
          }
          break;
         } catch (InputMismatchException e) {
          sc.next(); // 将输入错误的数据读取出来
          System.out.println("输入的数据格式有误!请输入数字。");
          continue;
         }
        }
        for (int n = 1; n <= count2; n++) {
         System.out.println("请输入第" + n + "首歌曲的id:");
         String strId = sc.next();
         boolean idFlag = false;// 判断主播放列表是否存在相同id
         for (Song song1 : mainPlaylist.getSongSet()) {
          if (song1.getId().equals(strId)) {
           idFlag = true;
           break;
          }
         }
         if (idFlag) {
          System.out.println("该歌曲id在主播放列表中已存在,请输入其他歌曲id!");
          n--;
          continue;
         }
         System.out.println("请输入第" + n + "首歌曲的名称:");
         String strName = sc.next();
         System.out.println("请输入第" + n + "首歌曲的演唱者:");
         String strSinger = sc.next();
         Song song = new Song(strId, strName, strSinger);
         // 将要添加的歌曲与主播放列表中歌曲比较
         boolean flag2 = false;// 将要添加的歌曲与主播放列表中歌曲比较的标志
         for (Song song1 : mainPlaylist.getSongSet()) {
          if (song1.equals(song)) {
           plc.getPlaylistMap().get(s).addToPlayList(song1);// 若存在主播放列表中,直接使用
           flag2 = true;
           break;
          }
         }
         if (!flag2) { // 若不存在主播放列表中,则在主播放列表和此普通播放列表都添加此歌曲
          mainPlaylist.addToPlayList(song);
          plc.getPlaylistMap().get(s).addToPlayList(song);
         }
        }
        break;
       }
      }
      if (!flag) {
       System.out.println("播放器中不存在此播放列表,添加歌曲失败!");
      }
      break;
     case 3:// 通过歌曲id查询播放列表中的歌曲
      flag = false;// 判断播放器中是否存在此播放列表标志
      System.out.println("请输入要查询的歌曲id的所在的播放列表名称:");
      playlistName = sc.next();
      keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合
      for (String s : keySet) { // 遍历Set集合
       if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表
        flag = true;
        System.out.println("此播放列表存在,请输入要查询的歌曲id:");
        String strId = sc.next();
        plc.getPlaylistMap().get(s).searchSongInPlayListById(strId);
        break;
       }
      }
      if (!flag) {
       System.out.println("播放器中不存在此播放列表,根据歌曲id查询歌曲失败!");
      }
      break;
     case 4:// 通过歌曲名称查询播放列表中的歌曲
      flag = false;// 判断播放器中是否存在此播放列表标志
      System.out.println("请输入要查询的歌曲名称的所在的播放列表名称:");
      playlistName = sc.next();
      keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合
      for (String s : keySet) { // 遍历Set集合
       if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表
        flag = true;
        System.out.println("此播放列表存在,请输入要查询的歌曲名称:");
        String strName = sc.next();
        plc.getPlaylistMap().get(s).searchSongInPlayListByName(strName);
        break;
       }
      }
      if (!flag) {
       System.out.println("播放器中不存在此播放列表,根据歌曲名称查询歌曲失败!");
      }
      break;
     case 5:// 修改播放列表中的歌曲
      flag = false;// 判断播放器中是否存在此播放列表标志
      System.out.println("请输入要修改歌曲的播放列表名称:");
      playlistName = sc.next();
      keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合
      for (String s : keySet) { // 遍历Set集合
       if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表
        flag = true;
        System.out.println("此播放列表存在,请输入要修改的歌曲id:");
        String songId = sc.next();
        System.out.println("请输入新歌曲的id:");
        String strId = sc.next();
        boolean idFlag = false;// 判断主播放列表是否存在相同id
        for (Song song1 : mainPlaylist.getSongSet()) {
         if (song1.getId().equals(strId)) {
          idFlag = true;
          break;
         }
        }
        if (idFlag) {
         System.out.println("该歌曲id在主播放列表中已存在,修改失败!");
         break;
        }
        System.out.println("请输入新歌曲的名称:");
        String strName = sc.next();
        System.out.println("请输入新歌曲的演唱者:");
        String strSinger = sc.next();
        Song song = new Song(strId, strName, strSinger);
        mainPlaylist.addToPlayList(song);//新歌曲必须添加到主播放列表
        plc.getPlaylistMap().get(s).updateSongInPlayList(songId,song);
        break;
       }
      }
      if (!flag) {
       System.out.println("播放器中不存在此播放列表,修改播放列表中的歌曲失败!");
      }
      break;
     case 6:// 删除播放列表中的歌曲
      flag = false;// 判断播放器中是否存在此播放列表标志
      System.out.println("请输入要删除歌曲的播放列表名称:");
      playlistName = sc.next();
      keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合
      for (String s : keySet) { // 遍历Set集合
       if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表
        flag = true;
        System.out.println("此播放列表存在,请输入要删除的歌曲id:");
        String strId = sc.next();
        plc.getPlaylistMap().get(s).deleteSongInPlayList(strId);
        break;
       }
      }
      if (!flag) {
       System.out.println("播放器中不存在此播放列表,删除播放列表中的歌曲失败!");
      }
      break;
     case 7:// 显示播放列表中的所有歌曲
      System.out.println("请输入要显示歌曲的播放列表名称:");
      playlistName = sc.next();
      if (plc.searchPlayListInMapByName(playlistName) != null) {
       System.out.println("查询播放列表\""+playlistName+"\"成功!播放列表的信息是:");
       plc.getPlaylistMap().get(playlistName).showAllSong();
      } else {
       System.out.println("该播放列表不存在!");
      }
//     Set<Entry<String, PlayList>> entrySet = plc.getPlaylistMap().entrySet();
//     System.out.println("显示播放器中所有播放列表的信息:");
//     for (Entry<String, PlayList> eSet : entrySet) {
//      System.out.println(eSet.getKey() + ":");
//      eSet.getValue().showAllSong();
//     }
      break;
     case 9:// 返回上一级菜单
      playlistFlag = false;
      break;
     default:
      System.out.println("输入数字有误,请重新输入!");
      break;
     }
    }
    break;
   case 2:// 显示播放器菜单
    while (playerFlag) {
     pt.playerMenu();
     while (true) {
      try {
       System.out.println("请输入需要进行的操作所对应的数字:");
       input3 = sc.nextInt();
       break;
      } catch (InputMismatchException e) {
       sc.next(); // 将输入错误的数据读取出来
       System.out.println("输入的数据格式有误!请输入数字。");
       continue;
      }
     }
     switch (input3) {
     case 1:// 向播放器添加播放列表
      System.out.println("请输入要添加的播放列表名称:");
      playlistName = sc.next();
      favouritePlayList = new PlayList(playlistName);
      plc.addPlayListToMap(favouritePlayList);// 向播放器中添加播放列表
      break;
     case 2:// 从播放器删除播放列表
      System.out.println("请输入要删除的播放列表名称:");
      playlistName = sc.next();
      if (playlistName.equals(mainPlaylist.getPlayListName())) {
       System.out.println("主播放列表不能删除!");
       break; // 不能删除主播放列表,结束case语句
      }
      if (plc.searchPlayListInMapByName(playlistName) != null) {
       plc.deletePlayListInMap(plc.getPlaylistMap().get(playlistName));
      } else {
       System.out.println("该播放列表不存在!");
      }
      break;
     case 3:// 通过名字查询播放列表信息
      System.out.println("请输入要通过名字查询的播放列表名称:");
      playlistName = sc.next();
      if (plc.searchPlayListInMapByName(playlistName) != null) {
       System.out.println("查询播放列表\""+playlistName+"\"成功!播放列表的信息是:");
       plc.getPlaylistMap().get(playlistName).showAllSong();
      } else {
       System.out.println("该播放列表不存在!");
      }
      break;
     case 4:// 显示所有播放列表名称
      keySet = plc.getPlaylistMap().keySet();
      System.out.println("播放器中所有播放列表的名称:");
      for (String s : keySet) {
       System.out.println(s);
      }
      break;
     case 9:// 返回上一级菜单
      playerFlag = false;
      break;
     default:
      System.out.println("输入数字有误,请重新输入!");
      break;
     }
    }
    break;
   case 0:// 退出
    return;// 结束程序

   }
  }
 }

}

问题:1.当Song类重写equals方法,其中return比较两对象的属性时用"=="时,在PlayerTest类的主方法中测试songTest方法song3和song4用equals方法比较返回true,所以ss.add(song4)就不会添加进去,同时主方法中向主播放列表中手动添加2个属性完全相同的对象能添加成功,通过显示主播放列表查询都添加成功了。当Song类重写equals方法,其中return比较两对象的属性时用equals方法时,在PlayerTest类的主方法中测试songTest方法结果不变,但是向主播放列表中手动添加2个属性完全相同的对象不能添加成功,为什么会有区别,对象的属性值也是字符串,为什么测试方法songTest中的属性相同对象结果不变,而主方法手动向主播放列表添加相同属性的对象结果不一样?

2.重写equals方法中的return比较用equals方法,并取消向主播放列表添加歌曲中判断不同id的代码注释,我的代码差不多完成编程大部分的功能,老师顺带帮忙检查下。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,1、对象引用song3和song4都是指向new关键字实例化的对象,为什么还会指向同一块内存地址。

        对象song3和song4并没有指向同一块的内存地址,是在调用Song类中重写的equals方法,判断它们的属性是否一样时,id属性的"s003",name属性的"黑暗骑士",这些属性的内存地址一样了,所以最后equals判断它们对象属性相同。

        如上所示的判断结果得到后,HashSet判断它们对象的属性相同,不允许添加。

    2、还有调试时song3和song4对应的Song类型的Value的id不一样

这里的id是debug调试过程中,这个可以简单认定为这是它们的内存地址的简单形式,在debug调试过程中,由Value的id来判断它们的内存地址是否一样。

    3、内存地址是由计算机决定的,受多种因素的影响,这里不用深入研究内存地址是如何生成的,我们只需要知道内存地址是由计算机自动生成的。

    4、String类型也是一个对象,对象的判断需要使用equals方法,如果直接使用==来判断,就会出现如上的地址比较差异的情况,所以在Song类中的equals方法,String类型的属性要使用equals方法来比较,就不会出现这种由于地址差异造成的问题。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • qq_酒半熏_0 提问者 #1
    谢谢老师的回复,让我对equals方法理解更深,但我该怎么理解Song类的测试方法中songTest中new的两个属性值相同对象对应的属性地址相同而测试的主方法中由键盘输入new的两个属性值相同对象对应的属性地址不同呢?只能理解是“由于是不同时间创建等多种因素的影响,所以此时对应属性的内存地址是不同的。”这样么。。。请老师详细解答一下
    2020-02-15 16:28:03
  • 好帮手慕小班 回复 提问者 qq_酒半熏_0 #2
    同学你好,创建对象时的内存地址,涉及了一些底层的知识,现阶段同学先这样理解,在有了一定的基础后,再来深入研究可能会更好一些。如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
    2020-02-15 19:32:09
好帮手慕小班 2020-02-14 21:57:27

同学你好,1、return比较两对象的属性时用"=="时,在songTest和playListTest中没有添加成功是因为这些String类型的字符在创建时,在内存中的地址也是一样的,所以在equald方法中使用==判断时,它们是一致的,例如:

http://img1.sycdn.imooc.com/climg/5e46a3fb0947302111880342.jpg

所以此时添加,判断这两个对象的内存地址是一样的,所以条件成立,对应HashSet集合不会添加相同属性的对象。

而在测试的主方法中,由于是不同时间创建等多种因素的影响,所以此时对应属性的内存地址是不同的,这时再使用==判断,内存地址不同,就判断为属性不同,此时就可以向HashSet集合中添加进去相同属性的对象了。例如:

http://img1.sycdn.imooc.com/climg/5e46a4df0991846c07240201.jpg

综上所述,在Song类中的equals方法里,对于String类型的属性,要使用String类下的equals方法比较,而不是==来比较,因为==如果是对象属性,只比较地址,而不比较内容。

    2、测试同学代码,在修改播放列表中的歌曲 中,建议如下:

http://img1.sycdn.imooc.com/climg/5e46a70d0912470808790520.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 qq_酒半熏_0 #1
    1.老师您说完第一点我对new关键字都不怎么理解了,对象引用song3和song4都是指向new关键字实例化的对象,为什么还会指向同一块内存地址?难道说因为他们创建时间相近就会指向同一内存地址?测试主方法中创建时间相隔大和其他因素new实例化的对象就不指向同一块内存地址?那怎么判断这个时间间隔?还有调试时song3和song4对应的Song类型的Value的id不一样,这个id是什么意思?如您上图调试结果一样,测试Song类的songTest方法中创建song3和song4时间相近,他们的id不一样,他们对应的属性的id是都一样,这样就是都指向同一块内存么?而测试主方法中手动添加两个属性相同的对象,这两个对象的id也不一样,但这两个对象的属性都不一样,这样就是不指向同一块内存么?这就很难理解new关键字创建的属性及值相同的对象如何判断内存地址是不是同一块了
    2020-02-15 10:29:45
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师