У меня была такая же проблема. Окно фокусировки до прокрутки работало на меня.
window.focus();
window.scrollTo(0,800);
Здесь происходит то, что вы помещаете указатель на список в хэш-карте, а не на сам список.
Когда вы определяете
List<SomeType> list;
you ' повторное определение указателя на список, а не на сам список.
Когда вы выполняете
map.put(somekey, list);
, вы просто сохраняете копию указателя , а не список.
Если, где-то еще , вы следуете за этим указателем и изменяете объект на его конце, любой, у кого есть этот указатель, по-прежнему будет ссылаться на тот же измененный объект.
См. http://javadude.com/articles/passbyvalue.htm для получения подробной информации о передаче по значению в Java.
Java - это передача по ссылке по значению.
Добавление списка в хэш-карту просто добавляет ссылку на хеш-карту, которая указывает на тот же список. Следовательно, прямая очистка списка действительно очистит список, на который вы ссылаетесь в хэш-карте.
Блин, народ ... все в Java передается по значению. При передаче объекта значение, которое вы передаете, является ссылкой на объект. В частности, вы передаете копию ссылки на объект. В Java тоже нет указателей, хотя ссылки похожи. Сделай это правильно!
Когда я добавляю что-то в HashMap, это новый объект скопирован и размещен или является ссылка на исходный объект размещено?
Это всегда ссылка на объект. Если вы очистите HashMap, объект будет по-прежнему «живым». Затем объект будет уничтожен сборщиком мусора, если на него больше никто не ссылается. Если вам нужно скопировать его, взгляните на метод Object.clone () и на интерфейс Cloneable
Обычно вы всегда имеете дело со ссылками в Java (если вы явно не создаете новый объект самостоятельно с помощью "new" [1]).
Следовательно, это ссылка, а не полная копия объекта вы сохранили на карте, и изменение списка также повлияет на то, что вы видите при просмотре карты.
Это особенность, а не ошибка :)
[1] Пуритане будут включать "clone ()" и сериализацию, но для большинства java-кода "новый" - это способ получения объектов.
Попробовать
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(); } }