Будут ли объекты значений в копии статического 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.

  1. servers содержат только ссылки на Server объекты: все изменения, которые вы вносите в базовые объекты, будут отражены в servers тоже.
  2. Java передает ссылки по значению, так что да.

Обратите внимание, что если ваш код не синхронизирован должным образом, вы можете увидеть устаревшие и / или несовместимые Server объекты в вашем коде, но это другая проблема.

Другие вопросы по тегам