老师我想问下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的代码注释,我的代码差不多完成编程大部分的功能,老师顺带帮忙检查下。
正在回答
同学你好,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方法来比较,就不会出现这种由于地址差异造成的问题。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
同学你好,1、return比较两对象的属性时用"=="时,在songTest和playListTest中没有添加成功是因为这些String类型的字符在创建时,在内存中的地址也是一样的,所以在equald方法中使用==判断时,它们是一致的,例如:
所以此时添加,判断这两个对象的内存地址是一样的,所以条件成立,对应HashSet集合不会添加相同属性的对象。
而在测试的主方法中,由于是不同时间创建等多种因素的影响,所以此时对应属性的内存地址是不同的,这时再使用==判断,内存地址不同,就判断为属性不同,此时就可以向HashSet集合中添加进去相同属性的对象了。例如:
综上所述,在Song类中的equals方法里,对于String类型的属性,要使用String类下的equals方法比较,而不是==来比较,因为==如果是对象属性,只比较地址,而不比较内容。
2、测试同学代码,在修改播放列表中的歌曲 中,建议如下:
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星