Java集合類詳解


 

集合類

Java集合類詳解

概述

集合類就是一個動態對象數組
與之相關的接口包括

  • Collection
    • List
      • ArrayList
      • Vector
      • LinkedList
    • Set
      • HashSet
        • LinkedHashSet (按照插入順序存放的,不重復的)
      • SortedSet
        • TreeSet
    • Queue
      • LinkedList
  • Map
    • hashMap
    • weakhashMap
    • SortedMap
      • TreeMap
  • Map.Entry
  • Iterator
    • ListIterator
  • Enumeration 最早的輸出的接口

Collection接口

       @Override
        public boolean contains(Object o) {
            return false;
        }

        @Override
        public Iterator<Integer> iterator() {
            return null;
        }

        @Override
        public Object[] toArray() {
            return new Object[0];
        }

        @Override
        public <T> T[] toArray(T[] a) {
            return null;
        }


        @Override
        public boolean containsAll(Collection<?> c) {
            return false;
        }

        @Override
        public boolean addAll(Collection<? extends Integer> c) {
            return false;
        }

        @Override
        public boolean removeAll(Collection<?> c) {
            return false;
        }

        @Override
        public boolean retainAll(Collection<?> c) {
            return false;
        }

        @Override
        public void clear() {
        }

注意 al.retainAll(al1); 相當於求交集然后放在al中 Integer []array1=al.toArray(new Integer[]{});
Object []array2=al.toArray(); 兩個獲得Array的方法,第一個是通過泛型指定了數組的類型,第二個返回的是Object[]數組,使用的時候需要轉型

List接口

可以重復 ,可以認為是一個數組,可以通過索引取出數據
List對於Collection有很大的擴充 新增包括

  • 指定位置增加數據
  • 指定位置增加一組數據
  • 取得指定位置數據
  • 在指定位置刪除數據
  • subList(from,to)返回子List
    • al1=al.subList(0,1); 等

數據的順序與插入順序一樣

LinkedList類

同時實現了List和Queue接口,就是一個鏈表的封裝

   LinkedList<String> ll=new LinkedList<String>();
    ll.add("eq");
    ll.add("eq1");
    ll.add("eq2");
    ll.add("eq3");
    ll.addFirst("23");
    ll.addLast("233");
    System.out.println(ll);

Queue接口

element找到頭 offer在隊列尾加元素
peek找到頭
poll找到頭並刪除
remove刪除頭

Set

其中的方法與Collection的完全一樣

  • 順序與插入的順序無關
  • 不重復的,如果重復插入會忽略
TreeSet
  • 數據是排序的!!,實際上也是SortedSet的一個子類
HashSet
  • 數據散列存放
TreeSet自動排序原理

要排序必須可比較,因此TreeSet指定的類必須實現了Comparable方法

判斷重復元素的原理

使用equals和hashCode方法來判斷 首先判斷hashCoede是否一樣,不相同則為不同元素,相同則調用equals()來最終決定,因此將元素加入Set的的時候最好復寫這兩個方法

  • 對象相等->hashcode一定相等
  • hashCode相等->對象不一定相等

SortedSet接口

是自動排序的 方法

  • 返回首尾元素
  • 返回任意一段子SortedSet headSet/tailSet/subSet

Iterator接口

Collection的輸出方式

  • Iterator
  • ListIterator
  • foreach
  • Enumeration

集合的輸出最好一定是用Iterator接口
Iterator是迭代輸出接口
通過Collection.iterator()實例化
hasnext()判斷是否有內容,並且移動指針
在使用迭代輸出的時候,不要使用集合類的remove方法,而是要用iterator的remove方法,盡量不要再輸出時刪除
單向操作

ListIterator接口

繼承自Iterator
可以雙向的輸出
只有List接口才有實例化該接口的方法 只能現正向輸出,后逆向輸出,不能倒過來 

   List ls=new ArrayList(); 
ls.add("hello");
ls.add("world");
ls.add("!!!");
ListIterator ll=ls.listIterator(); while (ll.hasNext()){ System.out.print(ll.next()); } while (ll.hasPrevious()){ System.out.print(ll.previous()); }

foreach

可以用於輸出集合或者數組中的內容,定義為:

for(type element: array){
     System.out.println(element);
  }

