国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java集合 之 set 集合

2019-11-15 00:47:10
字體:
來源:轉載
供稿:網友
java集合 之 set 集合

set集合可以存儲多個對象,但并不會記住元素的存儲順序,也不允許集合中有重復元素(不同的set集合有不同的判斷方法)。

1.HashSet類

HashSet按照Hash算法存儲集合中的元素,具有很好的存取和查找性能。當向HashSet中添加一些元素時,HashSet會根據該對象的HashCode()方法來得到該對象的HashCode值,然后根據這些HashCode的值來決定元素的位置。

HashSet的特點:1.存儲順序和添加的順序不同

        2.HashSet不是同步的,如果多個線程同時訪問一個HashSet,假設有兩個或更多的線程修改了集合中的值,則必須通過代碼使線程同步。

        3.HastSet允許集合中的元素為null。

在HashSet集合中,判斷兩個元素相同的標準是:兩個對象通過equals()方法相等,且HashCode()方法的返回值也相等。如果有兩個元素通過equals()方法比較相等,而HashCode()的返回值不同,HashSet會將這兩個對象保存在不同的地方。

注意:如果向HashSet中添加一個可變對象后,后面的對象修改了該可變對象的實例變量,則可能導致它與集合中的其他元素相同。

class R{    int count;    public R(int count){        this.count= count;    }    public String toString(){        return "R[count:" + count + "]";    }    public boolean equals(Object obj){        if (this == obj)             return true;        if (obj != null && obj.getClass() == R.class) {            R r = (R)obj;            return this.count == r.count;        }        return false;    }    public int HashCode(){        return this.count;    }}public class HashSetTest {    public static void main(String[] args){        HashSet hs = new HashSet();        hs.add(new R(5));        hs.add(new R(-3));        hs.add(new R(9));        hs.add(new R(-2));        //輸出:[R[count:9], R[count:5], R[count:-3], R[count:-2]]        System.out.PRintln(hs);        Iterator it = hs.iterator();        R first = (R)it.next();        first.count = -3;        //輸出:[R[count:-3], R[count:5], R[count:-3], R[count:-2]]        System.out.println(hs);        //輸出:是否包含count為-3的對象:false        System.out.println("是否包含count為-3的對象:" + hs.contains(new R(-3)));        //輸出:是否包含count為-2的對象:false        System.out.println("是否包含count為-2的對象:" + hs.contains(new R(-2)));    }}

這個例子中代碼first.count=-3改變了集合中的實例變量,在應該count為9的地方放入了count為-3的元素,導致HashSet不能準確訪問元素。在判斷其他元素也會出錯,比如判斷集合是否包含-2,-3.

(上面這句話是我自己理解的,總感覺不太對,大家幫我看看)

2.LinkedHashSet類

LikedHashSet是HashSet的子類,它也是根據元素的HashCode值進來決定元素的存儲位置,但它能夠同時使用鏈表來維護元素的添加次序,使得元素能以插入順序保存。

public class LinkHashSetTest {    public static void main(String[] args){        LinkedHashSet lh = new LinkedHashSet();        lh.add(1);        lh.add(2);        lh.add(3);        //輸出:[1, 2, 3]        System.out.println(lh);        lh.remove(1);        lh.add(1);        //輸出:[ 2, 3 ,1]        System.out.println(lh);    }}

3.TreeSet

TreeSet是SortedSet接口的實現類,TreeSet可以保證了集合元素處于排序狀態(所謂排序狀態,就是元素按照一定的規則排序,比如升序排列,降序排列)。

與HashSet集合相比。

Comparator comparator():如果TreeSet采用了定制排序,則該方法返回定制排序所使用的Comparator,如果采用了自然排序,則返回null。

Object first(): 返回集合中的第一個元素。

Object last():返回集合中的最后一個元素。

Object lower(Object e):返回集合中位于指定元素e之前的元素(即小于指定元素的最大元素,參考元素e不必是集合中的元素)。

Object higher(Object e): 返回集合中位于指定元素e之后的元素(即大于指定元素的最小元素,參考元素e不必是集合中的元素)。

SortedSet subSet(Object fromElement, Object toElement): 返回集合中所有在fromElemt和toElement之間的元素(包含fromElent本身,不包含toElement本身)。

SortedSet headSet(Object toElement): 返回此set的子集,由小于toElement的元素組成。

SortedSet tailSet(Object fromElement):返回此set的子集,由大于或等于fromElement的元素組成。

public class TreeSetTest {    public static void main(String[] args){        TreeSet ts = new TreeSet();        ts.add(5);        ts.add(2);        ts.add(10);        ts.add(-9);        //輸出:null 證明是自然排序        System.out.println(ts.comparator());        //輸出:-9        System.out.println(ts.first());        //輸出:10        System.out.println(ts.last());        //輸出:2        System.out.println(ts.lower(3));        //輸出:10        System.out.println(ts.higher(5));        //輸出[5, 10]        System.out.println(ts.subSet(3, 12));        //輸出:[-9, 2, 5]        System.out.println(ts.headSet(10));        //輸出:[5, 10]        System.out.println(ts.tailSet(5));    }}

TreeSet支持兩種排序方法:自然排序和定制排序。在默認的情況下,TreeSet采用自然排序。

自然排序:TreeSet會調用集合元素的compareTo(Object obj)方法來比較元素之間的大小關系,然后讓集合按照升序排列,這種方式叫做自然排序。

定制排序:定制排序是按照使用者的要求,需要自己設計的一種排序。如果需要定制排序,比如需要數據按照降序排列,則可以通過Comparator接口的幫助。

PS:

1.如果希望TreeSet能夠正常運行,TreeSet只能添加同一種類型的對象。

2.TreeSet集合中判斷元素相等的唯一標準是:兩個對象通過comparator(Object obj)方法比較后,返回0;否則認為不相等。

3.EnumSet類

EnumSet類是一種專為枚舉類設計的集合類,EnumSet中的所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在創建EnumSe類時顯式或隱式的指定。EnumSet的集合元素也是有序的,EnumSet以枚舉值在Enum類內的定義順序來決定集合元素的順序。

EnumSet提供了如下常用的類方法來創建EnumSet對象:EnumSet allOf(Class elementType): 創建一個包含指定枚舉類中的所有枚舉值的EnumSet集合。

EnumSet complement(EnumSet s):創建一個其元素類型與指定EnumSet里元素類型相同的EnumSet集合,新的EnumSet集合包含原來的EnumSet集合所不包含的,此枚舉類剩下的枚舉值(新的EnumSet集合加上原EnumSet集合中的集合元素就是該枚舉類中所有的枚舉值)。

EnumSet copyOf(Collection c): 使用一個普通集合來創建EnumSet集合。

EnumSet copyOf(EnumSet s): 創建一個和指定EnumSet集合,同類型同集合元素的EnumSet集合。

EnumSet noneOf(Class elementType): 創建一個元素類型是指定枚舉類型的空EnumSet集合。

EnumSet of(E first, E... rest): 創建一個包含一個或者多個枚舉值得EnumSet集合,傳入的枚舉值必須屬于同一個枚舉類。

EnumSet range(E from, E to):創建一個從from枚舉值到to枚舉值范圍內所有枚舉值的EnumSet集合。

enum Season{    SPRING,SUMMER,FALL,WINTER}public class EnumSetTest {    public static void main(String[] args){        EnumSet es1 = EnumSet.allOf(Season.class);        //輸出:[SPRING, SUMMER, FALL, WINTER]        System.out.println(es1);        EnumSet es2 = EnumSet.noneOf(Season.class);        //輸出:[]        System.out.println(es2);        es2.add(Season.WINTER);        es2.add(Season.SPRING);        //輸出:[SPRING, WINTER]        System.out.println(es2);        EnumSet es3 = EnumSet.of(Season.SPRING, Season.WINTER);        //輸出:[SPRING, WINTER]        System.out.println(es3);        EnumSet es4 = EnumSet.range(Season.SPRING, Season.WINTER);        //輸出:[SPRING, SUMMER, FALL, WINTER]        System.out.println(es4);        EnumSet es5 = EnumSet.complementOf(es4);        //輸出:[]        System.out.println(es5);    }}

------------《瘋狂java講義》8.3set集合


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 城固县| 温州市| 木里| 阿合奇县| 安阳县| 元氏县| 泰州市| 巢湖市| 普洱| 进贤县| 西宁市| 彰武县| 洞口县| 叙永县| 屯门区| 元朗区| 渝北区| 临桂县| 临海市| 台东县| 永清县| 祁连县| 罗田县| 东平县| 元江| 维西| 卫辉市| 浦县| 玛多县| 丹阳市| 明光市| 武胜县| 石嘴山市| 志丹县| 会昌县| 岳普湖县| 满洲里市| 手机| 长子县| 湟源县|