小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java中Set接口及其實(shí)現(xiàn)

 閑來看看 2012-04-10

Java中Set接口及其實(shí)現(xiàn) Set接口及其實(shí)現(xiàn)
1.Set接口
  Set是對數(shù)學(xué)上集的抽象,Set中不包含重復(fù)的元素.如何界定是否是重復(fù)元素?Set最多可含一個(gè)null元素;對于任意的非null元素e1和e2,都滿足e1.equals(e2)==false.
  Object.hashcode()的約定:
a.在程序的一次執(zhí)行中,無論何時(shí)在同一個(gè)java對象上重復(fù)調(diào)用hashcode(),都必須一致地返回同一個(gè)整數(shù)值,并不像Object.equals()那樣提供Object是否被修改了的信息,但這個(gè)整數(shù)值不必在同一個(gè)應(yīng)用程序的多次運(yùn)行之間保持一致.
b.如果兩個(gè)Object通過equals()判斷是相等的,那么,在這兩個(gè)Object上調(diào)用hashcode()必返回相同的值.
c.如果兩個(gè)Object通過equals()判斷是不相等的,那么,并不要求這兩個(gè)Object.hashcode()返回不同的整數(shù)值.
  集合操作:
   并         s1.addAll()原
   交         s1.retainAll(s2)原
  非對稱差    s1.remove(s2)
  對稱差      Set symmetricDiff = new HashSet(s1);
              symmertricDiff.add(s2);
              Set tmp = new HashSet(s1);
              tmp.retainAll(s2);
              symmertricDiff.removeAll(tmp);
              則,symmertricDiff即為s1和s2的對稱差.
  相對補(bǔ)      Set relativeCompl = new HashSet(s1);
              Set tmp = new HashSet(s1);
              tmp.retainAll(s2);
              relativeCompl.removeAll(tmp);
              則,relativeCompl稱為s2的相對補(bǔ). 
2.Set實(shí)現(xiàn)
  HashSet是使用一個(gè)哈希表存儲元素的,是非排序的,可以隨機(jī)訪問,是Set的最優(yōu)性能實(shí)現(xiàn).TreeSet實(shí)現(xiàn)了SortedSet接口,使用一個(gè)紅黑樹來存儲元素,提供了元素的有序存儲和訪問.
  2.1 HashSet
  HashSet在底層實(shí)現(xiàn)上依賴于HashMap.
    HashSet的代碼片斷:
  // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    public HashSet() {
 map = new HashMap<E,Object>();
    }

    public boolean add(E o) {
 return map.put(o, PRESENT)==null;
    }

    public boolean remove(Object o) {
 return map.remove(o)==PRESENT;
    }

    public boolean contains(Object o) {
       return map.containsKey(o);
    }
從代碼可見,HashSet在底層借用HashMap,使用一個(gè)Object類型的啞元值作為HashSet中元素在底層HashMap存儲中的映射值.它抓住了HashMap的鍵不允許重復(fù)的特性.對于add()中調(diào)用底層映射的put(),將欲添加的元素和一個(gè)PRESENT啞元值放入底層map.如果底層Map返回null,說明原來的集合中并不存在該鍵.對于Map接口的put()返回null時(shí)有兩種解釋,一是原來的Map中不包含該鍵;另一種可能是原來的Map中已經(jīng)存儲了該健,但該鍵映射到null.而在HashSet中的add()和remove()等中的返回null只有一種解釋,即原來的集合不包含該元素.這是因?yàn)镠ashSet的底層的映射中存儲的都是一個(gè)名為PRESENT的Object類型的對象,不可能是null.
 
  2.2 TreeSet
   Set接口有一個(gè)子接口:SortedSet,提供了集合元素的順序存儲,其中元素保持升序排列.為了在加入一個(gè)元素到SortedSet實(shí)現(xiàn)時(shí)能對這些元素排序,元素類型必須實(shí)現(xiàn)Comarable接口,或者建立SortedSet時(shí)使用Comparator.否則程序在運(yùn)行時(shí)將拋出ClassCastException.
3.使用Set的注意事項(xiàng)
  如果Set中存儲了可變對象,當(dāng)這些對象出現(xiàn)重復(fù)元素,從而從根本上違反了Set的約定,Set的行為也變得不確定.所以,在Set中存儲可變對象時(shí),一定要十分小心.同樣,對于Map中的key也一樣,因?yàn)镸ap中的key也是不允許重復(fù)的.
    //DupEleSet.java
  class DupEleSet{
   public static void main(String [] args)
   {
        Calendar cld=new Calendar.getInstance();
       cld.set(2003,0,1);

        Date d1 = cld.getTime();

        cld.set(2005,10,2);
       Date d2 = cld.getTime();

         Set s = new HashSet();
          s.add(d1);
          s.add(d2);

          System.out.println("before modify:"+s);

          d1.setTime(d2.getTime());

            System.out.println("after modified:"+s);

        }
     }
上面的程序輸出:
  before modify:[Wed Jan 01 21:54:19 cst 2003,Thu Nov 02 21:54:19 cst 2000]
  after modifyied:[Wed Jan 01 21:54:19 cst 2000,Thu Nov 02 21:54:19 cst 2000]

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多