1. 程式人生 > >Java 集合列舉泛型(一)

Java 集合列舉泛型(一)

一丶概述

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

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

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

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

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

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

二丶正文

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

在Java中的資料結構主要包括以下幾種介面和類:
列舉(Enumeration):雖然它本身不屬於資料結構

,但它在其他資料結構的範疇裡應用很廣。 列舉(The Enumeration)介面定義了一種從資料結構中取回連續元素的方式。

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

位集合(BitSet):實現了一組可以單獨設定和清除的位或標誌。
該類在處理一組布林值的時候非常有用,你只需要給每個值賦值一"位",然後對位進行適當的設定或清除,就可以對布林值進行操作了。向量(Vector):和傳統陣列非常相似,但是Vector的大小能根據需要動態的變化。
和陣列一樣,Vector物件的元素也能通過索引訪問。

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

棧(Stack):實現了一個後進先出(LIFO)的資料結構。
你可以把棧理解為物件的垂直分佈的棧,當你新增一個新元素時,就將新元素放在其他元素的頂部。
當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。字典(Dictionary):是一個抽象類,它定義了鍵對映到值的資料結構。
當你想要通過特定的鍵而不是整數索引來訪問資料的時候,這時候應該使用Dictionary。

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

雜湊表(Hashtable):提供了一種在使用者定義鍵結構的基礎上來組織資料的手段。
例如,在地址列表的雜湊表中,你可以根據郵政編碼作為鍵來儲存和排序資料,而不是通過人名。
雜湊表鍵的具體含義完全取決於雜湊表的使用情景和它包含的資料。屬性(Properties):繼承於 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字串。
Properties 類被許多Java類使用。例如,在獲取環境變數時它就作為System.getProperties()方法的返回值。

圖示概述


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


簡版


入門到放棄版


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

Tree型功能對比圖:


集合小案例分享

/**
 * <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);
}
        }
    }
}

執行結果:


上述根據操作顯示

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
        當前元素的集合:
        張三 李四 王五 李四 趙六
        張三
        當前元素的集合:
        張三 李四 王五 李四 趙六
        趙六
        當前元素的集合:
        張三 李四 王五 李四 趙六
        張三
        當前元素的集合:
        李四 王五 李四 趙六
        趙六
        當前元素的集合:
        李四 王五 李四 */

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 **/

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