我正在尝试处理游戏的控制器(如分屏游戏,许多控制器,一个屏幕/游戏),但不知怎的,我不知道这样做的最佳做法是什么?目前我试图通过套接字的IP地址来命令播放器对象,这样每个控制器都可以控制严格的播放器,但不知怎的,我将相同的IP绑定到多个播放器(通过引用错误复制?):
public class PlayerMapper {
public static final Logger LOGGER = LogManager.getLogger(PlayerMapper.class.getName());
private static final Map<byte[], Player> players = new HashMap<>();
public static synchronized Player getPlayer(final InetAddress paramInetAddress) {
return players.get(paramInetAddress.getAddress());
}
public static synchronized void addPlayer(final InetAddress paramInetAddress, final String paramName) {
final byte[] address = paramInetAddress.getAddress();
final Player player = players.get(address);
if (null == player) {
players.put(address, new Player(paramName));
} else {
LOGGER.debug("Player \"{}\" already connected!", player.getName());
}
}
}
使用相同的“控制器”又名“127.0.0.1”进行5次测试会导致5个不同的播放器,HashMap中的键值都相同,但参考不同,即使我复制了字节IP地址的数组?
答案 0 :(得分:3)
数组继承默认的Object hashCode()
和equals()
方法。 Object#hashCode()
从对象的内存地址生成哈希码,Object#equals()
只比较对象标识(它们是同一个对象)。
因此,即使两个数组具有相同的内容,它们也会被视为HashMap
中的不同键。要将数组用作HashMap
键,您必须将它们包装在对象中,并提供自定义hashCode()
和equals()
实现。
答案 1 :(得分:0)
数组没有equals
方法(嗯,他们这样做,但实现是脑死亡的),所以你最终比较引用,它们是不同的。
尝试使用paramInetAddress
本身作为密钥,而不是.getAddress