日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java---27---Set集合及其子類HashSet

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); } }



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品视频免费 | 一级片在线播放 | 国产区一区二区三区 | 国产精品成人品 | 黄p网站 | 久久99久久99精品免观看粉嫩 | 日韩美女毛片 | 色婷婷影院| 高清日韩av| 欧美福利精品 | 毛片真人毛毛片毛片 | 国产一区二区在线播放 | 色成人免费网站 | 国产黄色片在线观看 | 亚洲人免费 | xxx性欧美| 亚洲午夜视频在线观看 | 精品国产一区二区三区久久久 | 插综合网| 免费黄色| 国产小视频在线播放 | 黄色国产在线 | 久久这里精品 | 美女视频网站色 | 免费观看不卡av | 中国一级片在线观看 | 国产成人精品亚洲777人妖 | 欧美国产日韩视频 | 91偷拍精品一区二区三区 | 午夜三区| 日本欧美日韩 | 久久久久久久一区 | 综合网av| 国产日本在线视频 | 欧美精品黄 | 久久精品视频一区二区 | 美日韩一区 | 在线中文视频 | a视频在线免费观看 | 超碰在线 | 欧美久久一区 |