java.util.Set
接口 extends Collection
接口
Set
接口的特點:
java.util.HashSet
集合 implements Set
接口HashSet特點:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;/*** @author :CaiCai* @date : 2022/4/13 14:30*//*java.util.Set接口 extends Collection接口Set接口的特點:
不允許重復的元素
沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷
java.util.HashSet集合 implements Set接口HashSet特點:不允許重復的元素沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷是一個無序的集合,存儲元素和取出元素的順序有可能不一致底層是一個哈希表結構(查詢的速度非常的快)*/
public class demoSet {public static void main(String[] args) {Set<Integer> set =new HashSet<>();// 使用add方法往集合中添加元素set.add(1);set.add(2);set.add(3);set.add(1);//使用迭代器遍歷Set集合Iterator<Integer> it=set.iterator();while(it.hasNext()){Integer n=it.next();System.out.println(n);}System.out.println("================");//使用增強for循環遍歷Set結合for(Integer i: set){System.out.println(i);}}
}
哈希值:是一個十進制的整數,由系統隨機給出(就是對象的地址值,是一個邏輯地址,是模擬出來得到的地址,不是數據實際存儲的物理地址
在Object
類中有一個方法,可以獲取對象的哈希值
哈希值在哪里找,int hashCode()
返回該對象的哈希碼值
hashCode
的源碼:代表該方法調用的是本地操作系統的方法
public native int hashCode()
; native
:代表該方法調用的是本地的操作對象
public class demo03 {public static void main(String[] args) {Person p1=new Person();int h1=p1.hashCode();System.out.println(h1);//23934342Person p2=new Person();int h2=p2.hashCode();System.out.println(h2);//22307196/*String類的哈希值String類重寫Object類的hashCode方法*/String s1=new String("abc");String s2=new String("abc");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354System.out.println("重地".hashCode());//1179395System.out.println("通話".hashCode());//1179395}
}
哈希沖突:兩個元素不同,但是哈希值相同
public class Person1 {private String name;private int age;public Person1() {}public Person1(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person1{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person1 person1 = (Person1) o;return age == person1.age &&Objects.equals(name, person1.name);}@Overridepublic int hashCode() {return Objects.hash(name, 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;}
}
/*
HashSet存儲自定義類型的元素存儲元素(String,Integer,……,Student,Person……)必須重寫hashCode方法和equals方法要求:同名和同年齡的人視為同一個人,只能存儲一次*/
public class DemoHashPerson {public static void main(String[] args) {//創建HashSet集合存儲PersonHashSet<Person1> set=new HashSet<>();Person1 p1=new Person1("張三",20);Person1 p2=new Person1("張三",20);Person1 p3=new Person1("王五",21);System.out.println(p1.hashCode());//24022540System.out.println(p2.hashCode());//24022540System.out.println(p1==p2);//falseSystem.out.println(p1.equals(p2));//trueset.add(p1);set.add(p2);set.add(p3);System.out.println(set);}
}
java.util.linkedHashSet
集合extends HashSet
集合
linkedHashSet
集合的特點:
底層是一個哈希表(數組+鏈表/紅黑樹)+鏈表:多了一條鏈表(記錄元素的存儲順序)保證元素有序
/*
java.util.linkedHashSet集合extends HashSet集合
linkedHashSet 集合的特點:
底層是一個哈希表(數組+鏈表/紅黑樹)+鏈表:多了一條鏈表(記錄元素的存儲順序)保證元素有序*/
public class demoLinkHashSet {public static void main(String[] args) {HashSet<String> set=new HashSet<>();set.add("www");set.add("abc");set.add("abc");set.add("itcns");System.out.println(set);//[itcns, abc, www]無序 不允許重復LinkedHashSet<String> linked=new LinkedHashSet<>();linked.add("www");linked.add("abc");linked.add("abc");linked.add("yyy");System.out.println(linked);//[www, abc, yyy] 有序 不允許重復}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态