本文主要讲述HashSet的一道作业题,给出示例代码,讲出输出的内容。
一. 示例代码如下:
1 public class HomeWork06 { 2 public static void main(String[] args) { 3 HashSet hashSet = new HashSet(); 4 Person p1 = new Person(1001,"AA"); 5 Person p2 = new Person(1002, "BB"); 6 hashSet.add(p1); 7 hashSet.add(p2); 8 p1.setName("CC"); 9 hashSet.remove(p1); 10 System.out.println(hashSet); 11 hashSet.add(new Person(1001,"CC")); 12 System.out.println(hashSet); 13 hashSet.add(new Person(1001,"AA")); 14 System.out.println(hashSet); 15 16 } 17 } 18 19 class Person { 20 private int id; 21 private String name; 22 23 public Person(int id, String name) { 24 this.id = id; 25 this.name = name; 26 } 27 28 public String getName() { 29 return name; 30 } 31 32 public void setName(String name) { 33 this.name = name; 34 } 35 36 @Override 37 public boolean equals(Object o) { 38 if (this == o) return true; 39 if (o == null || getClass() != o.getClass()) return false; 40 Person person = (Person) o; 41 return id == person.id && Objects.equals(name, person.name); 42 } 43 44 @Override 45 public int hashCode() { 46 return Objects.hash(id, name); 47 } 48 49 @Override 50 public String toString() { 51 return "Person{" + 52 "id=" + id + 53 ", name='" + name + '\'' + 54 '}'; 55 } 56 }
问输出什么?
二. 代码逐句解析
hashSet.add(p1);
hashSet.add(p2);
hashSet 添加了p1,p2 Person类对象。
p1.setName("CC");
hashSet.remove(p1);
将p1的name由AA ->CC,之后调用remove(p1),p1的hash值已经不一样了,因此在修改了p1的name之后,对应的table的索引已经不一样了,所以无法将p1删除。table的元素有:p1和p2
hashSet.add(new Person(1001,"CC"));
在hashSet中添加new Person(1001,”CC”),由1001和CC得到的hash值,与p1的不一样【p1的hash值是由1001,AA得到的】,因此添加成功。此时table中的元素有:p1和p2,new Person(1001,”CC”)。
hashSet.add(new Person(1001,"AA"));
在hashSet中添加new Person(1001,”AA”),由1001和AA得到的hash值,与p1是相同的,即table的索引相同,但是此时p1是1001,”CC”,新添加的对象是1001,”AA”,二者不相同,因此,new Person(1001,”AA”)会添加到p1的后面,形成一条单链表。
在HashSet的table表中共有4个对象。
三. 运行结果
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98959.html