1. 程式人生 > 其它 >Java基礎(02)-15總結物件陣列,集合Collection,集合List

Java基礎(02)-15總結物件陣列,集合Collection,集合List

3:集合(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:儲存自定義物件並遍歷