天天看點

Set

 <b>功能:</b>

一個容器,一個“大筐”

<b>知識摘要:</b>

Set不允許存在重複資料,判斷重複标準:equals方法

HashSet:hashCode值決定它在HashSet中的位置

LinkedHashSet:HashSet子類,以連結清單的方式維護元素的次序

TreeSet:SortedSet接口的實作類,它保持了排序狀态

EnumSet:性能相對不錯的 枚舉Set(本例未涉及相關内容,有興趣可以自己檢視相關API)

HashSet、TreeSet、EnumSet都是線程不安全的 

如果需要線程安全使用: 

Set s = Collections.synchronizedSet(new HashSet(...));

<b>程式示範: 放大</b>

package com.cxy.collection;  

import java.util.Comparator;  

import java.util.HashSet;  

import java.util.LinkedHashSet;  

import java.util.Set;  

import java.util.TreeSet;  

/** 

 * @author cxy @ www.cxyapi.com 

 */  

public class SetTest  

{  

    public static void main(String[] args)  

    {  

        Set s = new HashSet();  

        s.add(null);  

        s.add(new A());  

        //由于2個A對象的hashCode傳回的都是1,并且equals方法傳回的是true,是以這兩個對象隻能存在1個  

        s.add(new B());  

        //B對象的equals方法傳回的永遠是false,是以這兩個B對象都能留下  

        s.add(new C());  

        //2個C對象hashCode傳回的都是2,并且equals方法傳回的是true,并且hashCode沒有和以往對象相等的,是以留住1個C對象  

        System.out.println(s); //通過列印結果可以看出 HashSet無序性。  

        LinkedHashSet&lt;String&gt; lhs = new LinkedHashSet&lt;String&gt;();  

        lhs.add("world");  

        lhs.add("said");  

        lhs.add("hello");  

        System.out.println(lhs);  //按照加入順序列印  

        TreeSet ts=new TreeSet();  

        ts.add(100);  

        ts.add(64);  

        ts.add(-100);  

        ts.add(0);  

        System.out.println(ts);  //發現列印出來的已然是有序狀态  

        System.out.println("第一個:"+ts.first());   

        System.out.println("最後一個:"+ts.last());   

        System.out.println("小于64的最大元素(64前面的):"+ts.lower(64));    

        System.out.println("大于0的最小元素(0後面的):"+ts.higher(0));    

        System.out.println("0~100之間的:"+ts.subSet(0, 100));  //半閉半開區間  

        System.out.println("小于64的集合"+ts.headSet(64));  

        System.out.println("大于或者等于0的集合"+ts.tailSet(0));  

        try  

        {  

            TreeSet errorSet=new TreeSet();  

            errorSet.add(new error());  

        }catch(Exception e)  

            System.out.println("由于error類沒有實作Comparable接口的compareTo方法,是以這裡出現類型轉換的異常");  

        }  

            TreeSet errorSet1=new TreeSet();  

            errorSet1.add(123);  

            errorSet1.add("asd");  

            System.out.println("不同類執行個體的比較 會出類轉換異常");  

        //一個定制排序的set  

        TreeSet myStyleSet=new TreeSet(new Comparator()  

            @Override  

            public int compare(Object o1, Object o2)  

            {  

                return 0;  //一個永遠平等的集合~ 你懂的~  

            }  

        });    

    }  

}  

class A  

    @Override  

    public int hashCode()  

        return 1;  

    public boolean equals(Object obj)  

        return true;  

class B  

        return false;  

class C  

        return 2;  

//一個沒有實作比較的類  

class error  

}  

set
下一篇: set

繼續閱讀