Java 中的集合
目錄
1.5、集合的案例-Collection集合儲存學生物件並遍歷
4.2、集合的案例-ArrayList集合儲存學生物件三種方式遍歷
1、Collection集合
1.1、集合類的特點
提供一種儲存空間可變的儲存模型,儲存的資料容量可以隨時發生改變
集合類的體系圖
1.2、Collection集合概述和基本使用
Collection集合概述
是單例集合的頂層介面,它表示一組物件,這些物件也稱為Collection的元素
JDK 不提供此介面的任何直接實現,它提供更具體的子介面(如Set和List)實現
Collection集合基本使用
package com.itheima_01; import java.util.ArrayList; import java.util.Collection; /* 建立Collection集合的物件 多型的方式 ArrayList() */ public class CollectionDemo01 { public static void main(String[] args) { //建立Collection集合的物件 Collection<String> c = newArrayList<String>(); //新增元素:boolean add(E e) c.add("hello"); c.add("world"); c.add("java"); //輸出集合物件 System.out.println(c); } }
1.3、Collection集合的常用方法
示例程式碼
package com.itheima_01; import java.util.ArrayList; import java.util.Collection; /* Collection集合常用方法: boolean add(E e):新增元素 boolean remove(Object o):從集合中移除指定的元素 void clear():清空集合中的元素 boolean contains(Object o):判斷集合中是否存在指定的元素 boolean isEmpty():判斷集合是否為空 int size():集合的長度,也就是集合中元素的個數 Alt+7 開啟一個視窗,能夠看到類的所有資訊 */ public class CollectionDemo02 { public static void main(String[] args) { //建立集合物件 Collection<String> c = new ArrayList<String>(); //boolean add(E e):新增元素 // System.out.println(c.add("hello")); // System.out.println(c.add("world")); // System.out.println(c.add("world")); c.add("hello"); c.add("world"); c.add("java"); //boolean remove(Object o):從集合中移除指定的元素 // System.out.println(c.remove("world")); // System.out.println(c.remove("javaee")); //void clear():清空集合中的元素 // c.clear(); //boolean contains(Object o):判斷集合中是否存在指定的元素 // System.out.println(c.contains("world")); // System.out.println(c.contains("javaee")); //boolean isEmpty():判斷集合是否為空 // System.out.println(c.isEmpty()); //int size():集合的長度,也就是集合中元素的個數 System.out.println(c.size()); //輸出集合物件 System.out.println(c); } }
1.4、Collection集合的遍歷
迭代器的介紹
迭代器,集合的專用遍歷方式 Iterator iterator():返回此集合中元素的迭代器,通過集合的iterator()方法得到
迭代器是通過集合的iterator()方法得到的,所以我們說它是依賴於集合而存在的
iterator中的常用的方法
E next():返回迭代中的下一個元素
booleanhasNext():如果迭代具有更多元素,則返回true
Collection集合的遍歷
package com.itheima_02; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* Iterator:迭代器,集合的專用遍歷方式 Iterator<E> iterator():返回此集合中元素的迭代器,通過集合的iterator()方法得到 迭代器是通過集合的iterator()方法得到的,所以我們說它是依賴於集合而存在的 Iterator中的常用方法 E next():返回迭代中的下一個元素 boolean hasNext():如果迭代具有更多元素,則返回 true */ public class IteratorDemo { public static void main(String[] args) { //建立集合物件 Collection<String> c = new ArrayList<String>(); //新增元素 c.add("hello"); c.add("world"); c.add("java"); //Iterator<E> iterator():返回此集合中元素的迭代器,通過集合的iterator()方法得到 Iterator<String> it = c.iterator(); /* public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { ... } */ //E next():返回迭代中的下一個元素 /* System.out.println(it.next()); System.out.println(it.next()); System.out.println(it.next()); System.out.println(it.next()); //NoSuchElementException:表示被請求的元素不存在 */ //boolean hasNext():如果迭代具有更多元素,則返回 true /* if(it.hasNext()) { System.out.println(it.next()); } if(it.hasNext()) { System.out.println(it.next()); } if(it.hasNext()) { System.out.println(it.next()); } if(it.hasNext()) { System.out.println(it.next()); } */ //用while迴圈改進判斷 while (it.hasNext()) { // System.out.println(it.next()); String s = it.next(); System.out.println(s); } } }
1.6、集合的案例-Collection集合儲存學生物件並遍歷
案例需求
建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合
程式碼實現
package com.itheima_03; /* 學生類 */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // ---------------------------------------------------------------------- package com.itheima_03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* 需求: 建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合 思路: 1:定義學生類 2:建立Collection集合物件 3:建立學生物件 4:把學生新增到集合 5:遍歷集合(迭代器方式) */ public class CollectionDemo { public static void main(String[] args) { //建立Collection集合物件 Collection<Student> c = new ArrayList<Student>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); //把學生新增到集合 c.add(s1); c.add(s2); c.add(s3); //遍歷集合(迭代器方式) Iterator<Student> it = c.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + "," + s.getAge()); } } }
2、List集合
2.1、List集合概述和特點
List集合概述
有序集合(也稱為序列),使用者可以精確控制列表中每個元素的插入位置。使用者可以通過整數索引訪問元 素,並搜尋列表中的元素
與Set集合不同,列表通常允許重複的元素
List集合特點
有序:儲存和取出的元素順序一致
可重複:儲存的元素可以重複
package com.itheima_01; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* List集合特點 有序:儲存和取出的元素順序一致 可重複:儲存的元素可以重複 */ public class ListDemo01 { public static void main(String[] args) { //建立集合物件 List<String> list = new ArrayList<String>(); //新增元素 list.add("hello"); list.add("world"); list.add("java"); list.add("world"); //輸出集合物件 // System.out.println(list); //迭代器的方式遍歷 Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
2.2、List集合的特有方法
例項程式碼
package com.itheima_01; import java.util.ArrayList; import java.util.List; /* List集合特有方法: void add(int index,E element):在此集合中的指定位置插入指定的元素 E remove(int index):刪除指定索引處的元素,返回被刪除的元素 E set(int index,E element):修改指定索引處的元素,返回被修改的元素 E get(int index):返回指定索引處的元素 */ public class ListDemo02 { public static void main(String[] args) { //建立集合物件 List<String> list = new ArrayList<String>(); //新增元素 list.add("hello"); list.add("world"); list.add("java"); //void add(int index,E element):在此集合中的指定位置插入指定的元素 // list.add(1,"javaee"); //IndexOutOfBoundsException // list.add(11,"javaee"); //E remove(int index):刪除指定索引處的元素,返回被刪除的元素 // System.out.println(list.remove(1)); //IndexOutOfBoundsException // System.out.println(list.remove(11)); //E set(int index,E element):修改指定索引處的元素,返回被修改的元素 // System.out.println(list.set(1,"javaee")); //IndexOutOfBoundsException // System.out.println(list.set(11,"javaee")); //E get(int index):返回指定索引處的元素 // System.out.println(list.get(1)); //IndexOutOfBoundsException // System.out.println(list.get(11)); //輸出集合物件 // System.out.println(list); //遍歷集合 // System.out.println(list.get(0)); // System.out.println(list.get(1)); // System.out.println(list.get(2)); //用for迴圈改進遍歷 for (int i=0; i<list.size(); i++) { String s = list.get(i); System.out.println(s); } } }
2.3集合的案例-List集合儲存學生物件並遍歷
案例需求
建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合
程式碼實現
package com.itheima_02; /* 學生類 */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // ----------------------------------------------------------------------- package com.itheima_02; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* 需求: 建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合 思路: 1:定義學生類 2:建立List集合物件 3:建立學生物件 4:把學生新增到集合 5:遍歷集合(迭代器方式,for迴圈方式) */ public class ListDemo { public static void main(String[] args) { //建立List集合物件 List<Student> list = new ArrayList<Student>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); //把學生新增到集合 list.add(s1); list.add(s2); list.add(s3); //迭代器方式 Iterator<Student> it = list.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + "," + s.getAge()); } System.out.println("--------"); //for迴圈方式 for(int i=0; i<list.size(); i++) { Student s = list.get(i); System.out.println(s.getName() + "," + s.getAge()); } } }
2.4、併發修改異常
出現的原因
迭代器遍歷的過程中,通過集合物件修改了集合中的元素,造成了迭代器獲取元素中判斷預期修改值和實際
修改值不一致,則會出現:ConcurrentModificationException
解決的方案
用for迴圈遍歷,然後用集合物件做對應的操作即可
示例程式碼
package com.itheima_03; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* 需求: 我有一個集合:List<String> list = new ArrayList<String>(); 裡面有三個元素:list.add("hello");list.add("world");list.add("java"); 遍歷集合,得到每一個元素,看有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現 ConcurrentModificationException:當不允許這樣的修改時,可以通過檢測到物件的併發修改的方法來丟擲此異常 */ public class ListDemo { public static void main(String[] args) { //建立集合物件 List<String> list = new ArrayList<String>(); //新增元素 list.add("hello"); list.add("world"); list.add("java"); //遍歷集合,得到每一個元素,看有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現 // Iterator<String> it = list.iterator(); // while (it.hasNext()) { // String s = it.next(); // if(s.equals("world")) { // list.add("javaee"); // } // } for(int i=0; i<list.size(); i++) { String s = list.get(i); if(s.equals("world")) { list.add("javaee"); } } //輸出集合物件 System.out.println(list); } }
2.5、列表迭代器
ListIterator介紹
通過List集合的listIterator()方法得到,所以說它是List集合特有的迭代器
用於允許程式設計師沿任一方向遍歷的列表迭代器,在迭代期間修改列表,並獲取列表中迭代器的當前位置
示例程式碼
package com.itheima_04; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /* ListIterator:列表迭代器 通過List集合的listIterator()方法得到,所以說它是List集合特有的迭代器 用於允許程式設計師沿任一方向遍歷列表的列表的迭代器,在迭代期間修改列表,並獲取列表中迭代器的當前位置 ListIterator中的常用方法 E next():返回迭代中的下一個元素 boolean hasNext():如果迭代具有更多元素,則返回 true E previous():返回列表中的上一個元素 boolean hasPrevious():如果此列表迭代器在相反方向遍歷列表時具有更多元素,則返回 true void add(E e):將指定的元素插入列表 */ public class ListIteratorDemo { public static void main(String[] args) { //建立集合物件 List<String> list = new ArrayList<String>(); //新增元素 list.add("hello"); list.add("world"); list.add("java"); //通過List集合的listIterator()方法得到 // ListIterator<String> lit = list.listIterator(); // while (lit.hasNext()) { // String s = lit.next(); // System.out.println(s); // } // System.out.println("--------"); // // while (lit.hasPrevious()) { // String s = lit.previous(); // System.out.println(s); // } //獲取列表迭代器 ListIterator<String> lit = list.listIterator(); while (lit.hasNext()) { String s = lit.next(); if(s.equals("world")) { lit.add("javaee"); } } System.out.println(list); } }
2.6、增強for迴圈
定義格式
示例程式碼
package com.itheima_05; import java.util.ArrayList; import java.util.List; /* 增強for:簡化陣列和Collection集合的遍歷 實現Iterable介面的類允許其物件成為增強型 for語句的目標 它是JDK5之後出現的,其內部原理是一個Iterator迭代器 格式: for(元素資料型別 變數名 : 陣列或者Collection集合) { //在此處使用變數即可,該變數就是元素 } */ public class ForDemo { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; for(int i : arr) { System.out.println(i); } System.out.println("--------"); String[] strArray = {"hello","world","java"}; for(String s : strArray) { System.out.println(s); } System.out.println("--------"); List<String> list = new ArrayList<String>(); list.add("hello"); list.add("world"); list.add("java"); for(String s : list) { System.out.println(s); } System.out.println("--------"); //內部原理是一個Iterator迭代器 /* for(String s : list) { if(s.equals("world")) { list.add("javaee"); //ConcurrentModificationException } } */ } }
2.7、集合的案例-List集合儲存學生物件三種方式遍歷
案例需求
建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合
程式碼實現
/* 學生類 */ package com.itheima_06; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // --------------------------------------------------------------------- package com.itheima_06; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* 需求: 建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合 思路: 1:定義學生類 2:建立List集合物件 3:建立學生物件 4:把學生新增到集合 5:遍歷集合 迭代器:集合特有的遍歷方式 普通for:帶有索引的遍歷方式 增強for:最方便的遍歷方式 */ public class ListDemo { public static void main(String[] args) { //建立List集合物件 List<Student> list = new ArrayList<Student>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); //把學生新增到集合 list.add(s1); list.add(s2); list.add(s3); //迭代器:集合特有的遍歷方式 Iterator<Student> it = list.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName()+","+s.getAge()); }
System.out.println("--------"); //普通for:帶有索引的遍歷方式 for(int i=0; i<list.size(); i++) { Student s = list.get(i); System.out.println(s.getName()+","+s.getAge()); } System.out.println("--------"); //增強for:最方便的遍歷方式 for(Student s : list) { System.out.println(s.getName()+","+s.getAge()); } } }
3、資料結構
資料結構是計算機儲存、組織資料的方式。是指互相之間存在一種或多種特定關係的資料元素的集合通常情況下,
精心選擇的資料結構可以帶來更高的執行或者儲存效率
3.1、資料結構之棧和佇列
棧結構 先進後出
佇列結構 先進先出
3.2、資料結構之陣列和連結串列
陣列結構 查詢快、增刪慢
佇列結構 查詢慢、增刪快
4、List集合的實現類
4.1、List集合子類的特點
ArrayList集合
底層是陣列結構實現,查詢快、增刪慢
LinkedList集合
底層是連結串列結構實現,查詢慢、增刪快
package com.itheima_07; import java.util.ArrayList; import java.util.LinkedList; /* List集合常用子類:ArrayList,LinkedList ArrayList:底層資料結構是陣列,查詢快,增刪慢 LinkedList:底層資料結構是連結串列,查詢慢,增刪快 練習: 分別使用ArrayList和LinkedList完成儲存字串並遍歷 */ public class ListDemo { public static void main(String[] args) { //建立集合物件 ArrayList<String> array = new ArrayList<String>(); array.add("hello"); array.add("world"); array.add("java"); //遍歷 for (String s : array) { System.out.println(s); } //剩下兩種遍歷方式大家補齊 System.out.println("------------------------------"); Iterator<String> list = array.iterator(); while (list.hasNext()){ String s = list.next(); System.out.println(s); } System.out.println("------------------------------"); for(int i = 0;i<array.size();i++){ String s = array.get(i); System.out.println(s); } System.out.println("--------"); LinkedList<String> linkedList = new LinkedList<String>(); linkedList.add("hello"); linkedList.add("world"); linkedList.add("java"); for(String s : linkedList) { System.out.println(s); } //剩下兩種遍歷方式大家補齊 Iterator<String> list = linkedList.iterator(); while (list.hasNext()){ String s = list.next(); System.out.println(s); } System.out.println("------------------------------"); for(int i = 0;i<list.size();i++){ String s = list.get(i); System.out.println(s); } } }
4.2、集合的案例-ArrayList集合儲存學生物件三種方式遍歷
案例需求
建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合
程式碼實現
/* 學生類 */ package com.itheima_08; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // ------------------------------------------------------------------------------- package com.itheima_08; import java.util.ArrayList; import java.util.Iterator; /* 需求: 建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合 思路: 1:定義學生類 2:建立ArrayList集合物件 3:建立學生物件 4:把學生新增到集合 5:遍歷集合 迭代器:集合特有的遍歷方式 普通for:帶有索引的遍歷方式 增強for:最方便的遍歷方式 */ public class ArrayListDemo { public static void main(String[] args) { //建立ArrayList集合物件 ArrayList<Student> array = new ArrayList<Student>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); //把學生新增到集合 array.add(s1); array.add(s2); array.add(s3); //迭代器:集合特有的遍歷方式 Iterator<Student> it = array.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + "," + s.getAge()); } System.out.println("--------"); //普通for:帶有索引的遍歷方式 for(int i=0; i<array.size(); i++) { Student s = array.get(i); System.out.println(s.getName() + "," + s.getAge()); } System.out.println("--------"); //增強for:最方便的遍歷方式 for(Student s : array) { System.out.println(s.getName() + "," + s.getAge()); } } }
4.3、LinkedList集合的特有功能
特有方法
程式碼例項
package com.itheima_09; import java.util.LinkedList; /* LinkedList集合的特有功能: public void addFirst(E e):在該列表開頭插入指定的元素 public void addLast(E e):將指定的元素追加到此列表的末尾 public E getFirst():返回此列表中的第一個元素 public E getLast():返回此列表中的最後一個元素 public E removeFirst():從此列表中刪除並返回第一個元素 public E removeLast():從此列表中刪除並返回最後一個元素 */ public class LinkedListDemo { public static void main(String[] args) { //建立集合物件 LinkedList<String> linkedList = new LinkedList<String>(); linkedList.add("hello"); linkedList.add("world"); linkedList.add("java"); // public void addFirst(E e):在該列表開頭插入指定的元素 // public void addLast(E e):將指定的元素追加到此列表的末尾 // linkedList.addFirst("javase"); // linkedList.addLast("javaee"); // public E getFirst():返回此列表中的第一個元素 // public E getLast():返回此列表中的最後一個元素 // System.out.println(linkedList.getFirst()); // System.out.println(linkedList.getLast()); // public E removeFirst():從此列表中刪除並返回第一個元素 // public E removeLast():從此列表中刪除並返回最後一個元素 // System.out.println(linkedList.removeFirst()); // System.out.println(linkedList.removeLast()); System.out.println(linkedList); } }