1 package com.lv.study.pm.first; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 //无序不可重复 7 public class TestSet { 8 9 public static void main(String[] args) { 10 11 //set TreeSet HashSet 12 13 Set<String>set=new HashSet<String>(); 14 15 set.add("jck");//往set集合里面添加一个元素 16 set.add("jcka"); 17 set.add("rose"); 18 set.add("tom"); 19 set.add("jck");//添加重复元素是不会报错的 当做没有看到 20 21 System.out.println(set.size()); 22 23 Set<Person>setPer=new HashSet<Person>(); 24 25 Person p1=new Person("jack",12); 26 Person p2=new Person("jack",22); 27 Person p3=new Person("rose",12); 28 Person p4=new Person("tom",122); 29 30 ////如果重写自己的equals方法 就按照自己的规则去比较 31 setPer.add(p1); 32 setPer.add(p2);//如果没有重写自己的equals方法 就认为你俩的地址不一样就不是同样的对象 33 setPer.add(p3); 34 setPer.add(p4); 35 36 System.out.println(setPer.size()); 37 38 for(Person p:setPer){ 39 System.out.println(p); 40 } 41 } 42 43 } 44 45 46 class Person{ 47 private String name; 48 private int age; 49 50 //有参构造器 51 public Person(String name, int age) { 52 this.name = name; 53 this.age = age; 54 } 55 56 //无参构造器 57 public Person() { 58 } 59 60 61 //我们的HashSet,在判断重复的元素的时候 62 //1 判断这两个内容的hash值是不是相等个 相等有可能发生了hash碰撞 不相等就不是同一个元素 63 //2 如果发生hash碰撞 就会调用equals方法 来确定这个对象里面的字段是否一致 64 65 @Override 66 public int hashCode() { 67 final int prime = 31; 68 int result = 1; 69 result = prime * result + age; 70 result = prime * result + ((name == null) ? 0 : name.hashCode()); 71 return result; 72 } 73 74 @Override 75 public boolean equals(Object obj) { 76 if (this == obj) 77 return true; 78 if (obj == null) 79 return false; 80 if (getClass() != obj.getClass()) 81 return false; 82 Person other = (Person) obj; 83 // if (age != other.age) 84 // return false; 85 if (name == null) { 86 if (other.name != null) 87 return false; 88 } else if (!name.equals(other.name)) 89 return false; 90 return true; 91 } 92 93 @Override 94 public String toString() { 95 return "Person [name=" + name + ", age=" + age + "]"; 96 } 97 98 99 100 }