29、HashSet简介
Set的特点
Set里面存储的元素不能重复,没有索引,存取顺序不一致。
package com.monkey1024.set; import java.util.HashSet; /** * Set的特点:元素不能重复,没有索引,存取顺序不一致 * */ public class HashSetTest01 { public static void main(String[] args) { HashSet<String> hs = new HashSet<>(); boolean b1 = hs.add("a"); // 当向set集合中存储重复元素的时候返回为false boolean b2 = hs.add("a"); hs.add("b"); hs.add("c"); hs.add("d"); System.out.println(hs); System.out.println(b1); System.out.println(b2); //可以使用增强for循环或者迭代器进行遍历 //只要能用迭代器遍历就能使用增强for循环遍历 for (String string : hs) { System.out.println(string); } } }
向HashSet中添加自定义的Person对象
package com.monkey1024.bean; /** * Person类 * */ public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 重写toString方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } //重写equals方法 @Override public boolean equals(Object obj) { if(this == obj){ return true; } if(obj instanceof Person){ Person p = (Person)obj; if(this.name.equals(p.getName()) && this.age == p.getAge()){ return true; } } return false; } }
测试类
package com.monkey1024.set; import java.util.HashSet; import com.monkey1024.bean.Person; /** * Set的特点:元素不能重复,没有索引,存取顺序不一致 * 向HashSet中添加自定义类 * */ public class HashSetTest02 { public static void main(String[] args) { HashSet<Person> hs = new HashSet<>(); hs.add(new Person("张三", 20)); hs.add(new Person("张三", 20)); hs.add(new Person("李四", 22)); hs.add(new Person("李四", 22)); hs.add(new Person("李四", 22)); for (Person p : hs) { System.out.println(p); } } }
通过上面代码可以发现打印结果中并没有去除Person中name和age相同的对象,而且equals方法也没有被调用。重写一下Person中的hashcode方法,让eclipse自动生成:
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }
然后再执行测试类时,发现打印的结果中已经去除重复的了。
这里需要注意:在向HashSet中存放自定义类型对象时,一定要重写hashCode和equals方法