最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

java集合HashSet類

2022-07-24 09:20 作者:虛云幻仙  | 我要投稿

/**
* Set接口繼承Collection接口 沒(méi)有增加方法 set集合無(wú)序元素互異(equals()false)
* List接口繼承Collection接口 增加了索引相關(guān)的方法 使容器有序可重復(fù)
* HashSet為Set接口的實(shí)現(xiàn)類 使用hash哈希/散列算法實(shí)現(xiàn) 允許有null元素 線程不安全
*/

public class TestHashSet {
? ?public static void main(String[] args) {
? ? ? ?Set<String> hs1 = new HashSet<>();
? ? ? ?//HashSet集合可以通過(guò)Set引用類型引用
? ? ? ?hs1.add("a");
? ? ? ?hs1.add("b");
? ? ? ?hs1.add("c");
? ? ? ?hs1.add("A");
? ? ? ?hs1.add("b");
? ? ? ?for (String e :
? ? ? ? ? ? ? ?hs1) {
? ? ? ? ? ?System.out.print(e+",");
? ? ? ?}
? ? ? ?//Set沒(méi)有索引index 沒(méi)有.get(index) 不能通過(guò)for(i)遍歷
? ? ? ?//結(jié)果a,A,b,c, ? Set集合無(wú)序 放入的順序abcA和取出的順序aAbc不同 Set集合互異 兩個(gè)"b"只能存在一個(gè)

? ? ? ?System.out.println();
// ? ? ? ?hs1.remove();hs1.clear();hs1.contains();hs1.size();hs1.toArray();等方法和List用法相同

? ? ? ?/*
? ? ? ?保持元素互異的大致原理為每增加一個(gè)元素時(shí)先.hashCode()計(jì)算該元素的hash值 再用hash值計(jì)算出元素應(yīng)當(dāng)保存在集合中的位置,如果當(dāng)前位置沒(méi)有元素則說(shuō)明集合中沒(méi)有與之重復(fù)的元素 之后完成添加
? ? ? ?如果當(dāng)前位置存在元素則將進(jìn)一步判斷(&&短路與)指針是否相同/指向同一地址或者(||短路或)equals()相等 ture即判斷為同一元素 不進(jìn)行添加
? ? ? ?HashSet通過(guò)HashMap的哈希表和哈希桶存儲(chǔ)元素 哈希表為存放哈希值的數(shù)組 每一個(gè)元素根據(jù).hashCode()返回的哈希值存放于數(shù)組中對(duì)應(yīng)的index
? ? ? ?哈希表數(shù)組中每一位都是一個(gè)哈希桶 哈希桶為單鏈表 保存表頭結(jié)點(diǎn) 每一個(gè)元素通過(guò)index存放入鏈表中 當(dāng)元素存放位置重復(fù)時(shí)新元素會(huì)添加到鏈表的表尾結(jié)點(diǎn)
? ? ? ? */

? ?}
}
class Element1{
? ?//自定義類測(cè)試HashSet集合的互異
? ?int id;
? ?String info;

? ?public Element1(int id, String info) {
? ? ? ?this.id = id;
? ? ? ?this.info = info;
? ?}

? ?@Override
? ?public String toString() {
? ? ? ?//generate自動(dòng)生成toString的重寫(xiě)
? ? ? ?return "Element1{" +
? ? ? ? ? ? ? ?"id=" + id +
? ? ? ? ? ? ? ?", info='" + info + '\'' +
? ? ? ? ? ? ? ?'}';
? ?}

? ?public static void main(String[] args) {
? ? ? ?Set<Element1> hs = new HashSet<>();
? ? ? ?//創(chuàng)建一個(gè)存放自定義類Element1對(duì)象的集合
? ? ? ?Element1 e1 = new Element1(1,"屬性的值完全相同");
? ? ? ?Element1 e2 = new Element1(1,"屬性的值完全相同");
? ? ? ?hs.add(e1);
? ? ? ?hs.add(e2);
? ? ? ?System.out.println(hs);
? ? ? ?//結(jié)果為[Element1{id=1, info='屬性的值完全相同'}, Element1{id=1, info='屬性的值完全相同'}]
? ? ? ?//兩個(gè)內(nèi)容完全相同的對(duì)象 因?yàn)?hashCode()值不同被判定為不同的元素

? ?}
}
class Element2{
? ?//更改類的.hashCode()方法 同時(shí)還需要更改.equals()方法 實(shí)現(xiàn)自定義對(duì)象的集合存儲(chǔ)互異判定
? ?int id;
? ?String info;

? ?public Element2(int id, String info) {
? ? ? ?this.id = id;
? ? ? ?this.info = info;
? ?}
? ?//generate 自動(dòng)生成equals() and hashCode()
? ?@Override
? ?public boolean equals(Object o) {
? ? ? ?System.out.println("哈希值相同才會(huì)執(zhí)行equals");
? ? ? ?if (this == o) return true;
? ? ? ?//先判斷指針是否相同
? ? ? ?if (o == null || getClass() != o.getClass()) return false;
? ? ? ?//判斷形參o是否為空 以及this和o是否同類
? ? ? ?Element2 element2 = (Element2) o;
? ? ? ?//強(qiáng)轉(zhuǎn)o
? ? ? ?return id == element2.id && Objects.equals(info, element2.info);
? ? ? ?//分別判斷每個(gè)屬性是否相同(&&短路與) info是對(duì)象,還需要調(diào)用對(duì)象.equals()判斷
? ?}

? ?@Override
? ?public int hashCode() {
? ? ? ?System.out.println("先判斷哈希值");
? ? ? ?return Objects.hash(id, info);
? ? ? ?//將id,info作為key/參數(shù)來(lái)計(jì)算哈希值 代替類對(duì)象的哈希值 這樣當(dāng)兩個(gè)對(duì)象的id和info內(nèi)容相同時(shí)計(jì)算出的哈希值相同
? ?}

? ?@Override
? ?public String toString() {
? ? ? ?return "Element2{" +
? ? ? ? ? ? ? ?"id=" + id +
? ? ? ? ? ? ? ?", info='" + info + '\'' +
? ? ? ? ? ? ? ?'}';
? ?}

? ?public static void main(String[] args) {
? ? ? ?Set<Element2> hs = new HashSet<>();
? ? ? ?Element2 e1 = new Element2(1,"屬性的值完全相同");
? ? ? ?Element2 e2 = new Element2(1,"屬性的值完全相同");
? ? ? ?hs.add(e1);
? ? ? ?hs.add(e2);
? ? ? ?System.out.println(hs);
? ? ? ?/*結(jié)果為:
? ? ? ?先判斷哈希值
? ? ? ?先判斷哈希值
? ? ? ?哈希值相同才會(huì)執(zhí)行equals
? ? ? ?[Element2{id=1, info='屬性的值完全相同'}]
? ? ? ? */

? ? ? ?//每次add添加元素會(huì)計(jì)算哈希值 通過(guò)哈希值找index 存e1時(shí)index為空,不需要調(diào)用equals()直接存入元素 存e2時(shí)index存放了e1 哈希值會(huì)隨元素一起存儲(chǔ),所以不需要第二次計(jì)算e1的哈希值
? ? ? ?//當(dāng)index存在元素時(shí)才會(huì)執(zhí)行equals 所以兩次添加只在存e2時(shí)執(zhí)行了一遍
? ? ? ?//通過(guò)哈希值和equals判斷兩個(gè)對(duì)象相同 只保留了e1 這樣實(shí)現(xiàn)了通過(guò)屬性判斷互異

? ?}
}

java集合HashSet類的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
墨竹工卡县| 南川市| 利川市| 丹寨县| 美姑县| 信宜市| 兰考县| 嵊州市| 江北区| 虞城县| 德清县| 阿拉尔市| 平南县| 连山| 东辽县| 望奎县| 静海县| 固安县| 方山县| 柳河县| 巴彦县| 开远市| 淮滨县| 宁南县| 武夷山市| 余干县| 修水县| 泉州市| 博野县| 昌江| 广饶县| 阿拉尔市| 棋牌| 仁寿县| 大名县| 牡丹江市| 徐汇区| 阳泉市| 瑞金市| 阿荣旗| 和顺县|