日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Set集合以及HashSet、LinkedHashSet、TreeSet等讲解

發(fā)布時(shí)間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Set集合以及HashSet、LinkedHashSet、TreeSet等讲解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?Set ?Set 集合不允許包含相同的元素,如果試把兩個(gè)相同的元素加入同一個(gè) Set 集合中,則添加操作失敗。 ?Set 判斷兩個(gè)對(duì)象是否相同不是使用== 運(yùn)算符,而是根據(jù) equals 方法
?HashSet 是 Set 接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用Set 集合時(shí)都使用這個(gè)實(shí)現(xiàn)類(lèi)。 ?HashSet 按 Hash 算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存取和查找性能。 ?HashSet 具有以下特點(diǎn): –不能保證元素的排列順序 –HashSet不是線程安全的 –集合元素可以使 null ?當(dāng)向 HashSet 集合中存入一個(gè)元素時(shí),HashSet 會(huì)調(diào)用該對(duì)象的 hashCode() 方法來(lái)得到該對(duì)象的hashCode 值,然后根據(jù) hashCode 值決定該對(duì)象在 HashSet 中的存儲(chǔ)位置。 ?如果兩個(gè)元素的 equals() 方法返回 true,但它們的 hashCode() 返回值不相等,hashSet 將會(huì)把它們存儲(chǔ)在不同的位置,但依然可以添加成功。

?LinkedHashSet 是 HashSet 的子類(lèi) ?LinkedHashSet 集合根據(jù)元素的 hashCode 值來(lái)決定元素的存儲(chǔ)位置,但它同時(shí)使用鏈表維護(hù)元素的次序,這使得元素看起來(lái)是以插入順序保存的。 ?LinkedHashSet性能插入性能略低于 HashSet,但在迭代訪問(wèn) Set 里的全部元素時(shí)有很好的性能。 ?LinkedHashSet不允許集合元素重復(fù)
?TreeSet 是 SortedSet 接口的實(shí)現(xiàn)類(lèi),TreeSet可以確保集合元素處于排序狀態(tài)。 ?TreeSet支持兩種排序方法:自然排序和定制排序默認(rèn)情況下,TreeSet采用自然排序
package com.hbut.test;


import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;


import com.hbut.domain.Person;


/**
?* Set(接口):放置的元素是按照哈希表來(lái)放的,元素是無(wú)序的;
?* ? ?注意:1.放置元素時(shí)使用對(duì)象的equals方法判斷的;
?* ? ? ? ? ? ? ? 2.可以放置null(null其實(shí)既不是類(lèi),也不是類(lèi)型 )值,但是只能放一個(gè);
?* ? ?HashSet是Set接口的實(shí)現(xiàn)類(lèi),是非線程安全的,一般用的比較多,非線程安全可以轉(zhuǎn)為線程安全的;
?* ? ? ? ?LinkedHashSet:是HashSet的子類(lèi),對(duì)插入的數(shù)據(jù)是有序的,他的底層不僅有hash算法,還有鏈表維護(hù),里面也不能有重復(fù)的元素。
?* ? ? ? ??
?* ? ?
?*
?*/
public class TestSet {


public static void main(String[] args) {

Set set = new LinkedHashSet();//保證set的有序

set.add(null);
set.add(null);
System.out.println(set.size());

Person person =new Person();
Person person2 =new Person();


System.out.println(person.hashCode()); ? ?//注意:沒(méi)有復(fù)寫(xiě)person的hashcode方法的話,那么兩個(gè)對(duì)象是存在不一樣的地方的。
System.out.println(person2.hashCode());


System.out.println(person.equals(person2));//注意:已經(jīng)復(fù)寫(xiě)了person的equals方法了
System.out.println(person==person2);
set.add(person);//添加的是同一對(duì)象
set.add(person2);


System.out.println(set.size());


set.add(new Person("xx",21)); ?//并未覆寫(xiě)equals方法,所以是兩個(gè)不同的對(duì)象,無(wú)法比較。如果復(fù)寫(xiě)了,那么就是一個(gè)了,去試試
set.add(new Person("xx",21)); ??
System.out.println(set.size());

set.add("hello");
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}



}


}

//對(duì)于TreeSet的實(shí)驗(yàn) package com.hbut.test;


import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;


import com.hbut.domain.Student;
import com.hbut.exeception.StudentExeception;
import com.hbut.util.MyComparator;


public class TestTreeSet {


/**
* 1.如果使用treeSet的無(wú)參數(shù)構(gòu)造器來(lái)創(chuàng)建對(duì)象,那么添加的對(duì)象必須實(shí)現(xiàn)Comparable接口,復(fù)寫(xiě)compareTo方法,不能放入null,不然會(huì)發(fā)生空指針異常;
* 2.不能傳不是同一類(lèi)對(duì)象,不然會(huì)發(fā)生類(lèi)型轉(zhuǎn)換異常ClassCastExeception異常
* 3.兩個(gè)對(duì)象是按照Comparable的接口的comparaTo方法比較,是由TreeSet調(diào)用此方法
*?
* (1).要么類(lèi)實(shí)現(xiàn)Comparable接口,復(fù)寫(xiě)ComparaTo方法;
* (2).要么寫(xiě)一個(gè)比較器,Comparator 復(fù)寫(xiě)compare方法;(推薦這種,比較方法,可以直接使用)
*/
public static void main(String[] args) {

// Set st= new TreeSet();
//
// //st.add(null);
//
// st.add("BB"); ?//對(duì)放入的元素默認(rèn)是按照自然順序排序的,元素也是不可重復(fù)的,注意:還可以定制的;
// st.add("AA");
// st.add("CC");
//
// st.add("2");
// st.add("1");
// st.add("3");
//
int x=22;
st.add(x);
//
//
// for(Object obj :st){
//
// System.out.println(obj);
//
// }

Set st2= new TreeSet<>();
st2.add(new Student("BB",95));
st2.add(new Student("AA",95));//注意:此時(shí)的comparaTo返回的是true,是一樣的分?jǐn)?shù),放不進(jìn)去,與equals方法相背,需要注意,一般要求兩個(gè)最好返回一樣的值
st2.add(new Student("DD",91));
st2.add(new Student("CC",94));

for(Object obj :st2){

System.out.println(obj);

? ? }

Comparator ct = new MyComparator();

Comparator comparator = new Comparator() {//匿名內(nèi)部類(lèi),這是一個(gè)比較器
@Override
public int compare(Object o1, Object o2){
if(o1 instanceof Student && o2 instanceof Student){
Student s1= (Student) o1;
Student s2= (Student) o2;
return s1.getScore()-s2.getScore();

}
else{

throw new ClassCastException("不是Student");

}

}
};


Set s3= new TreeSet<>(ct);
s3.add(new Student("yy",66));
s3.add(new Student("xx",65));
s3.add(new Student("zz",70));

System.out.println("--------用傳入Comparator方法可行------------");
for(Object obj : s3){

System.out.println(obj);

? ? }

try {
test();//需要對(duì)異常進(jìn)行處理。不然直接拋給虛擬機(jī)了
} catch (StudentExeception e) {

//System.out.println(e.getMsg());
e.printStackTrace();//復(fù)寫(xiě)了此方法的
}



}
public static void test() throws StudentExeception{ ?//聲明異常,并沒(méi)有處理

throw new StudentExeception("不是Student");//自定義的異常,拋出異常對(duì)象

}


}







總結(jié)

以上是生活随笔為你收集整理的Set集合以及HashSet、LinkedHashSet、TreeSet等讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。