我有Team
类型的属性和方法:
this.team
和flag.getTeam()
(这只是该财产的单行吸气者)。
以下是各自的toString()
输出:
org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftTeam@674e0730
和org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftTeam@674e0730
team == flag.getTeam()
返回false
,而
team.hashCode() == flag.getTeam().hashCode()
返回true
和
team.toString().equals(flag.getTeam().toString())
返回true
public class PlayerTimer extends BukkitRunnable {
Domination plugin;
Player player;
Team team;
public PlayerTimer(Domination plugin, Player player) {
this.plugin = plugin;
this.player = player;
for (Team team : plugin.getWorldGameScoreboards().get(plugin.getCurrentWorld()).getTeams()) {
for (OfflinePlayer offlinePlayer : team.getPlayers()) {
if (offlinePlayer.getPlayer() == player) {
this.team = team;
break;
}
}
if (this.team != null) break;
}
}
@Override
public void run() {
for (Flag flag : plugin.getWorldFlags().get(plugin.getCurrentWorld())) {
for (OfflinePlayer offlinePlayer : team.getPlayers()) {
if (offlinePlayer.isOnline()) {
Player player = offlinePlayer.getPlayer();
double scaledDistance = player.getLocation().distance(flag.getLocation()) / 5; // max 5 blocks away
if (scaledDistance < 1) {
plugin.log(team + " : " + flag.getTeam() + ", " + (team == flag.getTeam()) + "; " + team.equals(flag.getTeam()) + (team.hashCode() == flag.getTeam().hashCode()) + "^ " + team.toString().equals(flag.getTeam().toString());
...
}
}
}
}
}
}
为什么==
没有返回true
?
答案 0 :(得分:2)
我认为误解来自于toString()
方法的实施方式。在对象上调用toString
将生成字符串equivalent to the following value
getClass().getName() + '@' + Integer.toHexString(hashCode())
要实现的关键点是,虽然Object
的哈希码为based on memory location,但String
的哈希码基于String
的{{3}} 。因此,可以使用具有相同内容的不同toString()
对象生成相同的String
输出。
答案 1 :(得分:-1)
答案是您正在尝试比较对象。两个对象可以具有相同的值,但它们在内存中具有不同的位置。当你使用==时,你比较了指针(在内存中有不同的地址)而不是对象值。为此,您应该像在第三行中那样使用.equals()。 如果对象是以相同的“方式”创建的,则hashCode将是相同的(使用相同的类和字段,因此hashCode方程给出相同的值 - 这是正确的)。总结一下,当你在具有相同属性值的两个对象上使用==时,它们实际上是两个具有不同内存地址的不同对象。