Присвоение одного набора другому и когда выполняется очистка. Оба набора очищаются
1. Первоначально созданы два набора. 2. Добавлены элементы в один набор. 3. Присвоить один набор другому. 4. Если очистка вызывается на одном наборе, оба набора очищаются.
Кто-нибудь может помочь в выяснении проблемы?
import java.util.HashSet;
import java.util.Set;
public class SetOperation {
Set<Integer> a = new HashSet<Integer>();
Set<Integer> b = new HashSet<Integer>();
void assignAndClear(){
a.add(3);
a.add(7);
a.add(5);
a.add(19);
a.add(99);
System.out.println("a:" +a );
System.out.println("b:" +b );
b=a;
System.out.println("After assigning");
System.out.println("a:" +a );
System.out.println("b:" +b );
b.clear();
System.out.println("after clearing");
System.out.println("a:" +a );
System.out.println("b:" +b );
}
public static void main(String[] args) {
SetOperation sd = new SetOperation();
sd.assignAndClear();
}
}
2 ответа
Когда вы присваиваете один набор другому, новый набор не создается, скорее создается новая ссылка, которая указывает на существующий набор. Итак, все изменения, которые вы вносите в набор, используя a
будет отражено в b
,
Это верно для any
Изменчивый объект
Но не для Immutable
Объекты.
Например, рассмотрим случай String
: -
String s = "a";
String s1 = s; // Both `s` and `s1` points to `"a"`
s1 = "b"; // Only s1 will point to "b". `s` still points to "a".
В приведенном выше случае изменение не отражается на всех ссылках, потому что Strings
неизменны. Таким образом, любое изменение, которое вы вносите в строку, создаст new object
,
Но если у вас есть mutable object
.: -
Set<String> set = new HashSet<String>();
Set<String> set3 = new HashSet<String>(); // A different set object
Set<String> set2 = set; // Point to the same set object as "set"
set2.clear(); // Will clear the actual object. Pointed by "set"
// And thus both the reference pointing to that object, will see the change.
set3 = set; // Change reference `set3` to point to the `Set object` pointed by `set`
set3.add("a"); // Will change `set` also.
Если вы хотите создать копию своего набора. Сделай это так: -
Set<String> set1 = new HashSet<String>();
Set<String> set3 = new HashSet<String>(set1);
Вы перезаписываете ссылку на ячейку памяти исходного хэш-набора в b
, Вам нужно скопировать элементы a
в b
не назначать a
в b
,
Пытаться:
b = new HashSet<Integer>(a);