Java 集合列舉泛型(一)

weixin_34019929發表於2018-06-04

本文出自:http://blog.csdn.net/dt235201314/article/details/70210256

一丶概述

雛鷹飛翔計劃三四周(07/04/18)內容:集合 列舉 泛型

結合Android開發經驗先說說印象

集合:常見用途,裝資料,裝物件。後臺json資料常巢狀list,map;

列舉:在時間控制元件見過,限制引數(year month day);

泛型:在Android網路框架封裝callback<T>介面有用過,接受傳遞不同的實體類。也是java反射機制的一種體現。

(回頭看,在邊工作邊學習的情況下2周搞定集合是不可能的,只能大概瞭解集合框架,大概資料結構和常見的一些API)

新增原始碼閱讀:https://github.com/JinBoy23520/JavaSource(持續更新)

二丶正文

java資料結構(集合列舉相關)

在Java中的資料結構主要包括以下幾種介面和類:
列舉(Enumeration):雖然它本身不屬於資料結構,但它在其他資料結構的範疇裡應用很廣。 列舉(The Enumeration)介面定義了一種從資料結構中取回連續元素的方式。

例如,列舉定義了一個叫nextElement 的方法,該方法用來得到一個包含多元素的資料結構的下一個元素。

請參見列舉(Enumeration)

位集合(BitSet):實現了一組可以單獨設定和清除的位或標誌。
該類在處理一組布林值的時候非常有用,你只需要給每個值賦值一"位",然後對位進行適當的設定或清除,就可以對布林值進行操作了。

請參見位集合(BitSet)

向量(Vector):和傳統陣列非常相似,但是Vector的大小能根據需要動態的變化。
和陣列一樣,Vector物件的元素也能通過索引訪問。

使用Vector類最主要的好處就是在建立物件的時候不必給物件指定大小,它的大小會根據需要動態的變化。

請參見向量(Vector)

棧(Stack):實現了一個後進先出(LIFO)的資料結構。
你可以把棧理解為物件的垂直分佈的棧,當你新增一個新元素時,就將新元素放在其他元素的頂部。
當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。

請參見棧(Stack)

字典(Dictionary):是一個抽象類,它定義了鍵對映到值的資料結構。
當你想要通過特定的鍵而不是整數索引來訪問資料的時候,這時候應該使用Dictionary。

由於Dictionary類是抽象類,所以它只提供了鍵對映到值的資料結構,而沒有提供特定的實現。

請參見字典( Dictionary)

雜湊表(Hashtable):提供了一種在使用者定義鍵結構的基礎上來組織資料的手段。
例如,在地址列表的雜湊表中,你可以根據郵政編碼作為鍵來儲存和排序資料,而不是通過人名。
雜湊表鍵的具體含義完全取決於雜湊表的使用情景和它包含的資料。

請參見雜湊表(HashTable)

屬性(Properties):繼承於 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字串。
Properties 類被許多Java類使用。例如,在獲取環境變數時它就作為System.getProperties()方法的返回值。

請參見屬性(Properties)

圖示概述

5260759-f0587136d05d5adb
image

集合框架體系如圖所示(入門版)

5260759-0cb323aa6b4ad86b
image

簡版

5260759-e8b8876420b8b6aa
image

入門到放棄版

5260759-490475fabcd68f0b
image

1.集合框架的出現為提供了預先包裝的資料結構和演算法,更方便使用

2.介面及相關類容參考菜鳥教程:Java 集合框架http://www.runoob.com/java/java-collections.html

Tree型功能對比圖:

5260759-61604b1558d41759
image

集合小案例分享

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/16
 *     desc   :實現僱員管理新增·刪除·修改功能
 *     version: 1.0
 * </pre>
 */

public class ArrayListDemo {
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //建立一個EmpManage物件
        EmpManage em = new EmpManage();
        //做出一個簡單的選單
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.println("請選擇一個操作:");
            System.out.println("1:表示新增一個僱員");
            System.out.println("2:僱員查詢一個:");
            System.out.println("3:修改一個僱員");
            System.out.println("4:刪除一個僱員");
            System.out.println("5:退出");
            String operType = br.readLine();
            if (operType.equals("1")) {
                System.out.println("請輸入編號");
                String empNo = br.readLine();
                System.out.println("請輸入名字");
                String name = br.readLine();
                System.out.println("請輸入工資");
                float sal = Float.parseFloat(br.readLine());
                Emp emp = new Emp(empNo, name, sal);
                em.addEmp(emp);
            } else if (operType.equals("2")) {
                System.out.println("請輸入編號");
                String empNo = br.readLine();
                em.showInfo(empNo);
            } else if (operType.equals("3")) {
                System.out.println("請輸入編號");
                String empNo = br.readLine();
                System.out.println("請輸入修改後工資");
                float sal = Float.parseFloat(br.readLine());
                em.updateSal(empNo, sal);
            } else if (operType.equals("4")) {
                System.out.println("請輸入編號");
                String empNo = br.readLine();
                em.delEmp(empNo);
            } else if (operType.equals("5")) {
                //退出
                System.exit(0);
            }
        }
    }
}

