HashSet的remove方法(一道面试题)
1 public class CollectionTest { 2 3 @Test 4 public void test3(){ 5 HashSet set = new HashSet(); 6 Person p1 = new Person(1001,"AA"); 7 Person p2 = new Person(1002,"BB"); 8 9 set.add(p1); 10 set.add(p2); 11 System.out.println(set); 12 //输出2个值[person={1001,"AA"},person={1002,"BB"}] 13 14 p1.name = "CC"; 15 set.remove(p1); 16 System.out.println(set); 17 //输出两个值[person={1001,"CC"},person={1001,"BB"}] 18 19 set.add(new Person(1001,"CC")); 20 System.out.println(set); 21 //输出三个值 [person={1001,"CC"},person={1002,"BB"},person={1001,"CC"] 22 23 set.add(new Person(1001,"AA")); 24 System.out.println(set); 25 //输出四个值 [person={1001,"CC"},person={1002,"BB"},person={1001,"CC",person={1001,"AA"] 26 27 } 28 }
Set类remove方法删除元素的原则:根据哈希值来删除元素
Set类的添加原则:首先比较哈希值,如果哈希值相同就使用equals()方法来判断,相同删掉,不同添加。
例如:
第二个输出:因为修改了p1的属性变量,使p1的哈希值发生改变。故删除元素时,大概率是删除不掉p1的值
第三个输出:添加了新的对象,用cc的属性来计算哈希值。之前cc是由aa改变的,地址没有发生变化。故cc的哈希地址存在,可以输出三个对象
第四个输出:添加了aa对象,和最开始的对象相同,哈希值相同。比较equals(),属性不同。故能添加aa对象,输出4个对象