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 }