Java 基礎(chǔ) 34 List集合

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ì)象修改集合中的元素
      • 元素是在最后添加的

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());
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干像,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驰弄,更是在濱河造成了極大的恐慌麻汰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚篙,死亡現(xiàn)場(chǎng)離奇詭異五鲫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)岔擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門位喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪耘,“玉大人,你說我怎么就攤上這事塑崖∑叱澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵规婆,是天一觀的道長(zhǎng)澜躺。 經(jīng)常有香客問我,道長(zhǎng)聋呢,這世上最難降的妖魔是什么苗踪? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮削锰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毕莱。我一直安慰自己器贩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布朋截。 她就那樣靜靜地躺著蛹稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪部服。 梳的紋絲不亂的頭發(fā)上唆姐,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音廓八,去河邊找鬼奉芦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剧蹂,可吹牛的內(nèi)容都是我干的声功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宠叼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼先巴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冒冬,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤伸蚯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后简烤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剂邮,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年乐埠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抗斤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚企。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑞眼,靈堂內(nèi)的尸體忽然破棺而出龙宏,到底是詐尸還是另有隱情,我是刑警寧澤伤疙,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布银酗,位于F島的核電站,受9級(jí)特大地震影響徒像,放射性物質(zhì)發(fā)生泄漏黍特。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一锯蛀、第九天 我趴在偏房一處隱蔽的房頂上張望灭衷。 院中可真熱鬧,春花似錦旁涤、人聲如沸翔曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞳遍。三九已至,卻和暖如春菌羽,著一層夾襖步出監(jiān)牢的瞬間掠械,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工注祖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猾蒂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓氓轰,卻偏偏與公主長(zhǎng)得像婚夫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子署鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評(píng)論 0 1
  • 第一篇文章中介紹了List集合的一些通用知識(shí)案糙。本篇文章將集中介紹了List集合相比Collection接口增加的一...
    Ruheng閱讀 9,298評(píng)論 0 28
  • Java源碼研究之容器(1) 如何看源碼 很多時(shí)候我們看源碼, 看完了以后經(jīng)常也沒啥收獲, 有些地方看得懂, 有些...
    駱駝騎士閱讀 994評(píng)論 0 22
  • 姓名:刁偉聰 公司:寧波貞觀電器有限公司 寧和塾《六項(xiàng)精進(jìn)》235期謙虛二組學(xué)員 【行~踐行】 1.同銷售部部分人...
    真誠(chéng)無敵閱讀 127評(píng)論 0 0
  • 話說在中國(guó)北邊有個(gè)名不經(jīng)傳的雪中村落时捌,出了位一桿標(biāo)槍便能刺死一頭黑瞎子的好手。即使獵術(shù)再出眾炉抒,亦無法改變他是村中獨(dú)...
    諸佛神像閱讀 335評(píng)論 1 2