Java - лучший способ обновить значение HashMap - передать по значению / ссылке, связанной

У меня есть HashMap с некоторыми данными. Глядя на следующий код...

HashMap<String, Double[]> map; //Already populated with data

Double[] results = map.get(key);
updateArray(results); //This function makes changes to the results array.
map.put(key, results);

... мой вопрос, нужен ли даже map.put (ключ, результаты)?

Я все еще немного озадачен природой Java с передачей по значению и передачей по ссылке. Для ясности, в первой строке кода мы получаем ссылку на массив Double, правильно? Таким образом, функция во второй строке должна корректно обновлять массив Double в HashMap..., что, по-видимому, сделает map.put() в третьей строке избыточным.

Глядя на чужой код, связанный с HashMap, кажется, что они всегда используют метод put (). Я просто хотел убедиться, что нет никаких непредвиденных последствий этого без метода put ().

Спасибо за любой вклад!

7 ответов

Map.get(Object) просто возвращает ссылку на указанный массив, он не копирует содержимое массива в новый массив. Поэтому любые изменения, которые вы вносите в массив, возвращаемый Map.get(Object) будет отражено в том, что хранится в Map потому что они один и тот же массив. Поэтому это делает вызов Map.put(Object,Object) в этой ситуации совершенно излишним.

Если вы изменяете объект, на который ссылается ссылочное значение, которое вы извлекли из HashMapнет смысла заменять свою запись в том же HashMap,

Если вы изменяете ссылку, вам нужно заменить ее.

map.put(key, results) необходимо только если map.get(key) возвращает ноль, так как в этом случае вы должны создать новый массив и поместить его на карту.

Если map.get(key) возвращает ненулевой массив, updateArray(results) будет обновлять этот массив, и нет необходимости помещать тот же массив снова в Map,

Итак, подведем итог, этот код охватывает все случаи:

HashMap<String, Double[]> map; //Already populated with data
...
Double[] results = map.get(key);
if (results == null) {
    results = new Double[someLength];
    map.put(key, results);
}
updateArray(results);

Теперь, если значение вашей карты было неизменным классом, таким как String или Integer, вам пришлось бы поместить новый экземпляр в карту, чтобы заменить его, так как вы не смогли бы изменить существующее значение.

updateArray(results);

Это обновит объект результатов (который содержит коллекцию неизменяемого объекта, который является объектом String), что означает, что при обновлении значения объекта (results / String) будет создана другая строка с ссылкой на объект результатов. Так что, если вы хотите увидеть изменения под картой, чем снова, вы должны поместить их в карту.

my question is whether or not the map.put(key, results) is even necessary? 

map.put(key,results); // will only reflect the changes in map

Рассмотрим следующий пример.

      Map<String, List<Double>> map = new HashMap<>();

List<Double> list1 = new ArrayList<>(); 
list1.add(1.0); 
list1.add(2.0);

map.put("1", list1);

Теперь, если вы сделаете следующее, карта автоматически обновится. Это потому, что карта содержит ссылку на фактический объект списка. Когда мы обновляем связанный список, карта увидит это изменение без каких-либо обновлений карты.

      List<Double> list2 = map.get("1");
list2.add(10.0);
System.out.println(map);

Вышеупомянутый оператор печати даст следующий результат, который ответит на вопрос.

      {1=[1.0, 2.0, 10.0]}
HashMap<String,String> map = new HashMap<>();
map.put("key", "value");

RestAssured.baseURI = BASE_URL;
RequestSpecification request = RestAssured.given();
request.auth().preemptive().basic("Username", "Password").body(map).put("url");
System.out.println("The value of the field after change is: "  + map.get("key"));

В показанном коде это совершенно не нужно. Возвращаемое значение из map.get(key) хранится в переменной results, а также results никогда не назначается на потом. Следовательно, значение results перешел к map.put() гарантированно совпадает с полученным из map.get(key), Это верно независимо от типа.

Есть небольшая разница с звонками map.put(key, results) и не называть это в этом случае - если results (Результат map.get(key)) является null, map.put(key, results) поставит null Ценность в этом не была раньше. (HashMap позволяет null ценности.)

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