Set接口,它里面的集合,所存儲的元素就是不重復的。
HashSet集合,采用哈希表結構存儲數據,保證元素唯一性的方式依賴于:hashCode()與equals()方法。
保證HashSet集合元素的唯一,其實就是根據對象的hashCode和equals方法來決定的。如果我們往集合中存放自定義的對象,那么保證其唯一,就必須復寫hashCode和equals方法建立屬于當前對象的比較方式。
?
給HashSet中存儲JavaAPI中提供的類型元素時,不需要重寫元素的hashCode和equals方法,因為這兩個方法,在JavaAPI的每個類中已經重寫完畢,如String類、Integer類等。
?創建HashSet集合,存儲String對象。
package com.oracle.www.demo03; import java.util.HashSet;import javax.swing.plaf.synth.SynthSeparatorUI; public class Demo03 {public static void main(String[] args) {
//獲得Object對象,輸出Object的hashCode算法Object obj = new Object();System.out.println(obj.hashCode());
//創建Hash對象HashSet<String> set = new HashSet<String>();set.add("abc");set.add("bcd");set.add("ghj");set.add("abc");
//遍歷集合for(String s:set) {System.out.println(s);System.out.println(s.hashCode());}}}
輸出結果如下,說明集合中不能存儲重復元素:
370988149
bcd
97347
abc
96354
ghj
102313
?HashSet存儲自定義類型元素
給HashSet中存放自定義類型元素時,需要重寫對象中的hashCode和equals方法,建立自己的比較方式,才能保證HashSet集合中的對象唯一。
自定義Student類
public class Student {private String name;private int age;public Student(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;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if(!(obj instanceof Student)){System.out.println("類型錯誤");return false;}Student other = (Student) obj;return this.age == other.age && this.name.equals(other.name);} }
?
?創建HashSet集合,存儲Student對象。
public class HashSetDemo {public static void main(String[] args) {//創建HashSet對象HashSet hs = new HashSet();//給集合中添加自定義對象hs.add(new Student("zhangsan",21));hs.add(new Student("lisi",22));hs.add(new Student("wangwu",23));hs.add(new Student("zhangsan",21));//取出集合中的每個元素Iterator it = hs.iterator();while(it.hasNext()){Student s = (Student)it.next();System.out.println(s);}} }
輸出結果如下,說明集合中不能存儲重復元素:
Student [name=lisi, age=22]
Student [name=zhangsan, age=21]
Student [name=wangwu, age=23]
?
?
在HashSet下面有一個子類LinkedHashSet,它是鏈表和哈希表組合的一個數據存儲結構。LinkedHashSet為雙鏈接結構,所以能保證唯一性和有序存儲。
package com.cracle.www.demo01;import java.util.HashSet; import java.util.LinkedHashSet;public class Demo01 {public static void main(String[] args) {//LinkedHashSet不能存重復元素,但是是有序的,是HashSet的子類。LinkedHashSet<String> has = new LinkedHashSet<String>();has.add("c");has.add("b");has.add("a");for(String a:has) {System.out.println(a);}}}
輸出為?
c
b
a