Будут ли объекты значений в копии статического ConcurrentHashMap ссылаться на те же объекты значений, что и оригинал?
У меня есть вопрос из двух частей.
Я имею: 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;
}
Q: Будут ли внесены изменения в s
отражаться в servers
?
Q: будет 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
будет содержать серверы с Integer
ID в диапазоне от 0 и далее. Когда я перебираю их в цикле for, порядок меня не беспокоит.
2 ответа
Да и да. Это может быть даже невозможно скопировать Server
объекты, насколько этот код касается. Это не имеет ничего общего с ConcurrentHashMap
и все, что связано с тем, как ссылки работают в Java.
servers
содержат только ссылки наServer
объекты: все изменения, которые вы вносите в базовые объекты, будут отражены вservers
тоже.- Java передает ссылки по значению, так что да.
Обратите внимание, что если ваш код не синхронизирован должным образом, вы можете увидеть устаревшие и / или несовместимые Server
объекты в вашем коде, но это другая проблема.