我有两个问题。
我有:
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
将包含{0}以及从{0}开始的Integer
ID的服务器。当我在for循环中迭代它们时,顺序对我来说不是一个问题。
答案 0 :(得分:3)
是的,是的。就此代码而言,复制Server
对象甚至可能可能。这与ConcurrentHashMap
无关,也与引用在Java中的工作方式有关。
答案 1 :(得分:2)
servers
仅保留对Server
个对象的引用:您对基础对象所做的任何修改都将反映在servers
中。请注意,如果您的代码未正确同步,您可能会在代码中看到陈旧和/或不一致的Server
对象,但这是一个不同的问题。