Java---27---Set集合及其子類HashSet
來源:程序員人生 發布時間:2015-04-17 09:06:05 閱讀次數:3938次
Set中元素是無序的(存入和取出的順序不1定1致),元素不可以重復。
Set中的方法和Collection中的方法是1樣的。
常見子類:HashSet TreeSet
HashSet 底層數據結構是哈希表
TreeSet 底層數據結構是2叉樹
import java.util.HashSet;
import java.util.Iterator;
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//set and get methods
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;
}
}
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//method1();
method2();
}
public static void method1() {
HashSet hs = new HashSet();
hs.add("01");
hs.add("02");
hs.add("03");
hs.add("04");
// 無序性
sop(hs);
hs.add("02");
// 唯1性
sop(hs);
sop("是不是添加進去:" + hs.add("02"));
}
/**
* 存入自定義對象,如果姓名和年齡相同視為同1個人,重復元素
*/
public static void method2 (){
HashSet hs = new HashSet();
hs.add(new Person("01",10));
hs.add(new Person("02",11));
hs.add(new Person("03",12));
hs.add(new Person("04",13));
/*打印
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
*/
//添加1個相同元素
hs.add(new Person("01", 10));
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
//沒解決啊。。。兩個01::10
}
public static void sop(Object object) {
System.out.println(object);
}
}
我們要求 姓名和年齡相同視為是重復元素,依照Set的特性來講是不應當被保存的,結果卻是存上了。。。
解決:覆蓋元素的hashCode 方法,建立自己的哈希值,同時覆蓋equals方法。
覆蓋元素HashCode方法 是由于,在Set中存入元素,首先被判斷的就是元素的哈希值,只有當元素的哈希值沒有出現過的時候,才會將元素存入。
覆蓋equals方法是由于,兩個元素的哈希值相同,但是這兩個元素不1定是相同的,因此來判斷1下,并根據返回值來決定該元素終究能否被存入。
package ssssssss;
import java.util.HashSet;
import java.util.Iterator;
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (!(obj instanceof Person))
return false;
Person person = (Person) obj;
//打印 表示此方法被調用
System.out.println(this.name + "******equals*****" + person.name);
return this.name.equals(person.name) && this.age == person.age;
}
//覆蓋hashCode方法 建立Person自己的哈希值
public int hashCode() {
// TODO Auto-generated method stub
System.out.println(this.name + "..........hashCode");
return 13;
//依照條件設定哈希值
//return name.hashCode() + 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;
}
}
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
method2();
}
/**
* 存入自定義對象,如果姓名和年齡相同視為同1個人,重復元素
*/
public static void method2 (){
HashSet hs = new HashSet();
hs.add(new Person("01",10));
hs.add(new Person("02",11));
hs.add(new Person("03",12));
hs.add(new Person("04",13));
/*打印
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
*/
//添加1個相同元素
hs.add(new Person("01", 10));
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
//沒解決啊。。。兩個01::10
//覆蓋 hashcode方法,建立自己的哈希值
}
public static void sop(Object object) {
System.out.println(object);
}
}
打印結果:
01..........hashCode
02..........hashCode
02******equals*****01
03..........hashCode
03******equals*****01
03******equals*****02
04..........hashCode
04******equals*****01
04******equals*****02
04******equals*****03
01..........hashCode
01******equals*****01
01::10
02::11
03::12
04::13
返回1個相同的哈希值,通過打印結果我們不難猜出此程序的運行進程:
01先生成1個哈希值,由于此時就只有011個元素,所以存入
02再生成1個相同的哈希值,然后跟01比較,不是同1元素,存入
03再生成相同的哈希值,然后跟01和02進行比較,肯定沒有相同元素,存入
04也是1樣,跟01 02 03比較完后,存入
接著就是重復元素01了,比較發現跟第1次存入的01是相同的,
返回false,沒有存入。
結論:
HashSet是如何保證元素唯1性的呢?
通過元素的兩個方法:hashCode和equals
只有當元素的哈希值相等的時候才會判斷equals方法
那如果生成不同的哈希值的話,就能夠大大的減少程序的運行次數。
package ssssssss;
import java.util.HashSet;
import java.util.Iterator;
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (!(obj instanceof Person))
return false;
Person person = (Person) obj;
//打印 表示此方法被調用
System.out.println(this.name + "******equals*****" + person.name);
return this.name.equals(person.name) && this.age == person.age;
}
//覆蓋hashCode方法 建立Person自己的哈希值
public int hashCode() {
// TODO Auto-generated method stub
System.out.println(this.name + "..........hashCode");
//return 13;
//依照條件設定哈希值
return name.hashCode() + 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;
}
}
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
method2();
}
/**
* 存入自定義對象,如果姓名和年齡相同視為同1個人,重復元素
*/
public static void method2 (){
HashSet hs = new HashSet();
hs.add(new Person("01",10));
hs.add(new Person("02",11));
hs.add(new Person("03",12));
hs.add(new Person("04",13));
/*打印
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
*/
//添加1個相同元素
hs.add(new Person("01", 10));
Iterator it = hs.iterator();
while (it.hasNext()){
Person person = (Person)it.next();
sop(person.getName()+"::"+person.getAge());
}
//沒解決啊。。。兩個01::10
//覆蓋 hashcode方法,建立自己的哈希值
}
public static void sop(Object object) {
System.out.println(object);
}
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