首页 > 代码库 > 【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 }
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 }
【java】HashSet
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。