Java 集合列舉泛型(一)
阿新 • • 發佈:2019-02-11
一丶概述
雛鷹飛翔計劃三四周(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類最主要的好處就是在建立物件的時候不必給物件指定大小,它的大小會根據需要動態的變化。
你可以把棧理解為物件的垂直分佈的棧,當你新增一個新元素時,就將新元素放在其他元素的頂部。
當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。字典(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 **/