Java 集合列舉泛型(一)
本文出自: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 的方法,該方法用來得到一個包含多元素的資料結構的下一個元素。
位集合(BitSet):實現了一組可以單獨設定和清除的位或標誌。
該類在處理一組布林值的時候非常有用,你只需要給每個值賦值一"位",然後對位進行適當的設定或清除,就可以對布林值進行操作了。
向量(Vector):和傳統陣列非常相似,但是Vector的大小能根據需要動態的變化。
和陣列一樣,Vector物件的元素也能通過索引訪問。
使用Vector類最主要的好處就是在建立物件的時候不必給物件指定大小,它的大小會根據需要動態的變化。
棧(Stack):實現了一個後進先出(LIFO)的資料結構。
你可以把棧理解為物件的垂直分佈的棧,當你新增一個新元素時,就將新元素放在其他元素的頂部。
當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。
字典(Dictionary):是一個抽象類,它定義了鍵對映到值的資料結構。
當你想要通過特定的鍵而不是整數索引來訪問資料的時候,這時候應該使用Dictionary。
由於Dictionary類是抽象類,所以它只提供了鍵對映到值的資料結構,而沒有提供特定的實現。
雜湊表(Hashtable):提供了一種在使用者定義鍵結構的基礎上來組織資料的手段。
例如,在地址列表的雜湊表中,你可以根據郵政編碼作為鍵來儲存和排序資料,而不是通過人名。
雜湊表鍵的具體含義完全取決於雜湊表的使用情景和它包含的資料。
屬性(Properties):繼承於 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字串。
Properties 類被許多Java類使用。例如,在獲取環境變數時它就作為System.getProperties()方法的返回值。
圖示概述
集合框架體系如圖所示(入門版)
簡版
入門到放棄版
1.集合框架的出現為提供了預先包裝的資料結構和演算法,更方便使用
2.介面及相關類容參考菜鳥教程:Java 集合框架http://www.runoob.com/java/java-collections.html
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
當前元素的集合:
張三 李四 王五 李四 趙六
張三
當前元素的集合:
張三 李四 王五 李四 趙六
趙六
當前元素的集合:
張三 李四 王五 李四 趙六
張三
當前元素的集合:
李四 王五 李四 趙六
趙六
當前元素的集合:
李四 王五 李四 */
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
不懂得地方,微信掃二維碼提問
相關文章
- 8.集合、泛型、列舉、註解、反射泛型反射
- Java:Collection集合、泛型Java泛型
- Java集合和泛型Java泛型
- ajax 提交陣列 泛型集合陣列泛型
- 【ITOO】--陣列、集合、泛型解析陣列泛型
- java泛型之泛型陣列。Java泛型陣列
- java 泛型陣列Java泛型陣列
- java列舉型別Java型別
- java 列舉型別Java型別
- Java反射給泛型集合賦值Java反射泛型賦值
- 泛型集合 list泛型
- 泛型集合 Queue泛型
- Java - Enum 列舉型別Java型別
- Java入門教程十二(集合與泛型)Java泛型
- Java 中的泛型 集合(List,Set) MapJava泛型
- java中的列舉型別Java型別
- 集合框架-引入泛型框架泛型
- c#泛型集合C#泛型
- java基礎(十一) 列舉型別Java型別
- Java進階學習之集合與泛型(1)Java泛型
- Java集合 Collection、Set、Map、泛型 簡要筆記Java泛型筆記
- 07.集合和泛型泛型
- C# 泛型集合SortedListC#泛型
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- java中的列舉型別學習Java型別
- Java基礎教程(15)–列舉型別Java型別
- Java列舉型別的使用和原理Java型別
- 泛型方法、初始集合和集合的遍歷泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- Day22 集合,ArrayList,泛型泛型
- Java 泛型Java泛型
- Java泛型Java泛型
- 列舉型別型別
- Java的泛型詳解(一)Java泛型
- Java列舉Java
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- Java中如何使用泛型實現介面中的列表集合?Java泛型