Emp.Java

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/16
 *     desc   :僱員類
 *     version: 1.0
 * </pre>
 */

public class Emp {
    //學號
    private String empNo;
    private String name;
    private float sal;

    //建構函式
    public Emp(String empNo, String name, float sal) {
        this.empNo = empNo;
        this.name = name;
        this.sal = sal;
    }

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getSal() {
        return sal;
    }

    public void setSal(float sal) {
        this.sal = sal;
    }
}

EmpManage.Java

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/16
 *     desc   :僱員管理員類
 *     version: 1.0
 * </pre>
 */

public class EmpManage {
    private ArrayList al = null;

    public EmpManage() {
        al = new ArrayList();
    }

    //加入員工
    public void addEmp(Emp emp) {
        al.add(emp);
    }

    //顯示員工的相關資訊
    public void showInfo(String empNo) {
        //遍歷整個ArrayList()
        for (int i = 0; i < al.size(); i++) {
            //去除Emp物件
            Emp emp = (Emp) al.get(i);
            //比較編號
            if (emp.getEmpNo().equals(empNo)) {
                System.out.println("找到員工,他的資訊是:");
                System.out.println("編號是" + empNo);
                System.out.println("名字是" + emp.getName());
                System.out.println("工資是" + emp.getSal());

            } else {
                System.out.println("沒有該員工");
            }
        }
    }

    //修改工資
    public void updateSal(String empNo, float newSal) {
        for (int i = 0; i < al.size(); i++) {
            Emp emp = (Emp) al.get(i);
            if (emp.getEmpNo().equals(empNo)) {
                emp.setSal(newSal);
            }
        }
    }

    public void delEmp(String empNo) {
        for (int i = 0; i < al.size(); i++) {
            Emp emp = (Emp) al.get(i);
            if (emp.getEmpNo().equals(empNo)) {
                al.remove(i);
            }
        }
    }
}

執行結果:

5260759-32ae93a62d2fb1ab
image

上述根據操作顯示

LinkedLisDemo.Java

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/18
 *     desc   : LinkedList演示
 *     總結 :
 *     1.LinkedList方法上比ArrayList多了對頭部尾部的索引新增刪除方法(LinkedList基於連結串列的資料結構)
 *     2.Java中ArrayList和LinkedList區別:http://pengcqu.iteye.com/blog/502676
 *     3.空間複雜度:ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,
 *     而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
 *     4.時間複雜度:LinkedList不支援高效的隨機元素訪問
 *     version: 1.0
 * </pre>
 */

