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
ценности.)