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 stub9 } 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 publicInteger 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