1.1 List集合的特點(diǎn)
-
List:有序的 collection(也稱為序列)藐唠。
- 此接口的用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制。
- 用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素泥栖,并搜索列表中的元素。
- 與 set 不同荡含,列表通常允許重復(fù)的元素零酪。
-
List集合的特點(diǎn):
- 有序(存儲(chǔ)和取出元素的順序一致)
- 存儲(chǔ)的元素可以重復(fù)
1.1.1 案例代碼
package com.itheima_01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* List:有序的 collection(也稱為序列)。
* 此接口的用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制驮肉。
* 用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素已骇。
* 與 set 不同离钝,列表通常允許重復(fù)的元素。
*
* List集合的特點(diǎn):
* A:有序(存儲(chǔ)和取出元素的順序一致)
* B:存儲(chǔ)的元素可以重復(fù)
*/
public class ListDemo {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
//存儲(chǔ)元素
list.add("hello");
list.add("world");
list.add("java");
list.add("world");
//遍歷集合
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
1.2 List集合的特有成員方法
- void add(int index,E element):在指定位置添加元素
- E remove(int index):刪除指定位置的元素
- E get(int index):獲取指定位置的元素
- E set(int index,E element):修改指定位置的元素
1.2.1案例代碼
package com.itheima_01;
import java.util.ArrayList;
import java.util.List;
/*
* void add(int index,E element):在指定位置添加元素
* E remove(int index):刪除指定位置的元素
* E get(int index):獲取指定位置的元素
* E set(int index,E element):修改指定位置的元素
*/
public class ListDemo2 {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
//使用繼承Collection的添加功能
list.add("hello");
list.add("world");
list.add("java");
//void add(int index,E element):在指定位置添加元素
//list.add(1, "javaee");
//IndexOutOfBoundsException
//list.add(11,"javase");
//E remove(int index):刪除指定位置的元素,返回被刪除的元素
//System.out.println("remove:"+list.remove(1));
//System.out.println("remove:"+list.remove(11));
//E get(int index):獲取指定位置的元素
//System.out.println("get:"+list.get(1));
//System.out.println("get:"+list.get(11));
//E set(int index,E element):修改指定位置的元素,返回被修改的元素
//System.out.println("set:"+list.set(1, "javaee"));
//輸出集合對(duì)象
System.out.println(list);
}
}
1.3 List集合的普通for循環(huán)遍歷
- List集合的遍歷:
- 迭代器
- 普通for循環(huán)
1.3.1 案例代碼
package com.itheima_01;
import java.util.ArrayList;
import java.util.List;
/*
* List集合的遍歷:
* A:迭代器
* B:普通for循環(huán)
*/
public class ListDemo3 {
public static void main(String[] args) {
// 創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// E 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));
// System.out.println("-----------");
// ctrl+/ 可以對(duì)選中的代碼進(jìn)行單行注釋褪储,再來一次就是取消單行注釋
// 循環(huán)改進(jìn)
// for (int x = 0; x < 3; x++) {
// System.out.println(list.get(x));
// }
//int size():集合的長(zhǎng)度卵渴,也就是集合中元素的個(gè)數(shù)
for(int x=0; x<list.size(); x++) {
//System.out.println(list.get(x));
String s = list.get(x);
System.out.println(s);
}
}
}
1.4 List集合的練習(xí)存儲(chǔ)自定義對(duì)象并遍歷
- List集合存儲(chǔ)自定義對(duì)象并遍歷
- 提示:自定義一個(gè)學(xué)生類,給出成員變量name和age鲤竹。
- 遍歷集合的時(shí)候浪读,在控制臺(tái)輸出學(xué)生對(duì)象的成員變量值。
- 兩種方式遍歷
- 迭代器
- 普通for
1.4.1 案例代碼
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;
/*
* List集合存儲(chǔ)自定義對(duì)象并遍歷
* 提示:自定義一個(gè)學(xué)生類辛藻,給出成員變量name和age碘橘。
* 遍歷集合的時(shí)候,在控制臺(tái)輸出學(xué)生對(duì)象的成員變量值吱肌。
* 兩種方式遍歷
* 迭代器
* 普通for
*/
public class ListTest {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
List<Student> list = new ArrayList<Student>();
//創(chuàng)建元素對(duì)象
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 x=0; x<list.size(); x++) {
Student s = list.get(x);
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
1.5 列表迭代器的特有功能
- ListIterator:
- ListIterator<E> listIterator():返回此列表元素的列表迭代器
- public interface ListIterator<E>extends Iterator<E>
- 特有功能:
- E previous():返回列表中的前一個(gè)元素痘拆。
- boolean hasPrevious():如果以逆向遍歷列表,列表迭代器有多個(gè)元素氮墨,則返回 true纺蛆。
注意:
??ListIterator可以實(shí)現(xiàn)逆向遍歷,但是要求先正向遍歷规揪,才能逆向遍歷桥氏。
1.5.1案例代碼
package com.itheima_01;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
* ListIterator:
* ListIterator<E> listIterator():返回此列表元素的列表迭代器
* public interface ListIterator<E>extends Iterator<E>
*
* 特有功能:
* E previous():返回列表中的前一個(gè)元素。
* boolean hasPrevious():如果以逆向遍歷列表猛铅,列表迭代器有多個(gè)元素字支,則返回 true。(
* 注意:ListIterator可以實(shí)現(xiàn)逆向遍歷奕坟,但是要求先正向遍歷祥款,才能逆向遍歷。
*/
public class ListIteratorDemo {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
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);
}
}
}
1.6 并發(fā)修改異常產(chǎn)生的原因及解決方案
??我有一個(gè)集合:List<String> list = new ArrayList<String>();
??里面有三個(gè)元素list.add("hello");list.add("world");list.add("java");
??我想判斷里面有沒有"world"這個(gè)元素月杉,如果有刃跛,我就添加一個(gè)"javaee"元素,請(qǐng)寫代碼實(shí)現(xiàn)苛萎。
??書寫完代碼桨昙,應(yīng)該會(huì)提示異常 ConcurrentModificationException:
??ConcurrentModificationException:當(dāng)方法檢測(cè)到對(duì)象的并發(fā)修改检号,但不允許這種修改時(shí),拋出此異常蛙酪。
- 產(chǎn)生的原因:
- 迭代器依賴于集合而存在齐苛,在判斷成功后,集合中添加了新的元素桂塞,而迭代器并不知道凹蜂,所有就報(bào)錯(cuò)了。
- 其實(shí)這個(gè)問題說的是:迭代器遍歷集合中的元素的時(shí)候阁危,不要使用集合對(duì)象去修改集合中的元素玛痊。
- 如何解決呢?
- 迭代器遍歷的時(shí)候,我可以通過迭代器修改集合中的元素
- 元素是跟在剛才迭代的元素后面的
- 集合遍歷的時(shí)候狂打,我可以通過集合對(duì)象修改集合中的元素
- 元素是在最后添加的
- 迭代器遍歷的時(shí)候,我可以通過迭代器修改集合中的元素
1.6.1 案例代碼
package com.itheima_02;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
// 創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
//我想判斷里面有沒有"world"這個(gè)元素擂煞,如果有,我就添加一個(gè)"javaee"元素
// Iterator<String> it = list.iterator();
// while(it.hasNext()){
// String s = it.next();
// if(s.equals("world")) {
// list.add("javaee");
// }
// }
//迭代器遍歷的時(shí)候趴乡,我可以通過迭代器修改集合中的元素
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()) {
String s = lit.next();
if(s.equals("world")) {
lit.add("javaee");
}
}
//集合遍歷的時(shí)候对省,我可以通過集合對(duì)象修改集合中的元素
// for(int x=0; x<list.size(); x++) {
// String s = list.get(x);
// if(s.equals("world")) {
// list.add("javaee");
// }
// }
System.out.println(list);
1.7 增強(qiáng)for的概述和使用
增強(qiáng)for:是for循環(huán)的一種
格式:
for(元素的數(shù)據(jù)類型 變量名 : 數(shù)組名或者Collection集合對(duì)象名) {
使用變量名即可,
這個(gè)變量名代表的其實(shí)就是
數(shù)組或者Collection集合中的元素
}
- 好處:簡(jiǎn)化了數(shù)組和Collection集合的遍歷
- 弊端:目標(biāo)不能為null晾捏。如何保證呢?在遍歷前先對(duì)目標(biāo)進(jìn)行不為null的判斷蒿涎。
1.7.1 案例代碼
package com.itheima_01;
import java.util.ArrayList;
import java.util.List;
/*
* 增強(qiáng)for:是for循環(huán)的一種
*
* 格式:
* for(元素的數(shù)據(jù)類型 變量名 : 數(shù)組名或者Collection集合對(duì)象名) {
* 使用變量名即可,這個(gè)變量名代表的其實(shí)就是數(shù)組或者Collection集合中的元素
* }
*
* 好處:簡(jiǎn)化了數(shù)組和Collection集合的遍歷
* 弊端:目標(biāo)不能為null粟瞬。如何保證呢?在遍歷前先對(duì)目標(biāo)進(jìn)行不為null的判斷同仆。
*/
public class ForDemo {
public static void main(String[] args) {
//定義一個(gè)int類型的數(shù)組
int[] arr = {1,2,3,4,5};
//普通for
for(int x=0; x<arr.length; x++) {
System.out.println(arr[x]);
}
System.out.println("---------");
//增強(qiáng)for
for(int x : arr) {
System.out.println(x);
}
System.out.println("---------");
//定義一個(gè)String類型的數(shù)組
String[] strArray = {"hello","world","java"};
//增強(qiáng)for
for(String s : strArray) {
System.out.println(s);
}
System.out.println("---------");
//創(chuàng)建集合對(duì)象
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
//增強(qiáng)for
for(String s :list) {
System.out.println(s);
}
// list = null;
// //NullPointerException
// if(list != null) {
// for(String s :list) {
// System.out.println(s);
// }
// }
//增強(qiáng)for其實(shí)就是用來替代迭代器的
// for(String s :list) {
// if(s.equals("world")) {
// list.add("javaee");
// }
// }
}
}
1.8 增強(qiáng)for的練習(xí)List集合存儲(chǔ)自定義對(duì)象并遍歷
- List集合存儲(chǔ)自定義對(duì)象并遍歷
??提示:自定義一個(gè)學(xué)生類,給出成員變量name和age裙品。遍歷集合的時(shí)候俗批,在控制臺(tái)輸出學(xué)生對(duì)象的成員變量值。
- 遍歷方式
- 增強(qiáng)for
- 快捷鍵 for alt + / 選擇foreach
1.8.1案例代碼:
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.List;
/*
* List集合存儲(chǔ)自定義對(duì)象并遍歷
* 提示:自定義一個(gè)學(xué)生類市怎,給出成員變量name和age岁忘。遍歷集合的時(shí)候,在控制臺(tái)輸出學(xué)生對(duì)象的成員變量值区匠。
* 遍歷方式
* 增強(qiáng)for
*/
public class ForTest {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
List<Student> list = new ArrayList<Student>();
//創(chuàng)建元素對(duì)象
Student s1 = new Student("林青霞",30);
Student s2 = new Student("張曼玉",35);
Student s3 = new Student("王祖賢",33);
//把元素添加到集合
list.add(s1);
list.add(s2);
list.add(s3);
//遍歷集合
//增強(qiáng)for
for(Student s : list) {
System.out.println(s.getName()+"---"+s.getAge());
}
}
}