舉例如下

    int s[]={0,1,2,3,4,5};
    for(int w:s){
        System.out.println(w);
    }
    List<Integer> l=new ArrayList<Integer>();
    l.add(2);
    l.add(3);
    l.add(4);
    for(int w:l){
        System.out.println(w);
    }

    int ss[][]={{1,2,3},{4,5,6}};
    //這里展示一下不規則數組
    int sss[][]=new int[2][];
    sss[0]=new int[3];
    sss[1]=new int[5];
    for(int x[]:ss){
        for(int y:x){
            System.out.println(y);
        }
    }

Map接口

Map.Entry接口

是Map的內部接口
指的是一個key->value的對象

實際上Map保存的是Map.Entry的對象,其實也相當於一組對象的集合

常見方法

  • containsKey
  • containsValue
  • get
  • KeySet 返回Key的Set集合
  • Values 返回Value的Collection集合

常用的子類

  • HashMap
  • HashTable 比較老的類,與HashMap相比類似於ArraList與Vector的關系
  • TressMap 按照Key的排序類
  • WeakHashMap
WeakHashMap

當Map的某些內容長期不使用的時候,會自動刪除掉
在垃圾回收的時候,會把沒有被引用的數據刪掉

Map輸出,可以獲得KeySet然后打印Value,或者使用Map.Entry來迭代輸出

    Map<String,String> m=new HashMap<String,String>();
    m.put("1","11"); m.put("2","22");m.put("3","33");

    Set<Map.Entry<String,String>> ms=m.entrySet();
    //迭代器輸出
    Iterator<Map.Entry<String,String>> msi=ms.iterator();
    while (msi.hasNext()){
        Map.Entry<String,String> me=msi.next();
        System.out.println(me.getKey()+" "+me.getValue());
    }
    //foreach輸出
    for(Map.Entry<String,String> me:ms){
        System.out.println(me.getKey()+" "+me.getValue());
    }

作為Key,實際上是一個Set了,不能重復,是通過equals和hashCode來判斷的,所以使用非系統類作為鍵值的話,應該復寫這兩個方法

IdentityHashMap

允許key是重復的,比較鍵(和值)時使用引用相等性代替對象相等性

我們說的Map的鍵值不能重復,就是說對象equals的時候不能想等。而InentityHashMap中必須使用同一個引用才能認為是相等的

    Map<String,String> mm=new IdentityHashMap<String,String >();
    mm.put(new String("123"),"1");
    mm.put(new String("123"),"2");
    Set<Map.Entry<String,String>> ms1=mm.entrySet();
    for(Map.Entry<String,String> me:ms1){
        System.out.println(me.getKey()+" "+me.getValue());
    }
//這段代碼可以打印出結果,但是,由於“123”的引用都丟失了,實際上你通過get(i)是取不出來任何數據的

SoretdMap/TreeMap

按照key進行排序,可以獲得第一個/最后一個key,獲得部分的Map的集合

    SortedMap<String,String> sm=new TreeMap<String,String>();
    sm.put("A","AA");
    sm.put("C","CC");
    sm.put("B","BB");
    System.out.println(sm.lastKey());
    System.out.println(sm.firstKey());
    sm.subMap("B","C");

對象引用強度說明

  • 強引用
    • 即使jvm內存不足,也不回收這個對象
  • 軟引用
    • 內存不足時,才回收
  • 弱引用
    • 不管內存咋樣,只要能回收了就回收了
  • 虛引用
    • 跟沒有引用一樣

Collections 集合操作類

主要的是對於一些常見的集合的操作,都是一些靜態的處理方法,可以用到,如下

    java.util.Collections.addAll(l, "d", "qwe", "asd");
    java.util.Collections.reverse(l);
    java.util.Collections.replaceAll(l,"d","ddd");
    java.util.Collections.binarySearch(l,"qwe");
    java.util.Collections.sort(l);
    java.util.Collections.swap(l,2,3);

Stack類

是Vector的子類

    Stack<String> stack=new Stack<String>();
    stack.push("1");

    stack.add(3,"10"); //棧中間加入
    stack.peek();//得到棧頂不彈出
    stack.search("2");//搜索

Properities 屬性類

是hashtable的子類

    Properties pro=new Properties();
    pro.setProperty("1","11");
    pro.setProperty("2","22");
    pro.setProperty("3","33");

    pro.storeToXML(new FileOutputStream("D:/a.xml"),"MYXML");

    Properties pro1=new Properties();

    pro1.loadFromXML(new FileInputStream("D:/a.xml"));
    pro1.list(System.out);
    System.out.println("1"+"  "+pro1.getProperty("1"));

可以保存到xml或者普通文件。實際上就是一個Map,可以使用Map的全部操作。通過list可以列出全部的屬性。
store和load方法來與文件進行交互!!!!

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM