多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Java---27---Set集合及其子類HashSet

Java---27---Set集合及其子類HashSet

來源:程序員人生   發(fā)布時(shí)間:2015-04-17 09:06:05 閱讀次數(shù):3934次

Set中元素是無序的(存入和取出的順序不1定1致),元素不可以重復(fù)。

 

Set中的方法和Collection中的方法是1樣的。

常見子類:HashSet  TreeSet

HashSet 底層數(shù)據(jù)結(jié)構(gòu)是哈希表

TreeSet 底層數(shù)據(jù)結(jié)構(gòu)是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("是不是添加進(jìn)去:" + hs.add("02")); } /** * 存入自定義對象,如果姓名和年齡相同視為同1個(gè)人,重復(fù)元素 */ 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個(gè)相同元素 hs.add(new Person("01", 10)); Iterator it = hs.iterator(); while (it.hasNext()){ Person person = (Person)it.next(); sop(person.getName()+"::"+person.getAge()); } //沒解決啊。。。兩個(gè)01::10 } public static void sop(Object object) { System.out.println(object); } }


我們要求 姓名和年齡相同視為是重復(fù)元素,依照Set的特性來講是不應(yīng)當(dāng)被保存的,結(jié)果卻是存上了。。。

 

解決:覆蓋元素的hashCode 方法,建立自己的哈希值,同時(shí)覆蓋equals方法。

 

覆蓋元素HashCode方法 是由于,在Set中存入元素,首先被判斷的就是元素的哈希值,只有當(dāng)元素的哈希值沒有出現(xiàn)過的時(shí)候,才會(huì)將元素存入。

覆蓋equals方法是由于,兩個(gè)元素的哈希值相同,但是這兩個(gè)元素不1定是相同的,因此來判斷1下,并根據(jù)返回值來決定該元素終究能否被存入。



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; //打印 表示此方法被調(diào)用 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; //依照條件設(shè)定哈希值 //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個(gè)人,重復(fù)元素 */ 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個(gè)相同元素 hs.add(new Person("01", 10)); Iterator it = hs.iterator(); while (it.hasNext()){ Person person = (Person)it.next(); sop(person.getName()+"::"+person.getAge()); } //沒解決啊。。。兩個(gè)01::10 //覆蓋 hashcode方法,建立自己的哈希值 } public static void sop(Object object) { System.out.println(object); } }

打印結(jié)果:

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個(gè)相同的哈希值,通過打印結(jié)果我們不難猜出此程序的運(yùn)行進(jìn)程:

01先生成1個(gè)哈希值,由于此時(shí)就只有011個(gè)元素,所以存入

02再生成1個(gè)相同的哈希值,然后跟01比較,不是同1元素,存入

03再生成相同的哈希值,然后跟01和02進(jìn)行比較,肯定沒有相同元素,存入

04也是1樣,跟01 02 03比較完后,存入

接著就是重復(fù)元素01了,比較發(fā)現(xiàn)跟第1次存入的01是相同的,

返回false,沒有存入。

 

結(jié)論:

HashSet是如何保證元素唯1性的呢?

通過元素的兩個(gè)方法:hashCode和equals

只有當(dāng)元素的哈希值相等的時(shí)候才會(huì)判斷equals方法

 

那如果生成不同的哈希值的話,就能夠大大的減少程序的運(yùn)行次數(shù)。


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; //打印 表示此方法被調(diào)用 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; //依照條件設(shè)定哈希值 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個(gè)人,重復(fù)元素 */ 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個(gè)相同元素 hs.add(new Person("01", 10)); Iterator it = hs.iterator(); while (it.hasNext()){ Person person = (Person)it.next(); sop(person.getName()+"::"+person.getAge()); } //沒解決啊。。。兩個(gè)01::10 //覆蓋 hashcode方法,建立自己的哈希值 } public static void sop(Object object) { System.out.println(object); } }



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲欧美自拍视频 | 国产午夜精品一区二区三区 | 国产性老妇女做爰在线 | 欧美视频精品在线 | 亚洲欧洲第一页 | 国产无限资源 | 国产日韩高清一区二区三区 | 欧美肥老太太 | 性做久久久久久 | 伊人久久综合网站 | 亚洲在线观看免费视频 | 国内亚州视频在线观看 | 欧美整片在线观看 | 欧美国产成人精品一区二区三区 | 一级做性色a爰片久久毛片 一级做性色a爰片久久毛片免费 | 亚洲精品人成网在线播放影院 | 91国内精品久久久久免费影院 | 日本一区二区三区视频在线观看 | 一区二区三区在线播放 | 午夜看片福利 | 欧美激情xxxx性bbbb | 校园春色 自拍偷拍 | 伊人久久大香线蕉75 | 欧美性高清bbbbbbxxxxx | 91亚洲欧美综合高清在线 | 黄色免费网站在线看 | 欧美亚洲国产另类 | 欧美高清在线不卡免费观看 | 亚洲精品456在在线播放 | 亚欧成人乱码一区二区 | 欧美一区二区在线观看 | 亚洲精品成人一区二区 | 亚洲最大在线观看 | 成人网免费视频 | 依人久久 | www.爱爱视频 | 亚洲社区 | 波多野结衣在线中文字幕 | 伊人资源| 欧美午夜色视频国产精品 | 日本成片视频 |