Java基礎(02)-15總結物件陣列,集合Collection,集合List
(1)List是Collection的子介面
特點:有序(儲存順序和取出順序一致),可重複。
package cn.itcast_01; import java.util.Iterator; import java.util.List; import java.util.ArrayList; /* * 需求:List集合儲存字串並遍歷。 */ public class ListDemo { public static void main(String[] args) { // 建立集合物件 List list = new ArrayList(); // 建立字串並新增字串 list.add("hello"); list.add("world"); list.add("java"); // 遍歷集合 Iterator it = list.iterator(); while (it.hasNext()) { // 向下轉型 String s = (String) it.next(); System.out.println(s); } } } package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* * List集合的特點: * 有序(儲存和取出的元素一致),可重複的。 */ public class ListDemo2 { public static void main(String[] args) { // 建立集合物件 List list = new ArrayList(); // 儲存元素 list.add("hello"); list.add("world"); list.add("java"); list.add("javaee"); list.add("android"); list.add("javaee"); list.add("android"); // 遍歷集合 Iterator it = list.iterator(); while (it.hasNext()) { String s = (String) it.next(); System.out.println(s); } } } 學生類遍歷: package cn.itcast_02; public class Student { // 成員變數 private String name; private int age; // 構造方法 public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } // 成員方法 // getXxx()/setXxx() 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 cn.itcast_02; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* * 儲存自定義物件並遍歷 */ public class ListDemo { public static void main(String[] args) { // 建立集合物件 List list = new ArrayList(); // 建立學生物件 Student s1 = new Student("白骨精", 30); Student s2 = new Student("蜘蛛精", 40); Student s3 = new Student("觀音姐姐", 22); // 把學生物件新增到集合物件中 list.add(s1); list.add(s2); list.add(s3); // 遍歷 Iterator it = list.iterator(); while (it.hasNext()) { Student s = (Student) it.next(); System.out.println(s.getName() + "---" + s.getAge()); } } }
(2)List的特有功能:(自己補齊)
A:新增功能
B:刪除功能
C:獲取功能
D:迭代器功能
E:修改功能
package cn.itcast_03; import java.util.ArrayList; import java.util.List; /* * List集合的特有功能: * A:新增功能 * void add(int index,Object element):在指定位置新增元素 * B:獲取功能 * Object get(int index):獲取指定位置的元素 * C:列表迭代器 * ListIterator listIterator():List集合特有的迭代器 * D:刪除功能 * Object remove(int index):根據索引刪除元素,返回被刪除的元素 * E:修改功能 * Object set(int index,Object element):根據索引修改元素,返回被修飾的元素 */ public class ListDemo { public static void main(String[] args) { // 建立集合物件 List list = new ArrayList(); // 新增元素 list.add("hello"); list.add("world"); list.add("java"); // void add(int index,Object element):在指定位置新增元素 // list.add(1, "android");//沒有問題 // IndexOutOfBoundsException // list.add(11, "javaee");//有問題 // list.add(3, "javaee"); //沒有問題 // list.add(4, "javaee"); //有問題 // Object get(int index):獲取指定位置的元素 // System.out.println("get:" + list.get(1)); // IndexOutOfBoundsException // System.out.println("get:" + list.get(11)); // Object remove(int index):根據索引刪除元素,返回被刪除的元素 // System.out.println("remove:" + list.remove(1)); // IndexOutOfBoundsException // System.out.println("remove:" + list.remove(11)); // Object set(int index,Object element):根據索引修改元素,返回被修飾的元素 System.out.println("set:" + list.set(1, "javaee")); System.out.println("list:" + list); } }
(3)List集合的特有遍歷功能
A:由size()和get()結合。
B:程式碼演示
//建立集合物件 List list = new ArrayList(); //建立並新增元素 list.add("hello"); list.add("world"); list.add("java"); //遍歷集合 Iterator it = list.iterator(); while(it.hasNext()) { String s =(String) it.next(); System.out.println(s); } System.out.println("----------"); for(int x=0; x<list.size(); x++) { String s =(String) list.get(x); System.out.println(s); } package cn.itcast_03; import java.util.ArrayList; import java.util.List; /* * List集合的特有遍歷功能: * size()和get()方法結合使用 */ public class ListDemo2 { public static void main(String[] args) { // 建立集合物件 List list = new ArrayList(); // 新增元素 list.add("hello"); list.add("world"); list.add("java"); // Object get(int index):獲取指定位置的元素 // System.out.println(list.get(0)); // System.out.println(list.get(1)); // System.out.println(list.get(2)); // IndexOutOfBoundsException // System.out.println(list.get(3)); // 用迴圈改進 // for (int x = 0; x < 3; x++) { // System.out.println(list.get(x)); // } // 如果元素過多,數起來就比較麻煩,所以我們使用集合的一個長度功能:size() // 最終的遍歷方式就是:size()和get() for (int x = 0; x < list.size(); x++) { // System.out.println(list.get(x)); String s = (String) list.get(x); System.out.println(s); } } }
C:普通for迴圈
package cn.itcast_03;
public class Student {
// 成員變數
private String name;
private int age;
// 構造方法
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
// 成員方法
// getXxx()/setXxx()
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 cn.itcast_03;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* 儲存自定義物件並遍歷,用普通for迴圈。(size()和get()結合)
*/
public class ListDemo3 {
public static void main(String[] args) {
// 建立集合物件
List list = new ArrayList();
// 建立學生物件
Student s1 = new Student("林黛玉", 18);
Student s2 = new Student("劉姥姥", 88);
Student s3 = new Student("王熙鳳", 38);
// 把學生新增到集合中
list.add(s1);
list.add(s2);
list.add(s3);
// 遍歷
// 迭代器遍歷
Iterator it = list.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
System.out.println("--------");
// 普通for迴圈
for (int x = 0; x < list.size(); x++) {
Student s = (Student) list.get(x);
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
(4)列表迭代器的特有功能;(瞭解)
可以逆向遍歷,但是要先正向遍歷,所以無意義,基本不使用。
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
* 列表迭代器:
* ListIterator listIterator():List集合特有的迭代器
* 該迭代器繼承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
*
* 特有功能:
* Object previous():獲取上一個元素
* boolean hasPrevious():判斷是否有元素
*
* 注意:ListIterator可以實現逆向遍歷,但是必須先正向遍歷,才能逆向遍歷,所以一般無意義,不使用。
*/
public class ListIteratorDemo {
public static void main(String[] args) {
// 建立List集合物件
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
// ListIterator listIterator()
ListIterator lit = list.listIterator(); // 子類物件
// while (lit.hasNext()) {
// String s = (String) lit.next();
// System.out.println(s);
// }
// System.out.println("-----------------");
// System.out.println(lit.previous());
// System.out.println(lit.previous());
// System.out.println(lit.previous());
// NoSuchElementException
// System.out.println(lit.previous());
while (lit.hasPrevious()) {
String s = (String) lit.previous();
System.out.println(s);
}
System.out.println("-----------------");
// 迭代器
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
System.out.println("-----------------");
}
}
(5)併發修改異常
A:出現的現象
迭代器遍歷集合,集合修改集合元素
B:原因
迭代器是依賴於集合的,而集合的改變迭代器並不知道。
C:解決方案
a:迭代器遍歷,迭代器修改(ListIterator)
元素新增在剛才迭代的位置
b:集合遍歷,集合修改(size()和get()) (普通for迴圈遍歷)
元素新增在集合的末尾
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
* 問題?
* 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。
*
* ConcurrentModificationException:當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。
* 產生的原因:
* 迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。
* 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
* 如何解決呢?
* A:迭代器迭代元素,迭代器修改元素
* 元素是跟在剛才迭代的元素後面的。
* B:集合遍歷元素,集合修改元素(普通for)
* 元素在最後新增的。
*/
public class ListIteratorDemo2 {
public static void main(String[] args) {
// 建立List集合物件
List list = new ArrayList();
// 新增元素
list.add("hello");
list.add("world");
list.add("java");
// 迭代器遍歷
// Iterator it = list.iterator();
// while (it.hasNext()) {
// String s = (String) it.next();
// if ("world".equals(s)) {
// list.add("javaee");
// }
// }
// 方式1:迭代器迭代元素,迭代器修改元素
// 而Iterator迭代器卻沒有新增功能,所以我們使用其子介面ListIterator
// ListIterator lit = list.listIterator();
// while (lit.hasNext()) {
// String s = (String) lit.next();
// if ("world".equals(s)) {
// lit.add("javaee");
// }
// }
// 方式2:集合遍歷元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}
System.out.println("list:" + list);
}
}
(6)常見資料結構
A:棧 第一個進入最後一個出來 先進後出
B:佇列 第一個進入第一個出來 先進先出
C:陣列 用來儲存同一種資料型別的元素的一個集合 查詢快,增刪慢
D:連結串列 把多個節點連結起來的一串資料 查詢慢,增刪快 (單向連結串列,單向迴圈連結串列,雙向連結串列,雙向迴圈連結串列)
(7)List的子類特點(面試題)
ArrayList
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
LinkedList
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
到底使用誰呢?看需求?
分析:
要安全嗎?
要:Vector(即使要,也不使用這個,後面再說)
不要:ArrayList或者LinkedList
查詢多;ArrayList
增刪多:LinkedList
什麼都不知道,就用ArrayList。
(8)List集合的案例(遍歷方式 迭代器和普通for)
A:儲存字串並遍歷
B:儲存自定義物件並遍歷