首页 > 代码库 > 【java】HashSet

【java】HashSet

技术分享
 1 package com.tn.hashSet;
 2 
 3 public class Person {
 4     private int id;
 5     private String name;
 6     private String birthday;
 7     public Person(int id, String name, String birthday) {
 8         super();
 9         this.id = id;
10         this.name = name;
11         this.birthday=birthday;
12     }
13     public int getId() {
14         return id;
15     }
16     public void setId(int id) {
17         this.id = id;
18     }
19     public String getName() {
20         return name;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public String getBirthday() {
26         return birthday;
27     }
28     public void setBirthday(String birthday) {
29         this.birthday = birthday;
30     }
31     @Override
32     public String toString() {
33         return id +"-" + name;
34     }
35     @Override
36     public int hashCode() {
37         final int prime = 31;
38         int result = 1;
39         result = prime * result + id;
40         return result;
41     }
42     @Override
43     public boolean equals(Object obj) {
44         if (this == obj)
45             return true;
46         if (obj == null)
47             return false;
48         if (getClass() != obj.getClass())
49             return false;
50         Person other = (Person) obj;
51         if (id != other.id)
52             return false;
53         return true;
54     }
55 }
Person.java
技术分享
 1 package com.tn.hashSet;
 2 
 3 import java.util.HashSet;
 4 import java.util.Iterator;
 5 
 6 public class HashSetTest {
 7     /*
 8      * HashSet的底层是HashMap
 9      * 注意:
10      * 1.必须根据实际情况确定唯一标识来重写hashCode和equals方法
11      * 2.对象一旦放入HashSet容器中,则唯一标识不能再修改,否则移除不了。
12      * 3.HashSet存放对象时对象位置和对象hashCode算法等到的值相关,查找移除都需要用到hashCode算法
13      *       值,如果唯一标识被修改则hashCode算法值会和以前不一样,对象位置就改变了,导致找不到对象,长此以往,
14      *  导致内存泄露。
15      */
16     public static void main(String[] args){
17         HashSet<Person> persons=new HashSet<Person>();
18         Person p1=new Person(1001,"张三","1990-1-1");
19         Person p2=new Person(1002,"李四","1988-2-2");
20         Person p3=new Person(1003,"王五","1989-3-3");
21         persons.add(p1);
22         persons.add(p2);
23         persons.add(p3);
24         
25         System.out.println(persons);//即打印容器中每个对象toString的返回值
26         
27         //foreach遍历
28         for(Person p:persons)
29             System.out.println(p);
30                 
31         //迭代器遍历
32         Iterator<Person> iterator=persons.iterator();
33         while(iterator.hasNext())
34             System.out.println(iterator.next());
35         
36         /*不能用for遍历,因为HaseSet无get方法。
37         for(int i=0;i<persons.size();i++){
38             System.out.println(persons.get(i));
39         }*/
40         
41         //HashSet不能加重复对象
42         System.out.println(persons.size());
43         persons.add(p3);
44         System.out.println(persons.size());
45         
46         /*
47          * 若不重写Person的hashCode和equals方法p4和p3会因地址不同被Object的equals方法判断为
48          * 两个不同的对象,若重写hashCode和equals,则被会认为同一个对象。
49          */
50         Person p4=new Person(1003,"王五","1989-3-3");
51         
52         persons.add(p4);
53         System.out.println(persons.size());//不重写hashCode和equals打印4,重写打印3
54         
55         boolean b;
56         b=persons.remove(p1);
57         System.out.println(b);
58         System.out.println(persons.size());
59         p2.setId(1000);//HashSet容器中的对象唯一标识被改,导致hashCode和equals算法值和以前不一样
60         b=persons.remove(p2);//移除失败直接返回false,程序不会报错。
61         System.out.println(b);
62         System.out.println(persons.size());
63     }    
64 }
HashSetTest.java

 

【java】HashSet