public class LinkedListDemo {
    private static void pringLinkedList(LinkedList<String> linkedList){
        System.out.println("當前元素的集合:");
        for(int i=0;i<linkedList.size();i++){
            System.out.print(linkedList.get(i)+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        LinkedList<String> linkedList=new LinkedList<String>();
//        linkedList.addFirst("張三");
        linkedList.add("張三");
        linkedList.add("李四");
        linkedList.add("王五");
        linkedList.add("李四");
        linkedList.add("趙六");
        pringLinkedList(linkedList);

        // indexOf 尋找位置
        System.out.println(linkedList.indexOf("李四"));
        pringLinkedList(linkedList);

        // peekFirst 獲取第一個元素
        System.out.println(linkedList.peekFirst());
        pringLinkedList(linkedList);

        // peekLast 獲取最後一個元素
        System.out.println(linkedList.peekLast());
        pringLinkedList(linkedList);

        // pollFirst 摘取第一個元素
        System.out.println(linkedList.pollFirst());
        pringLinkedList(linkedList);

        // pollLast 榨取最後一個元素
        System.out.println(linkedList.pollLast());
        pringLinkedList(linkedList);
    }
}

/**執行結果
當前元素的集合:
        張三 李四 王五 李四 趙六
        1
        當前元素的集合:
        張三 李四 王五 李四 趙六
        張三
        當前元素的集合:
        張三 李四 王五 李四 趙六
        趙六
        當前元素的集合:
        張三 李四 王五 李四 趙六
        張三
        當前元素的集合:
        李四 王五 李四 趙六
        趙六
        當前元素的集合:
        李四 王五 李四 */

Java中ArrayList和LinkedList區別(時間空間複雜度分析):http://pengcqu.iteye.com/blog/502676

MapDemo.Java

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/16
 *     desc   : map演示
 *     總結   :
 *     1.HashMap 是一個雜湊表,是存放一對值的最大介面,即介面中的每一個元素都是一對,以key->value鍵值對的形式儲存
 *     2.四種遍歷
 *     3.TreeMap 延伸閱讀 http://blog.csdn.net/chenssy/article/details/26668941
 *     version: 1.0
 * </pre>
 */

public class MapDemo {
    public static void main(String[] args) {
      // TODO Auto-generated method stub

       //LinkList
//    LinkedList ll=new LinkedList();
//    Emp emp1=new Emp("sa01","aa", 1.2f);
//    Emp emp2=new Emp("sa01","bb", 1.2f);
//    //表示把emp1加在連結串列的最前面
//    ll.addLast(emp1);
//    ll.addFirst(emp2);
//    for(int i=0; i<ll.size(); i++)
//    {
//       System.out.println(((Emp)ll.get(i)).getName());
//    }

        // Vector的用法
//    Vector vv=new Vector();
//    Emp emp1=new Emp("sa01","aa", 1.2f);
//    vv.add(emp1);
//    for(int i=0; i<vv.size(); i++)
//    {
//       Emp emp=(Emp)vv.get(i);
//    }
        // Stack stack=new Stack();
        // stack.





      //建立一個HashMap 物件
      HashMap hm=new HashMap();

      Emp emp1=new Emp("s001","aaa", 3.5f);
      Emp emp2=new Emp("s002","老桑", 3.5f);
      Emp emp3=new Emp("s003","老王", 3.5f);

      //將emp放到hm中
      hm.put("s001", emp1);
      hm.put("s002", emp2);
      hm.put("s003", emp3);   // 注意鍵值不能重複 這時候s002表示老王了
          if(hm.containsKey("s002"))
      {
         System.out.println("有該員工");
         //如何去除鍵值
         Emp emp=(Emp)hm.get("s002");
         System.out.println("名字:"+emp.getName());
      }
      else
      {
         System.out.println("沒有該員工");
      }
      //遍歷HashMap中所有的key和value   去除的值沒有順序 Iterator迭代器用於遍歷
      Iterator it=hm.keySet().iterator();
      // hasNext返回一個boolean
      while(it.hasNext())
      {
         String key=it.next().toString();
         //通過key去除vale
         Emp emp=(Emp)hm.get(key);
         System.out.println("名字"+emp.getName());
         System.out.println("薪水:"+emp.getSal());
      }


      Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      System.out.println("通過Map.keySet遍歷key和value:");
      for (String key : map.keySet()) {
         System.out.println("key= "+ key + " and value= " + map.get(key));
      }

      //第二種
      System.out.println("通過Map.entrySet使用iterator遍歷key和value:");
      Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
      while (it.hasNext()) {
         Map.Entry<String, String> entry = iterator.next();
         System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }

      //第三種:推薦,尤其是容量大時
      System.out.println("通過Map.entrySet遍歷key和value");
      for (Map.Entry<String, String> entry : map.entrySet()) {
         System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }

      //第四種
      System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");
      for (String v : map.values()) {
         System.out.println("value= " + v);
      }
   }
        //演示HashTable
//        Hashtable ht=new Hashtable();

    }

    /**
    執行結果
    有該員工
    名字:老桑
    名字老王
    薪水:3.5
    名字老桑
    薪水:3.5
    名字aaa
    薪水:3.5
    通過Map.keySet遍歷key和value:
    key= 1 and value= value1
    key= 2 and value= value2
    key= 3 and value= value3
    通過Map.entrySet使用iterator遍歷key和value:
    通過Map.entrySet遍歷key和value
    key= 1 and value= value1
    key= 2 and value= value2
    key= 3 and value= value3
    通過Map.values()遍歷所有的value,但不能遍歷key
    value= value1
    value= value2
    value= value3**/

SetDemo.Java

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/18
 *     desc   :Set演示  運用較少
 *     version: 1.0
 * </pre>
 */

public class SetDemo {
    public static void main(String[] args) {
        /**
         * 1,HashSet是無序
         * 2,不循序有重複的值
         */
        HashSet<String> hs=new HashSet<String>();
        hs.add("21221");
//        hs.add("21221");
        hs.add("112");
        hs.add("312");
        hs.add("421");
        hs.add("312");

        /**
         * 用迭代器Iterator遍歷集合
         */
        Iterator<String> it=hs.iterator();
        while(it.hasNext()){
            String s=it.next();
            System.out.println(s +" ");
        }
    }
}
    /**
     執行結果:
     112
     421
     312
     21221 **/

三丶面試題(加強理解):

40個常見java集合面試題:http://www.importnew.com/15980.html

Java中的集合類解析和一些有深入的面試題:http://blog.csdn.net/he90227/article/details/38061087

寫在最後

如果文章對你有幫助,歡迎點贊支援

程式碼下載:https://github.com/JinBoy23520/CoderToDeveloperByTCLer

不懂得地方,微信掃二維碼提問

5260759-99a6600fde2b9926
image

相關文章