Изменение значения после того, как это будет помещено в изменения HashMap, что в HashMap?

У меня была такая же проблема. Окно фокусировки до прокрутки работало на меня.

window.focus();
window.scrollTo(0,800);
35
задан Diego 22 January 2015 в 21:30
поделиться

6 ответов

Здесь происходит то, что вы помещаете указатель на список в хэш-карте, а не на сам список.

Когда вы определяете

List<SomeType> list;

you ' повторное определение указателя на список, а не на сам список.

Когда вы выполняете

map.put(somekey, list);

, вы просто сохраняете копию указателя , а не список.

Если, где-то еще , вы следуете за этим указателем и изменяете объект на его конце, любой, у кого есть этот указатель, по-прежнему будет ссылаться на тот же измененный объект.

См. http://javadude.com/articles/passbyvalue.htm для получения подробной информации о передаче по значению в Java.

46
ответ дан 27 November 2019 в 07:02
поделиться

Java - это передача по ссылке по значению.

Добавление списка в хэш-карту просто добавляет ссылку на хеш-карту, которая указывает на тот же список. Следовательно, прямая очистка списка действительно очистит список, на который вы ссылаетесь в хэш-карте.

12
ответ дан 27 November 2019 в 07:02
поделиться

Блин, народ ... все в Java передается по значению. При передаче объекта значение, которое вы передаете, является ссылкой на объект. В частности, вы передаете копию ссылки на объект. В Java тоже нет указателей, хотя ссылки похожи. Сделай это правильно!

-2
ответ дан 27 November 2019 в 07:02
поделиться

Когда я добавляю что-то в HashMap, это новый объект скопирован и размещен или является ссылка на исходный объект размещено?

Это всегда ссылка на объект. Если вы очистите HashMap, объект будет по-прежнему «живым». Затем объект будет уничтожен сборщиком мусора, если на него больше никто не ссылается. Если вам нужно скопировать его, взгляните на метод Object.clone () и на интерфейс Cloneable

5
ответ дан 27 November 2019 в 07:02
поделиться

Обычно вы всегда имеете дело со ссылками в Java (если вы явно не создаете новый объект самостоятельно с помощью "new" [1]).

Следовательно, это ссылка, а не полная копия объекта вы сохранили на карте, и изменение списка также повлияет на то, что вы видите при просмотре карты.

Это особенность, а не ошибка :)

[1] Пуритане будут включать "clone ()" и сериализацию, но для большинства java-кода "новый" - это способ получения объектов.

1
ответ дан 27 November 2019 в 07:02
поделиться

Попробовать

package test32;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Foo {
    public Foo(int id, String name) {
 this.id=id;
 this.name=name;
    }

    public static void main(String[] args) {
 HashMap strs = new HashMap();

 // create a list of objects
 List ls = new ArrayList();
 ls.add(new Foo(1, "Stavros"));
 ls.add(new Foo(2, "Makis"));
 ls.add(new Foo(3, "Teo"));
 ls.add(new Foo(4, "Jim"));

 // copy references of objects from list to hashmap
 strs.put("1", ls.get(0));
 strs.put("2", ls.get(1));
 strs.put("3", ls.get(2));
 strs.put("4", ls.get(3));

 System.out.println("list before change  : " + ls);
 System.out.println("map before change: " + strs);
 // get an object from the hashmap
 Foo f=strs.get("1");
 // set a different value
 f.setId(5);
 // observe that the differences are reflected to the list and to the hashmap also
 System.out.println("list after change  : "+ls);
 System.out.println("map after change: "+strs);
    }

    private int id;
    public void setId(int id) {
 this.id=id;
    }
    public int getId() {
 return this.id;
    }

    private String name;
    public void setName(String name) {
 this.name=name;
    }
    public String getName() {
 return this.name;
    }

    public String toString() {
 StringBuilder sb = new StringBuilder();
 sb.append(id);
 sb.append("-");
 sb.append(name);
 return sb.toString();
    }
}
1
ответ дан 27 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: