1. 程式人生 > >Java集合總結(List、Map、Set)

Java集合總結(List、Map、Set)

集合的引入

 當我們有種需求,需要儲存多個元素的結構時,我們前面講過陣列,陣列可以儲存。但是陣列也有它的弊端,使用的時候,必須先定義好長度,也就是陣列的長度是固定,不能根據我們的需求自動變長或者變短。

我們看一個例項:先定義一個Student類:

 1 public class Student {
 2  
 3     private String name;
 4     private Integer age;
 5      
 6     public Student() {
 7         super();
 8         // TODO Auto-generated constructor stub
9 } 10 public Student(String name, Integer age) { 11 super(); 12 this.name = name; 13 this.age = age; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public
Integer getAge() { 22 return age; 23 } 24 public void setAge(Integer age) { 25 this.age = age; 26 } 27 28 29 }

然後我們需要儲存三個學生資訊:我們給下測試類:

1 public class Test {
2  
3     public static void main(String[] args) {
4         Student students[]=new Student[3];
5 students[0]=new Student("張三",1); 6 students[1]=new Student("李四",2); 7 students[2]=new Student("王五",3); 8 } 9 }

這裡我們很好的實現了用陣列結構儲存了三個學生,但是,假如我們需要再儲存一個學生,就懵逼了,因為長度固定了。所以就引入了可變化長度的集合。

 

一、List集合

Collection介面是集合的老祖宗,定義了介面的基本方法,我們檢視api 文件:

List是Collection介面的子介面,也是最常用的介面,此介面對Collection介面進行了大量的擴充套件,List集合裡的元素是可以重複的。

 List介面的主要實現類有ArrayList,和LinkedList。在資料量不大的情況下,這兩個類效能差別不大,一般情況下,集合裡的元素很少變化的,一般用ArrayList,假如集合裡元素經常變動,要用LinkedList;底層實現有差別的。我們給下例項:

 1 import java.util.ArrayList;
 2  
 3 public class TestArrayLit {
 4  
 5     private static void pringArrayList(ArrayList<String> arrayList){
 6         System.out.println("當前的集合元素:");
 7         for(int i=0;i<arrayList.size();i++){
 8             System.out.println(arrayList.get(i));
 9         }
10     }
11      
12     public static void main(String[] args) {
13         ArrayList<String> arrayList=new ArrayList<String>();
14         // 新增元素
15         arrayList.add("張三");
16         arrayList.add("李四");
17         pringArrayList(arrayList);
18         // 在指定位置插入元素
19         arrayList.add(1, "小張三");
20         pringArrayList(arrayList);
21         // 元素的替換
22         arrayList.set(2, "小李四");
23         pringArrayList(arrayList);
24         // 移除元素
25         arrayList.remove(0);
26         pringArrayList(arrayList);
27     }
28 }

執行輸出:

當前的集合元素:

張三

李四

當前的集合元素:

張三

小張三

李四

當前的集合元素:

張三

小張三

小李四

當前的集合元素:

小張三

小李四

 1 import java.util.LinkedList;
 2  
 3 public class TestLinkedList {
 4  
 5     private static void pringLinkedList(LinkedList<String> linkedList){
 6         System.out.println("當前元素的集合:");
 7         for(int i=0;i<linkedList.size();i++){
 8             System.out.print(linkedList.get(i)+" ");
 9         }
10         System.out.println();
11     }
12      
13     public static void main(String[] args) {
14         LinkedList<String> linkedList=new LinkedList<String>();
15         linkedList.add("張三");
16         linkedList.add("李四");
17         linkedList.add("王五");
18         linkedList.add("李四");
19         linkedList.add("趙六");
20         pringLinkedList(linkedList);
21          
22         // indexOf 尋找位置
23         System.out.println(linkedList.indexOf("李四"));
24         pringLinkedList(linkedList);
25          
26         // peekFirst 獲取第一個元素
27         System.out.println(linkedList.peekFirst());
28         pringLinkedList(linkedList);
29          
30         // peekLast 獲取最後一個元素
31         System.out.println(linkedList.peekLast());
32         pringLinkedList(linkedList);
33          
34         // pollFirst 摘取第一個元素
35         System.out.println(linkedList.pollFirst());
36         pringLinkedList(linkedList);
37          
38         // pollLast 榨取最後一個元素
39         System.out.println(linkedList.pollLast());
40         pringLinkedList(linkedList);
41     }
42 }

執行輸出:

當前元素的集合:

張三 李四 王五 李四 趙六 

1

當前元素的集合:

張三 李四 王五 李四 趙六 

張三

當前元素的集合:

張三 李四 王五 李四 趙六 

趙六

當前元素的集合:

張三 李四 王五 李四 趙六 

張三

當前元素的集合:

李四 王五 李四 趙六 

趙六

當前元素的集合:

李四 王五 李四 

 

二、集合的遍歷

前面我們講了最簡單的集合遍歷用for迴圈。今天再介紹兩個 Iterator和foreach;

首先是Iterator遍歷器,我們給下例項:

先給一個Student類:

 1 public class Student {
 2  
 3     private String name;
 4     private Integer age;
 5      
 6      
 7      
 8     public Student() {
 9         super();
10         // TODO Auto-generated constructor stub
11  } 12 public Student(String name, Integer age) { 13 super(); 14 this.name = name; 15 this.age = age; 16  } 17 public String getName() { 18 return name; 19  } 20 public void setName(String name) { 21 this.name = name; 22  } 23 public Integer getAge() { 24 return age; 25  } 26 public void setAge(Integer age) { 27 this.age = age; 28  } 29 30 31 }
 1 import java.util.Iterator;
 2 import java.util.LinkedList;
 3  
 4  
 5 public class TestIterator {
 6  
 7     public static void main(String[] args) {
 8         LinkedList<Student> list=new LinkedList<Student>();
 9         list.add(new Student("張三",10)); 10 list.add(new Student("李四",20)); 11 list.add(new Student("王五",30)); 12 13 /** 14 * 用Iterator遍歷集合 15 */ 16 Iterator<Student> it=list.iterator(); // 返回一個迭代器 17 while(it.hasNext()){ 18 Student s=it.next(); // 返回迭代的下一個元素。 19 System.out.println("姓名:"+s.getName()+"年齡:"+s.getAge()); 20  } 21  } 22 }

執行輸出:

姓名:張三年齡:10

姓名:李四年齡:20

姓名:王五年齡:30

 

foreach遍歷:

 1 import java.util.LinkedList;
 2  
 3 public class TestForeach {
 4  
 5     public static void main(String[] args) {
 6         LinkedList<Student> list=new LinkedList<Student>();
 7         list.add(new Student("張三",10));
 8         list.add(new Student("李四",20)); 9 list.add(new Student("王五",30)); 10 11 /** 12 * 用foreach遍歷 13 */ 14 for(Student s:list){ 15 System.out.println("姓名:"+s.getName()+"年齡:"+s.getAge()); 16  } 17  } 18 }

執行輸出:

姓名:張三年齡:10

姓名:李四年齡:20

姓名:王五年齡:30

 

三、Map集合

是存放一對值的最大介面,即介面中的每一個元素都是一對,以key->value鍵值對的形式儲存;我們這裡講解下Map的常用實現類HashMap

我們給下演示程式碼:

 1 import java.util.HashMap;
 2 import java.util.Iterator;
 3  
 4 public class TestHashMap {
 5  
 6     public static void main(String[] args) {
 7         HashMap<String,Student> hashMap=new HashMap<String,Student>();
 8         hashMap.put("1號", new Student("張三",10));
 9         hashMap.put("2號", new Student("李四",20));
10         hashMap.put("3號", new Student("王五",30));
11          
12         // 通過key,獲取value
13         Student s=hashMap.get("1號");
14         System.out.println(s.getName()+":"+s.getAge());
15          
16         Iterator<String> it=hashMap.keySet().iterator(); // 獲取key的集合,再獲取迭代器
17         while(it.hasNext()){
18             String key=it.next();  // 獲取key
19             Student student=hashMap.get(key);  // 通過key獲取value
20             System.out.println("key="+key+" value=["+student.getName()+","+student.getAge()+"]");
21         }
22     }
23 }

執行輸出:

張三:10

key=3號 value=[王五,30]

key=2號 value=[李四,20]

key=1號 value=[張三,10]

 

四、Set集合

Set集合是Collection介面的子介面,沒有對Collection介面進行擴充套件,裡面不允許存在重複的內容

演示程式碼:

 1 import java.util.HashSet;
 2 import java.util.Iterator;
 3  
 4 public class TestHashSet {
 5  
 6     public static void main(String[] args) {
 7         /**
 8          * 1,HashSet是無序
 9          * 2,不循序有重複的值
10          */
11         HashSet<String> hs=new HashSet<String>();
12         hs.add("21221");
13         hs.add("112");
14         hs.add("312");
15         hs.add("421");
16         hs.add("312");
17          
18         /**
19          * 用Iterator遍歷集合
20          */
21         Iterator<String> it=hs.iterator();
22         while(it.hasNext()){
23             String s=it.next();
24             System.out.println(s+" ");
25         }
26     }
27 }

執行輸出:

112 

421 

312 

21221