具有相同地址的两个对象不相等(==)

时间:2017-11-12 18:31:38

标签: java identity

我有Team类型的属性和方法: this.teamflag.getTeam()(这只是该财产的单行吸气者)。

以下是各自的toString()输出: org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftTeam@674e0730org.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

2 个答案:

答案 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方程给出相同的值 - 这是正确的)。总结一下,当你在具有相同属性值的两个对象上使用==时,它们实际上是两个具有不同内存地址的不同对象。