0

我有一个两部分的问题。

我有: private static ConcurrentHashMap<Integer, Servers> servers= null; 我后来填充。在方法getAllServers中,我正在这样做:

public static synchronized ConcurrentHashMap<Integer, Server> getAllServers() {
    ConcurrentHashMap<Integer, Server> toReturn = new ConcurrentHashMap<>();
    for(Integer i = 0; i < servers.size(); i ++ ) {
        Server s = servers.get(i);
        if(s.isAlive()) {
            s.incrementConns();
            toReturn.put(i, s);
        }
    }
    return toReturn;
}

问:修改s会反映在 中servers吗?
问:会toReturn引用与中相同的服务器对象servers吗?如果是这样,任何创建和修改getAllServers返回映射的类是否会修改与 相同的对象servers

更新:@chrylis:Iterator你指的是哪个?你能解释一下为什么 for 循环是一个坏主意吗?我也在其他领域使用它:

Iterator itr = servers.entrySet().iterator();
            Map.Entry pair;
            while(itr.hasNext()) {
                pair = (Map.Entry)itr.next();
                Server s= (Server) pair.getValue();
                ...

但我没有发现任何问题,因为我知道servers将包含Integerid 从 0 开始的服务器。当我在 for 循环中迭代它们时,顺序对我来说不是问题。

4

2 回答 2

3

是的,是的。就这段代码而言,甚至可能无法复制对象。Server这与 . 无关,而是ConcurrentHashMap与 Java 中引用的工作方式有关。

于 2013-08-28T15:56:03.290 回答
2
  1. servers只保留对Server对象的引用:您对基础对象所做的任何修改也将反映在其中servers
  2. Java 通过 value 传递引用,所以是的。

请注意,如果您的代码未正确同步,您可能会Server在代码中看到陈旧和/或不一致的对象,但这是一个不同的问题。

于 2013-08-28T15:57:56.070 回答