异常&(List)集合

1. Exception异常(理解)

  1. 什么是异常?

  2. 异常有哪些分类?

1.0 感受异常

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 感受异常</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo01</span> {
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
​
        <span style="color:#008855">String</span> <span style="color:#000000">str</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
​
        <span style="color:#aa5500">// NullPointerException 谁点谁就空  str空</span>
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"str.length() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">str</span>.<span style="color:#000000">length</span>());
​
    }
}</span></span>

1.1 异常(记忆)

  • 异常的概述

    异常就是程序在编译或者运行出现了不正常的情况

    注意:

    1. 异常会导致程序结束、甚至JVM退出

    2. 语法错误是编码错误,不归属异常体系。

  • 异常的体系结构

1.2 编译时异常和运行时异常的区别(记忆)

  • 编译时异常

    • 都是Exception类及其子类,不是RuntimeException及其子类

    • 编译时就已经出现的异常;必须显式的处理,否则无法通过编译,程序自然不能执行

  • 运行时异常

    • 都是RuntimeException类及其子类

    • 运行时才可能出现的异常;无需显式的处理就可以编译通过(也可以和编译时异常一样处理)

  • 图示

  • 演示代码:

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">SimpleDateFormat</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Date</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 感受异常</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo01</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#aa5500">// 运行时异常</span>
            <span style="color:#aa5500">// runtimeException();</span>
    ​
            <span style="color:#aa5500">// 编译时异常</span>
            <span style="color:#000000">SimpleDateFormat</span> <span style="color:#000000">sdf</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SimpleDateFormat</span>(<span style="color:#aa1111">"yyyy-MM-dd"</span>);
            <span style="color:#aa5500">// ParseException 解析异常,是一个编译时异常,如果不处理就编译不通过,程序自然无法继续执行</span>
            <span style="color:#000000">Date</span> <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sdf</span>.<span style="color:#000000">parse</span>(<span style="color:#aa1111">"2023-12-12"</span>);
    ​
        }
    ​
        <span style="color:#aa5500">// 运行时异常</span>
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">runtimeException</span>() {
            <span style="color:#008855">String</span> <span style="color:#000000">str</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
    ​
            <span style="color:#aa5500">// NullPointerException 谁点谁就空  str空</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"str.length() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">str</span>.<span style="color:#000000">length</span>());
    ​
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"看看我这句话能执行到吗?"</span>);
        }
    }</span>

1.3 JVM默认处理异常的方式(理解)

  • 如果程序出现了异常,在我们没有做任何处理时,最终JVM 会做默认的处理,处理方式有如下两个步骤:

    • (对我们透明不可见)将异常相关信息封装到一个对应类型的异常对象中

    • 把异常的名称、错误原因及异常出现的位置等信息输出在控制台

    • 程序停止执行,出现异常之后的所有代码将不会执行

==1.4 出现异常时排错(掌握)==

1.4.1 查看异常信息

控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置

我们调bug时,可以根据提示,找到异常出现的位置,分析原因,修改异常代码

1.4.2 定义异常原因

  1. 在代码/错误比较简单的时候,可以从上往下查找异常信息中第一个可以点击的超链接(需要是自己写的类),就能快速定位到出问题的代码。

  2. 在代码/错误比较复杂的时候,找到最下面第一个可以看懂的Caused by,在该Caused by下面,从上往下找到第一个可以点击的超链接(需要是自己写的类),能快速定位到出问题的代码。

结合异常提示、程序中的数据,就可以快速排错。

1.4.3 排错工具

  • 非常简单的代码:手撕代码

  • 复杂代码:Debug(极力推荐的工具)

1.5 异常的处理方式

处理方式整体分为三种

  1. 不管不问:JVM默认的处理方式(仅对限运行时异常有效,不推荐)

  2. 抛出异常:throws

  3. 解决异常:try…catch

选那个

  • 学习中:throws,写着简单

  • 生产环境中:try…catch或者throw+异常处理框架

1.7 异常处理方式1:throws

1.7.1 概述

当方法中出现异常时,可以在当前方法签名上通过throws把出现的异常直接抛给调用者,自己并没有处理。

  • 因为自己没处理,所以当前方法中出现异常之后的代码不会执行;

  • 同时调用者需要处理该异常……

1.7.2 定义格式

  • 格式

    <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#000000">返回值类型</span> <span style="color:#0000ff">方法名</span>() <span style="color:#770088">throws</span> <span style="color:#000000">异常类名1</span>, <span style="color:#000000">异常类名2</span> { 
        
    }</span>
  • 示例代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileInputStream</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileNotFoundException</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">ParseException</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">SimpleDateFormat</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Date</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 异常处理方式2:throws</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo02</span> {
        <span style="color:#aa5500">// main方法调用了showParseException,后者抛出了异常(甩锅);</span>
        <span style="color:#aa5500">// main方法就要处理,处理方式1就是接着抛(接着甩锅)</span>
        <span style="color:#aa5500">// JVM调用了main方法,就最终把异常抛给了JVM;当对应的异常产生时,就只能由JVM来处理</span>
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) <span style="color:#770088">throws</span> <span style="color:#000000">ParseException</span>, <span style="color:#000000">FileNotFoundException</span> {
    ​
            <span style="color:#aa5500">// showNullPointerException();</span>
            <span style="color:#000000">showParseException</span>();
        }
    ​
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">*</span>
         <span style="color:#aa5500">* @throws NullPointerException 抛出一个异常(甩锅)</span>
         <span style="color:#aa5500">*    就表示告诉调用者该方法在编译或者运行时可能会出现指定类型的异常</span>
         <span style="color:#aa5500">*    分两种情况:</span>
         <span style="color:#aa5500">*      1. 如果是一个运行时异常,可以不用抛出;就算本方法抛出后,调用者也可以不用显示的处理</span>
         <span style="color:#aa5500">*      2. 如果是一个编译时异常,则必须处理,可以选用抛出处理;当前方法抛出后,调用者要么处理掉,要么也接着往上抛</span>
         <span style="color:#aa5500">*    但是只要没有对异常做处理(真的什么都不做,或者throws),程序停止且异常之后的代码将不会执行</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">showNullPointerException</span>() <span style="color:#770088">throws</span> <span style="color:#000000">NullPointerException</span> {
            <span style="color:#008855">String</span> <span style="color:#000000">str</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"str.length() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">str</span>.<span style="color:#000000">length</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"看看我执行了吗?"</span>);
        }
    ​
        <span style="color:#aa5500">// 2. 如果是一个编译时异常,则必须处理,可以选用抛出处理;当前方法抛出后,调用者要么处理掉,要么也接着往上抛</span>
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">showParseException</span>() <span style="color:#770088">throws</span> <span style="color:#000000">ParseException</span>, <span style="color:#000000">FileNotFoundException</span> {
            <span style="color:#aa5500">// 被解析的字符串可能不符合格式要求,所以抛出了一个解析异常(编译时异常):ParseException</span>
            <span style="color:#000000">Date</span> <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SimpleDateFormat</span>(<span style="color:#aa1111">"date"</span>).<span style="color:#000000">parse</span>(<span style="color:#aa1111">"ssss"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"date = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">date</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"kankan我执行了吗?"</span>);
    ​
            <span style="color:#aa5500">// 文件可能不存在,所以抛出了一编译时异常:FileNotFoundException</span>
            <span style="color:#770088">new</span> <span style="color:#000000">FileInputStream</span>(<span style="color:#aa1111">"d:/meinv.jpg"</span>);
        }
    }</span>

  • 抛出多个异常

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">// 如果当前方法代码中有多个异常需要抛出,throws后面可以跟多个异常类,使用英文逗号分隔</span>
    <span style="color:#770088">public</span> <span style="color:#000000">返回值类型</span> <span style="color:#0000ff">方法名</span>() <span style="color:#770088">throws</span> <span style="color:#000000">异常类名1</span>,<span style="color:#000000">异常类名2</span>,... { 
        
    }</span>

  • 注意事项

    • 运行时异常可以不用throws处理,且可以编译通过;

    • 编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,就要在方法签名上进行显示声明,之后也将由调用者来处理;

    • 如果有多个异常,可以一次性抛出,异常类型之间使用逗号分隔。当然也可以抛出最大的异常类Exception(学习期间可用,生产环境禁用,不要放大异常类型)

      如果通过多个catch语句抛出了多个异常,多个异常之间存在继承关系,建议将父类异常放在后面

1.7.2 throws的意义

把当前代码可能出现的异常抛给调用者。

  • 对于运行时异常没有意义:当程序运行期间,出现运行时异常时,当前代码会停止执行,并自动将异常抛给调用者。此时可以不用手动throws。

  • 对于编译时异常有用且必须写:当程序编写期间,可能出现异常的地方,必须通过throws的方式,将可能发生的异常抛给调用者,否则无法编译通过。

总结:为了编译,而甩锅

==1.8 异常处理方式2==

1.8.1 定义格式及执行流程

  • 格式

    <span style="background-color:#f8f8f8"><span style="color:#770088">try</span> {
        <span style="color:#000000">可能出现异常的代码</span>;
    } <span style="color:#770088">catch</span>(<span style="color:#000000">异常类名</span> <span style="color:#000000">异常对象</span>) {
        <span style="color:#000000">异常的处理代码</span>;
    }<span style="color:#770088">finally</span>{
      <span style="color:#000000">收尾断后工作</span>
    }</span>

  • 执行流程

    • 程序从 try 里面的代码开始执行

    • try中代码出现异常,就会停止执行异常之后try里面的代码,跳转到对应的 catch 里面去执行;

    • 不管是否出现异常,都会执行finally中代码

    • try...catch执行完毕之后,try……catch……finally之后的代码还会继续执行

  • 作用

    • 避免程序出现异常之后就停止

    • 按照自己的逻辑处理,根据相应的异常,给出不同的提示和处理方案。

  • 示例代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileInputStream</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileNotFoundException</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">ParseException</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">SimpleDateFormat</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Date</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 异常处理方式3:try……catch……finally</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo03</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#000000">showParseException</span>();
    ​
        }
    ​
        <span style="color:#aa5500">// 2. 如果是一个编译时异常,则必须处理,可以选用抛出处理2:try catch</span>
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">showParseException</span>() {
            <span style="color:#aa5500">// 被解析的字符串可能不符合格式要求,所以抛出了一个解析异常(编译时异常):ParseException</span>
            <span style="color:#000000">Date</span> <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
            <span style="color:#770088">try</span> {
    ​
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"try中异常前的代码"</span>);
                <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SimpleDateFormat</span>(<span style="color:#aa1111">"yyyy"</span>).<span style="color:#000000">parse</span>(<span style="color:#aa1111">"xxxx"</span>);
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"try中异常后的代码"</span>);
    ​
                <span style="color:#770088">new</span> <span style="color:#000000">FileInputStream</span>(<span style="color:#aa1111">""</span>);
            } <span style="color:#770088">catch</span> (<span style="color:#000000">FileNotFoundException</span> <span style="color:#000000">e</span>) {
                <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
            } <span style="color:#770088">catch</span> (<span style="color:#000000">Exception</span> <span style="color:#000000">e</span>) {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"catch中代码"</span>);
                <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
            } <span style="color:#770088">finally</span> {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"finally中代码"</span>);
            }
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"date = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">date</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"kankan我执行了吗?"</span>);
    ​
        }
    }</span>

1.8.2 注意事项

  • 思考题

    • 如果 try 中遇到了问题,那么 try 中下面的代码还会执行吗?

    • 如果 try 中没有遇到问题,怎么执行?

    • 如果出现的问题没有被捕获,那么程序如何运行?

    • 同时有可能出现多个异常怎么处理?

  • 注意

    • 如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?

      那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了 当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

    • 如果 try 中没有遇到问题,怎么执行?

      会把try中所有的代码全部执行完毕,不会执行catch里面的代码;catch外的代码正常执行

    • 如果出现的问题没有被捕获,那么程序如何运行?

      相当于没有写try...catch,也就是自己没有处理。 交给虚拟机使用默认的处理方式(包括终止程序、打印错误)。

    • 同时有可能出现多个异常怎么处理?

      出现多个异常,那么就写多个catch,或者catch一个父类型; 注意点:如果多个异常之间存在子父类关系,那么父类一定要写在下面。

    • 演示代码

      <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
      ​
      <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileInputStream</span>;
      <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#000000">FileNotFoundException</span>;
      <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">ParseException</span>;
      <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">text</span>.<span style="color:#000000">SimpleDateFormat</span>;
      <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Date</span>;
      ​
      <span style="color:#aa5500">/**</span>
       <span style="color:#aa5500">* 异常处理方式3:try……catch……finally</span>
       <span style="color:#aa5500">*/</span>
      <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo03</span> {
          <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
      ​
              <span style="color:#000000">showParseException</span>();
      ​
          }
      ​
          <span style="color:#aa5500">// 2. 如果是一个编译时异常,则必须处理,可以选用抛出处理2:try catch</span>
          <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">showParseException</span>() {
              <span style="color:#aa5500">// 被解析的字符串可能不符合格式要求,所以抛出了一个解析异常(编译时异常):ParseException</span>
              <span style="color:#000000">Date</span> <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
              <span style="color:#770088">try</span> {
      ​
                  <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"try中异常前的代码"</span>);
                  <span style="color:#000000">date</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SimpleDateFormat</span>(<span style="color:#aa1111">"yyyy"</span>).<span style="color:#000000">parse</span>(<span style="color:#aa1111">"xxxx"</span>);
                  <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"try中异常后的代码"</span>);
      ​
                  <span style="color:#770088">new</span> <span style="color:#000000">FileInputStream</span>(<span style="color:#aa1111">""</span>);
              } <span style="color:#770088">catch</span> (<span style="color:#000000">FileNotFoundException</span> <span style="color:#000000">e</span>) {
                  <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
              } <span style="color:#770088">catch</span> (<span style="color:#000000">Exception</span> <span style="color:#000000">e</span>) {
                  <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"catch中代码"</span>);
                  <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
              } <span style="color:#770088">finally</span> {
                  <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"finally中代码"</span>);
              }
              <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"date = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">date</span>);
              <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"kankan我执行了吗?"</span>);
      ​
          }
      }</span>

1.8.3 快捷键

光标定位行到想要被try...catch包裹,按下 Ctrl + Alt + T,在下拉列表中选中try...catch即可。

1.8.4 完整的try…catch 格式

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">try</span> {
    <span style="color:#000000">可能出现异常的代码</span>;
    <span style="color:#aa5500">// 出现异常之后,try中异常之后的代码不会执行了</span>
} <span style="color:#770088">catch</span>(<span style="color:#000000">异常类名</span> <span style="color:#000000">异常对象</span>) { <span style="color:#aa5500">//catch后面的小括号中规则,与形参相同</span>
    <span style="color:#aa5500">// try中出现了异常之后,就执行这里的代码</span>
    <span style="color:#aa5500">// 异常信息封装在形参位置的异常对象中</span>
    <span style="color:#000000">异常的处理代码</span>;
} <span style="color:#770088">finally</span> {
   <span style="color:#aa5500">// 关闭连接、释放资源等代码</span>
}
<span style="color:#aa5500">// catch外面,之后的代码还会继续执行</span></span></span>

  • 执行流程:

    不管try中代码是否有异常,也无论catch是否成功捕获,都会执行finally中代码。

  • 应用场景

    收尾的代码,一般放在finally中,eg:关闭连接、释放资源(之后的学习中会用到)。

==1.9 自定义异常==

根据业务需要,当程序中有出现一些正常业务流程之外的异常时,可以自定义一个异常类,封装响应的异常信息。

自定义异常一般都是自定义一个运行时异常。

项目前不用,项目及生产环境必用。

  • 步骤

    自定义一个类,继承自RuntimeException

    建议:

    1. 类名以Exception结尾

    2. 编写空参和有参构造,构造中调用父类构造。

    <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">自定义异常类名</span> <span style="color:#770088">extends</span> <span style="color:#000000">RuntimeException</span> {
        <span style="color:#770088">public</span> <span style="color:#000000">自定义异常类名</span>() {
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#000000">自定义异常类名</span>(<span style="color:#008855">String</span> <span style="color:#000000">message</span>) {
            <span style="color:#770088">super</span>(<span style="color:#000000">message</span>);
        }
    }</span>

  • 注意

    自定义异常类可以继承自Exception,也可以继承自RuntimeException;推荐后者;

    自定义异常类一般只编写两个构造(无参、带message的有参);

    继承自RuntimeException的自定义异常和RuntimeException没有什么区别,仅仅是名字不同(贴牌);

    在生产环境中,不同名字的异常往往用在不同的业务场景中。

实例代码:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 自定义异常:年龄超出合理范围异常</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AgeOutofBoundsException</span> <span style="color:#770088">extends</span> <span style="color:#000000">RuntimeException</span> {
​
    <span style="color:#770088">public</span> <span style="color:#000000">AgeOutofBoundsException</span>() {
        <span style="color:#770088">super</span>();
    }
​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 有参构造</span>
     <span style="color:#aa5500">*</span>
     <span style="color:#aa5500">* @param message 异常提示信息</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#000000">AgeOutofBoundsException</span>(<span style="color:#008855">String</span> <span style="color:#000000">message</span>) {
        <span style="color:#770088">super</span>(<span style="color:#000000">message</span>);
    }
}</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 自定义异常使用</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo04</span> {
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
​
        <span style="color:#aa5500">// 自定义异常可以被创建对象,但是如果仅仅是这样做,没有任何意义。</span>
        <span style="color:#aa5500">// 需要配合throw关键字使用</span>
        <span style="color:#770088">new</span> <span style="color:#000000">AgeOutofBoundsException</span>();
​
    }
}</span></span>

==1.10 throw抛出异常对象==

1.10.1 基本使用

  • 格式

    throw 异常对象;

  • 注意

    写在方法内。常用于手动抛出一个自定义异常对象,后面的代码不再执行。

  • 演示代码

    自定义异常类AgeOutofBoundsException

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 自定义异常:年龄超出合理范围异常</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AgeOutofBoundsException</span> <span style="color:#770088">extends</span> <span style="color:#000000">RuntimeException</span> {
    ​
        <span style="color:#770088">public</span> <span style="color:#000000">AgeOutofBoundsException</span>() {
            <span style="color:#770088">super</span>();
        }
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* 有参构造</span>
         <span style="color:#aa5500">*</span>
         <span style="color:#aa5500">* @param message 异常提示信息</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#770088">public</span> <span style="color:#000000">AgeOutofBoundsException</span>(<span style="color:#008855">String</span> <span style="color:#000000">message</span>) {
            <span style="color:#770088">super</span>(<span style="color:#000000">message</span>);
        }
    }
    ​</span>
  • 业务场景中根据业务需要,常见该异常对象,并给出异常提示消息

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 学生实体类</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">Student</span> {
        <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">age</span>;
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">getAge</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">age</span>;
        }
    ​
        <span style="color:#aa5500">// 修改年龄的方法</span>
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">modifyAge</span>(<span style="color:#008855">int</span> <span style="color:#000000">age</span>) {
    ​
            <span style="color:#aa5500">// 假设年龄的有效范围是0~150。</span>
            <span style="color:#aa5500">// 如果设置的年龄超出了这个范围,就是我们业务上异常。</span>
            <span style="color:#aa5500">// 就可以手动创建一个对应的异常对象,并抛出。</span>
            <span style="color:#aa5500">// 异常之后的代码将不会执行</span>
            <span style="color:#770088">if</span> (<span style="color:#000000">age</span> <span style="color:#981a1a"><</span> <span style="color:#116644">0</span> <span style="color:#981a1a">||</span> <span style="color:#000000">age</span> <span style="color:#981a1a">></span> <span style="color:#116644">150</span>) {
                <span style="color:#770088">throw</span> <span style="color:#770088">new</span> <span style="color:#000000">AgeOutofBoundsException</span>(<span style="color:#aa1111">"你什么怪物,怎么活了这个岁数?!"</span>);
                <span style="color:#aa5500">// Unreachable statement 不可及的语句</span>
                <span style="color:#aa5500">// System.out.println("看看我执行了吗?");</span>
            }
            <span style="color:#aa5500">// 如果出现了异常,这里的代码也执行不到</span>
            <span style="color:#770088">this</span>.<span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#000000">age</span>;
        }
    }</span>
  • 测试类代码,场景学生对象,并未年龄赋不合理的值

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 自定义异常使用</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo04</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#aa5500">// 自定义异常可以被创建对象,但是如果仅仅是这样做,没有任何意义。</span>
            <span style="color:#aa5500">// 需要配合throw关键字使用</span>
            <span style="color:#aa5500">// new AgeOutofBoundsException();</span>
    ​
            <span style="color:#000000">Student</span> <span style="color:#000000">stu</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Student</span>();
            <span style="color:#000000">stu</span>.<span style="color:#000000">modifyAge</span>(<span style="color:#116644">20</span>);
    ​
            <span style="color:#000000">stu</span>.<span style="color:#000000">modifyAge</span>(<span style="color:#116644">1000</span>);
        }
    }</span>

1.10.2 throw的应用场景

  1. 程序中某个方法执行出现了问题,需要通知调用者,并终止当前方法的执行。

    生产环境中:我们根据业务需要,自定义一些业务相关的异常类,可以在合适的时机手动创建这些类的对象并抛出。(工作中用法,先了解,项目期间会讲解使用)

1.10.3 throw和throws的区别

throwsthrow
位置写方法签名的最后,后跟的是一个或多个异常类名用在方法体内,后跟一个异常对象
作用喊口号:表示声明异常,调用该方法有可能会出现这样的异常干实事:表示手动抛出一个异常对象,由方法体内的语句抛出;只要该行代码执行,就真的会抛出一个异常。
白话很抽象的,提前告知/声明一下很具体的,真的发生了

  • 异常练习案例优化后代码如下

  • 自定义异常类AgeOutOfBoundsException.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">exce</span>;
    ​
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AgeOutOfBoundsException</span> <span style="color:#770088">extends</span> <span style="color:#000000">RuntimeException</span> {
        <span style="color:#770088">public</span> <span style="color:#000000">AgeOutOfBoundsException</span>() {
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#000000">AgeOutOfBoundsException</span>(<span style="color:#008855">String</span> <span style="color:#000000">message</span>) {
            <span style="color:#770088">super</span>(<span style="color:#000000">message</span>);
        }
    }</span>

  • Student.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">exce</span>;
    ​
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">Student</span> {
        
        <span style="color:#aa5500">// 其他代码不变</span>
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setAge</span>(<span style="color:#008855">int</span> <span style="color:#000000">age</span>) {
            <span style="color:#770088">if</span>(<span style="color:#000000">age</span> <span style="color:#981a1a">>=</span> <span style="color:#116644">18</span> <span style="color:#981a1a">&&</span> <span style="color:#000000">age</span> <span style="color:#981a1a"><=</span> <span style="color:#116644">25</span>){
                <span style="color:#770088">this</span>.<span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#000000">age</span>;
            }<span style="color:#770088">else</span>{
                <span style="color:#aa5500">//自定义异常的目的:为了让异常信息更加的见名知意</span>
                <span style="color:#aa5500">//throw new RuntimeException("年龄超出了范围");</span>
                <span style="color:#770088">throw</span> <span style="color:#770088">new</span> <span style="color:#000000">AgeOutOfBoundsException</span>(<span style="color:#aa1111">"年龄超出了范围"</span>);
            }
        }
    }</span>

  • 测试类ExceptionDemo12.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">exce</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Scanner</span>;
    ​
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo12</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,</span>
            <span style="color:#aa5500">// 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。</span>
    ​
            <span style="color:#000000">Student</span> <span style="color:#000000">s</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Student</span>();
    ​
            <span style="color:#000000">Scanner</span> <span style="color:#000000">sc</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Scanner</span>(<span style="color:#000000">System</span>.<span style="color:#000000">in</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"请输入姓名"</span>);
            <span style="color:#008855">String</span> <span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sc</span>.<span style="color:#000000">nextLine</span>();
            <span style="color:#000000">s</span>.<span style="color:#000000">setName</span>(<span style="color:#000000">name</span>);
           <span style="color:#770088">while</span>(<span style="color:#221199">true</span>){
               <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"请输入年龄"</span>);
               <span style="color:#008855">String</span> <span style="color:#000000">ageStr</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sc</span>.<span style="color:#000000">nextLine</span>();
               <span style="color:#770088">try</span> {
                   <span style="color:#008855">int</span> <span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#008855">Integer</span>.<span style="color:#000000">parseInt</span>(<span style="color:#000000">ageStr</span>);
                   <span style="color:#000000">s</span>.<span style="color:#000000">setAge</span>(<span style="color:#000000">age</span>);
                   <span style="color:#770088">break</span>;
               } <span style="color:#770088">catch</span> (<span style="color:#000000">NumberFormatException</span> <span style="color:#000000">e</span>) {
                   <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"请输入一个整数"</span>);
                   <span style="color:#770088">continue</span>;
               } <span style="color:#770088">catch</span> (<span style="color:#000000">AgeOutOfBoundsException</span> <span style="color:#000000">e</span>) {
                   <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">e</span>.<span style="color:#000000">getMessage</span>());
                   <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"请输入一个符合范围的年龄"</span>);
                   <span style="color:#770088">continue</span>;
               }
               <span style="color:#aa5500">/*if(age >= 18 && age <=25){</span>
                   <span style="color:#aa5500">s.setAge(age);</span>
                   <span style="color:#aa5500">break;</span>
               <span style="color:#aa5500">}else{</span>
                   <span style="color:#aa5500">System.out.println("请输入符合要求的年龄");</span>
                   <span style="color:#aa5500">continue;</span>
               <span style="color:#aa5500">}*/</span>
           }
            <span style="color:#770088">try</span> {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">s</span>);
            } <span style="color:#770088">catch</span> (<span style="color:#000000">Exception</span> <span style="color:#000000">e</span>) {
                <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
            }
        }
    }</span>

1.11 Throwable成员方法(理解)

  • 常用方法

    方法名说明
    public String getMessage()返回此 throwable 的详细消息字符串
    public String toString()返回此可抛出的简短描述
    ==public void printStackTrace()==把异常的堆栈信息输出在控制台
  • 示例代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">excetion</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 自定义异常使用</span>
     <span style="color:#aa5500">*</span>
     <span style="color:#aa5500">* @Author Vsunks.v</span>
     <span style="color:#aa5500">* @Date 2023/2/27 16:33</span>
     <span style="color:#aa5500">* @Blog blog.sunxiaowei.net/996.mba</span>
     <span style="color:#aa5500">* @Description: 自定义异常使用</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionDemo04</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#aa5500">// 自定义异常可以被创建对象,但是如果仅仅是这样做,没有任何意义。</span>
            <span style="color:#aa5500">// 需要配合throw关键字使用</span>
            <span style="color:#aa5500">// new AgeOutofBoundsException();</span>
    ​
            <span style="color:#000000">Student</span> <span style="color:#000000">stu</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Student</span>();
            <span style="color:#000000">stu</span>.<span style="color:#000000">modifyAge</span>(<span style="color:#116644">20</span>);
    ​
            <span style="color:#770088">try</span> {
                <span style="color:#000000">stu</span>.<span style="color:#000000">modifyAge</span>(<span style="color:#116644">1000</span>);
            } <span style="color:#770088">catch</span> (<span style="color:#000000">Exception</span> <span style="color:#000000">e</span>) {
                <span style="color:#aa5500">// public String getMessage()         返回此 throwable 的详细消息字符串</span>
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"e.getMessage() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">e</span>.<span style="color:#000000">getMessage</span>());
                
                <span style="color:#aa5500">// public String toString()           返回此可抛出的简短描述</span>
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"e.toString() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">e</span>.<span style="color:#000000">toString</span>());
                
                <span style="color:#aa5500">// public void printStackTrace()  把异常的堆栈提示信息输出在控制台</span>
                <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
            }
        }
    }</span>

1.12 异常练习(理解)

  • 需求 键盘录入学生的姓名和年龄,其中年龄为18-25岁;

    超出这个范围是异常数据不能赋值,并给出提示;

    需要重新录入,一直录到正确为止。

  • 实现步骤

    1. 创建学生对象,提供getter&setter

    2. 自定义年龄不符合异常类

    3. 在setter中校验输入的年龄是否合法,不符合则抛出异常:年龄不符合异常类

    4. 测试类中键盘录入姓名和年龄,并赋值给学生对象

    5. 如果是非法数据就再次录入

    6. 期间使用异常传递错误信息

  • 演示代码

  • Student.java

    <span style="background-color:#f8f8f8">​</span>
  • 测试类ExceptionDemo12.java

    <span style="background-color:#f8f8f8">​</span>

2. 集合概述

2.0 写在前面

集合3天也会学习大量API,但是都是集合体系的,有规律可循;

学习集合的底层数据结构,才能更好的了解集合的特点。

数据结构理解是个难点。

2.1 集合和数组的区别

  1. 数组长度不可变,集合长度可变

  2. 数组可以存基本数据类型和引用数据类型。 集合只能存引用数据类型;如果要存基本数据类型,需要存对应的包装类。

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">class</span> <span style="color:#0000ff">MyCollectionDemo1</span>{
    ​
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
        <span style="color:#aa5500">// 数组可以存储基本数据类型,也可以存储引用数据类型</span>
    ​
            <span style="color:#008855">int</span>[] <span style="color:#000000">arr1</span> <span style="color:#981a1a">=</span>{<span style="color:#116644">1</span>,<span style="color:#116644">2</span>,<span style="color:#116644">3</span>};
            <span style="color:#008855">String</span>[] <span style="color:#000000">arr2</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">"a"</span>,<span style="color:#aa1111">"b"</span>,<span style="color:#aa1111">"c"</span>};
    ​
            <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list1</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
            <span style="color:#000000">list1</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"a"</span>);
            <span style="color:#000000">list1</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"b"</span>);
            <span style="color:#000000">list1</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"c"</span>);
    ​
            <span style="color:#aa5500">// int报错</span>
            <span style="color:#aa5500">// ArrayList<int> list2 = new ArrayList<>();</span>
            <span style="color:#aa5500">// 可以存储基本数据类型的包装类</span>
            <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><</span><span style="color:#008855">Integer</span><span style="color:#981a1a">></span> <span style="color:#000000">list2</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
            <span style="color:#000000">list2</span>.<span style="color:#000000">add</span>(<span style="color:#116644">1</span>);
            <span style="color:#000000">list2</span>.<span style="color:#000000">add</span>(<span style="color:#116644">2</span>);
            <span style="color:#000000">list2</span>.<span style="color:#000000">add</span>(<span style="color:#116644">3</span>);
        }
    }</span>

2.2 集合体系结构

学习方式:

  • 学顶层,用底层。

    • 因为顶层包含了通用方法,学习一个类/接口相当于学习了N个类;

    • 底层实现类才能创建对象,才能真的干活。

==2. Collection==

Collection是单列集合的顶层接口,内部规定了单列集合中通用的成员方法。

Collection是一个接口,不能创建对象并演示效果;我们就创建ArrayList类的对象并演示。

2.1 Collection成员方法

2.1.1 方法演示

  • 常用的成员方法如下:

    方法名说明
    ==boolean add(E e)==向集合中添加元素
    ==int size()==获取集合的长度
    boolean remove(E e)将元素从集合中删除,返回是否删除成功
    boolean removeIf(Object o)根据条件进行删除,参数是一个Lambda表达式
    void clear()清空集合所有的元素
    boolean contains(E e)判断集合中是否包含指定的元素
    boolean isEmpty()判断集合是否为空
    <T> T[] toArray(T[] a)把集合转为数组
  • 方法说明

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">// boolean add(E e)     添加元素</span>
    <span style="color:#aa5500">// int size()           集合的长度,也就是集合中元素的个数</span>
    <span style="color:#aa5500">// boolean remove(Object o)     从集合中移除指定的元素</span>
    <span style="color:#aa5500">// boolean removeif(Object o)   根据条件进行删除(参数为一个Lambda表达式)</span>
    <span style="color:#aa5500">// void clear()         清空集合</span>
    <span style="color:#aa5500">// boolean contains(Object o)   判断集合中是否存在指定的元素</span>
    <span style="color:#aa5500">// boolean contains(Object o)   判断集合中是否存在指定的元素</span>
    <span style="color:#aa5500">// boolean isEmpty()        判断集合是否为空</span>
    <span style="color:#aa5500">// <T> T[] toArray(T[] a)   把集合转为数组</span></span>

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">mycollectiondemo1</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
    ​
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MyCollectonDemo2</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    <span style="color:#aa5500">//        boolean add(E e)      添加元素</span>
            <span style="color:#000000">collection</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"aaa"</span>);
            <span style="color:#000000">collection</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"bbb"</span>);
            <span style="color:#000000">collection</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"ccc"</span>);
            <span style="color:#000000">collection</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"dddd"</span>);
            <span style="color:#aa5500">//System.out.println(collection);</span>
            <span style="color:#aa5500">//method1(collection);</span>
            <span style="color:#aa5500">//method2(collection);</span>
            <span style="color:#aa5500">//method3(collection);</span>
            <span style="color:#aa5500">//method4(collection);</span>
            <span style="color:#aa5500">//method5(collection);</span>
            <span style="color:#aa5500">//method6(collection);</span>
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method6</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// int size()           集合的长度,也就是集合中元素的个数</span>
            <span style="color:#008855">int</span> <span style="color:#000000">size</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">size</span>();
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">size</span>);
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method5</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// boolean isEmpty()        判断集合是否为空</span>
            <span style="color:#000000">collection</span>.<span style="color:#000000">clear</span>();
            <span style="color:#008855">boolean</span> <span style="color:#000000">result</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">isEmpty</span>();
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">result</span>);
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method4</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// boolean contains(Object o)   判断集合中是否存在指定的元素</span>
            <span style="color:#008855">boolean</span> <span style="color:#000000">result</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">contains</span>(<span style="color:#aa1111">"a"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">result</span>);
    ​
    ​
            <span style="color:#008855">boolean</span> <span style="color:#000000">result2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">contains</span>(<span style="color:#aa1111">"aaa"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">result2</span>);
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method3</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// void clear()         清空集合</span>
            <span style="color:#aa5500">//就是将集合中所有的元素全部删除.</span>
            <span style="color:#000000">collection</span>.<span style="color:#000000">clear</span>();
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">collection</span>);
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method2</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// boolean removeif(Object o)   根据条件进行删除</span>
            <span style="color:#aa5500">//removeif底层会遍历集合,得到集合中的每一个元素</span>
            <span style="color:#aa5500">//s依次表示集合中的每一个元素</span>
            <span style="color:#aa5500">//就会把这每一个元素都到lambda表达式中去判断一下</span>
            <span style="color:#aa5500">//如果返回的是true,则删除</span>
            <span style="color:#aa5500">//如果返回的是false,则保留不删除.</span>
    ​
    ​
            <span style="color:#aa5500">//boolean test(String t);</span>
            <span style="color:#000000">collection</span>.<span style="color:#000000">removeIf</span>(
                    (<span style="color:#008855">String</span> <span style="color:#000000">s</span>)<span style="color:#981a1a">-></span>{
                        <span style="color:#770088">return</span> <span style="color:#000000">s</span>.<span style="color:#000000">length</span>() <span style="color:#981a1a">==</span> <span style="color:#116644">3</span>;
                    }
    ​
            );
            
            <span style="color:#aa5500">// 简化后的Lambda表示式如下:</span>
            <span style="color:#aa5500">/* collection.removeIf(</span>
                <span style="color:#aa5500">s -> s.length() == 3</span>
            <span style="color:#aa5500">); */</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">collection</span>);
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">method1</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">collection</span>) {
            <span style="color:#aa5500">// boolean remove(Object o)     从集合中移除指定的元素</span>
            <span style="color:#aa5500">//如果删除成功了,则返回true</span>
            <span style="color:#aa5500">//如果删除失败了,则返回false</span>
            <span style="color:#008855">boolean</span> <span style="color:#000000">result1</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">remove</span>(<span style="color:#aa1111">"aaa"</span>);
            <span style="color:#008855">boolean</span> <span style="color:#000000">result2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">collection</span>.<span style="color:#000000">remove</span>(<span style="color:#aa1111">"ddd"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">result1</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">result2</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">collection</span>);
        }
    }</span>

2.1.2 removeIf&Predicate

  • 知识回顾

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">/*</span>
        <span style="color:#aa5500">匿名内部类:</span>
            <span style="color:#aa5500">如果一个方法的形参是接口/抽象类类型,可以在调用该方法时传递一个匿名内部类对象。</span>
            
        <span style="color:#aa5500">Lambda:</span>
            <span style="color:#aa5500">如果匿名内部类的父接口是一个函数式接口,可以使用Lambda简化匿名内部类的代码。</span>
    <span style="color:#aa5500">*/</span>
    ​
    <span style="color:#aa5500">/*</span>
        <span style="color:#aa5500">1. 接口中的抽象方法有且只有一个的接口就是函数式接口,可以使用@FunctionInterface注解检查。</span>
        <span style="color:#aa5500">2. Lambda简写口诀:</span>
            <span style="color:#aa5500">左右遇一括号省;</span>
            <span style="color:#aa5500">左边推断类型省;</span>
            <span style="color:#aa5500">右边独句return;省。</span>
    <span style="color:#aa5500">*/</span></span>

  • collection中removeIf使用

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">function</span>.<span style="color:#000000">Predicate</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Collection中通用的成员方法</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo02</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#aa5500">// 创建集合对象。多态:父接口引用指向子类对象</span>
            <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
            <span style="color:#aa5500">// boolean add(E e)     添加元素</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"杭州黑马"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"Java70"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"高薪就业"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"niubility"</span>);
    ​
    ​
            <span style="color:#aa5500">// anonymousInnerClasses(coll);</span>
    ​
            <span style="color:#000000">coll</span>.<span style="color:#000000">removeIf</span>(<span style="color:#000000">s</span> <span style="color:#981a1a">-></span> <span style="color:#000000">s</span>.<span style="color:#000000">length</span>() <span style="color:#981a1a">></span> <span style="color:#116644">4</span>);
    ​
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"coll = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">coll</span>);
    ​
    ​
        }
    ​
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">anonymousInnerClasses</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span>) {
            <span style="color:#000000">coll</span>.<span style="color:#000000">removeIf</span>(<span style="color:#770088">new</span> <span style="color:#000000">Predicate</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span>() {
                <span style="color:#aa5500">/**</span>
                 <span style="color:#aa5500">* removeIf中已经实现:</span>
                 <span style="color:#aa5500">*      遍历集合coll,得到每一个元素,并把它传递给Predicate子类对象的test方法;</span>
                 <span style="color:#aa5500">*      removeIf会根据test方法的返回值,决定是否删除</span>
                 <span style="color:#aa5500">* 需要我们自己实现的:</span>
                 <span style="color:#aa5500">*      在test方法内部,需要我们自己编写逻辑,校验是否符合要求,符合就返回true,否则返回false;</span>
                 <span style="color:#aa5500">*</span>
                 <span style="color:#aa5500">* @param s 遍历得到的每一个元素对象</span>
                 <span style="color:#aa5500">* @return 决定是否删除该元素</span>
                 <span style="color:#aa5500">*/</span>
                <span style="color:#555555">@Override</span>
                <span style="color:#770088">public</span> <span style="color:#008855">boolean</span> <span style="color:#000000">test</span>(<span style="color:#008855">String</span> <span style="color:#000000">s</span>) {
                    <span style="color:#770088">return</span> <span style="color:#000000">s</span>.<span style="color:#000000">length</span>() <span style="color:#981a1a">==</span> <span style="color:#116644">4</span>;
                }
            });
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"coll = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">coll</span>);
        }
    }</span>

  • Lambda&Predicate

    <span style="background-color:#f8f8f8">​
    ​
     <span style="color:#aa5500">/*</span>
        <span style="color:#aa5500">Predicate   可以理解为断言/判断</span>
        
        <span style="color:#aa5500">这是一个函数式接口,表示要断言(判断)某个参数是否满足某个条件,通过其test方法完成。</span>
            <span style="color:#aa5500">参数:其test方法的形参</span>
            <span style="color:#aa5500">条件:子类重写test方法的方法体中提供,需要自己编写</span>
            <span style="color:#aa5500">结果:通过test方法的返回值体现</span>
            <span style="color:#aa5500">T的类型取决于调用removeIf方法的集合对象,T就是集合对象元素类型。</span>
    ​
     <span style="color:#aa5500">*/</span>
    <span style="color:#555555">@FunctionalInterface</span>
    <span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">Predicate</span><span style="color:#981a1a"><</span><span style="color:#000000">T</span><span style="color:#981a1a">></span> {
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* 判断给定的参数是否符合要求</span>
         <span style="color:#aa5500">*</span>
         <span style="color:#aa5500">* @param t 给定的参数</span>
         <span style="color:#aa5500">* @return 符合要求,也就是满足断言的条件,返回true;否则返回false。</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#008855">boolean</span> <span style="color:#000000">test</span>(<span style="color:#000000">T</span> <span style="color:#000000">t</span>);
        <span style="color:#aa5500">// Lambda 使用格式</span>
        <span style="color:#aa5500">// (String t)-> {完成判断逻辑}</span>
    }
    ​</span>

2.2 集合遍历

2.2.0 ArrayList遍历-普通for

Collection体系的集合不一定有索引,所以无法像遍历数组那样使用普通for + 索引遍历。

但是Collection体系下,List分支是有索引的,所以可以使用类似数组的遍历方式:普通for + 索引

演示代码:

  • CollectionDemo03.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* ArrayList集合遍历</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo03</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"杭州黑马"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"Java70"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"高薪就业"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"niubility"</span>);
    ​
            <span style="color:#aa5500">// 遍历集合:普通for循环 + get(索引)</span>
            <span style="color:#770088">for</span> (<span style="color:#008855">int</span> <span style="color:#000000">i</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>; <span style="color:#000000">i</span> <span style="color:#981a1a"><</span> <span style="color:#000000">list</span>.<span style="color:#000000">size</span>(); <span style="color:#000000">i</span><span style="color:#981a1a">++</span>) {
                <span style="color:#aa5500">// 遍历得到每一个元素</span>
                <span style="color:#008855">String</span> <span style="color:#000000">str</span> <span style="color:#981a1a">=</span> <span style="color:#000000">list</span>.<span style="color:#000000">get</span>(<span style="color:#000000">i</span>);
            }
        }
    }</span>

2.2.1 Collection遍历1-迭代器

普通for循环+get(i)可以完成ArrayList(List)集合的遍历,是因为ArrayList集合是有索引的,所以可以使用索引获取。

但是Collection体系下,其他的实现类(eg:set的实现类)是没有索引的。也就无法使用普通for循环+get(i)循环遍历。

这个时候,就可以使用迭代器进行遍历。

概述:

迭代器遍历是单列Collection集合遍历的通用方式,不适用双列的Map集合。

迭代器接口为Iterator,可以使用Collection集合对象获取Iterator迭代器对象。

  1. Iterator常用成员方法

    • boolean hasNext():判断集合中当前位置是否有元素未取出

    • E next():获取当前位置的元素,并将迭代器对象指向下一个位置

  2. 迭代器使用,需要注意

    • 通过集合对象获取的迭代器对象,泛型与集合一致

    • E next()方法可能报出NoSuchElementException的异常,所以要先hasNext,结果为true才调用next获取元素。

演示代码:

  • CollectionDemo04.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Iterator</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Collection遍历方式-迭代器演示</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo04</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建集合对象。多态:父接口引用指向子类对象</span>
            <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// boolean add(E e)     添加元素</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"赵敏"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"小昭"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"素素"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"灭绝"</span>);
    ​
            <span style="color:#aa5500">// 开始遍历</span>
            <span style="color:#aa5500">// 1. 通过集合对象获取迭代器对象。通过结合对象获取,其泛型和集合对象一致</span>
            <span style="color:#000000">Iterator</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">it</span> <span style="color:#981a1a">=</span> <span style="color:#000000">coll</span>.<span style="color:#000000">iterator</span>();
    ​
            <span style="color:#aa5500">// 2. 使用迭代器判断是否还有元素未取出</span>
            <span style="color:#770088">while</span> (<span style="color:#000000">it</span>.<span style="color:#000000">hasNext</span>()) {
                <span style="color:#aa5500">// 3. 如果有,就使用迭代器对象取出</span>
                <span style="color:#008855">String</span> <span style="color:#000000">ele</span> <span style="color:#981a1a">=</span> <span style="color:#000000">it</span>.<span style="color:#000000">next</span>();
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"ele = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">ele</span>);
            }
        }
    }
    ​</span>

执行流程:

2.2.2 Collection遍历2-增强for

迭代器功能比较强大,但是书写麻烦。

所以从JDK1.5开始,出现了增强for(语法糖),用来简化迭代器的书写;

  • 凡是能用Iterator遍历的集合(单列集合),都可以使用增强for;双列集合不能直接使用。

格式:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/*</span>
    <span style="color:#aa5500">for(数组/单列集合元素类型  变量 : 数组/单列集合对象){</span>
        <span style="color:#aa5500">使用变量 //变量的值等于集合/数组中的每个元素   </span>
    <span style="color:#aa5500">}</span>
<span style="color:#aa5500">*/</span></span></span>

演示代码:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Iterator</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* Collection遍历方式-增强for演示</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo05</span> {
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
        <span style="color:#aa5500">// 创建集合对象。多态:父接口引用指向子类对象</span>
        <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
​
        <span style="color:#aa5500">// boolean add(E e)     添加元素</span>
        <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"赵敏"</span>);
        <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"小昭"</span>);
        <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"素素"</span>);
        <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"灭绝"</span>);
​
        <span style="color:#aa5500">// 增强for遍历Collection集合</span>
        <span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">str</span> : <span style="color:#000000">coll</span>) {
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"str = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">str</span>);
        }
​
        <span style="color:#aa5500">// idea快捷键: 集合对象.for + 回车</span>
        <span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">ele</span> : <span style="color:#000000">coll</span>) {
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"ele = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">ele</span>);
        }
    }
}</span></span>

注意事项1:

  • 增强for可以遍历集合,也可以遍历数组;

  • 遍历集合时,相当于迭代器的简化版

  • 遍历数组时,相当于普通for的简化版

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 增强for遍历数组</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo06</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
    ​
            <span style="color:#008855">int</span>[] <span style="color:#000000">arr</span> <span style="color:#981a1a">=</span> {<span style="color:#116644">1</span>, <span style="color:#116644">2</span>, <span style="color:#116644">3</span>, <span style="color:#116644">4</span>, <span style="color:#116644">5</span>};
    ​
            <span style="color:#770088">for</span> (<span style="color:#008855">int</span> <span style="color:#000000">num</span> : <span style="color:#000000">arr</span>) {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"num = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">num</span>);
            }
    ​
        }
    }</span>

    反编译内容如下:

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">//</span>
    <span style="color:#aa5500">// Source code recreated from a .class file by IntelliJ IDEA</span>
    <span style="color:#aa5500">// (powered by FernFlower decompiler)</span>
    <span style="color:#aa5500">//</span>
    ​
    <span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo06</span> {
        <span style="color:#770088">public</span> <span style="color:#000000">CollectionDemo06</span>() {
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#008855">int</span>[] <span style="color:#000000">arr</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#008855">int</span>[]{<span style="color:#116644">1</span>, <span style="color:#116644">2</span>, <span style="color:#116644">3</span>, <span style="color:#116644">4</span>, <span style="color:#116644">5</span>};
            <span style="color:#008855">int</span>[] <span style="color:#000000">var2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">arr</span>;
            <span style="color:#008855">int</span> <span style="color:#000000">var3</span> <span style="color:#981a1a">=</span> <span style="color:#000000">arr</span>.<span style="color:#000000">length</span>;
    ​
            <span style="color:#770088">for</span>(<span style="color:#008855">int</span> <span style="color:#000000">var4</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>; <span style="color:#000000">var4</span> <span style="color:#981a1a"><</span> <span style="color:#000000">var3</span>; <span style="color:#981a1a">++</span><span style="color:#000000">var4</span>) {
                <span style="color:#008855">int</span> <span style="color:#000000">num</span> <span style="color:#981a1a">=</span> <span style="color:#000000">var2</span>[<span style="color:#000000">var4</span>];
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"num = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">num</span>);
            }
    ​
        }
    }</span>

注意事项2:

  • 增强for中修改“元素”的值无效

    因为修改的仅仅是一个第三方变量的值,而非集合中元素的值。

    可以把增强for中冒号前面的部分理解为:定义了一个新的变量,不断接受数组/集合中的元素的值。

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 增强for使用注意事项2</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo09</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建集合对象</span>
            <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 添加元素</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"a"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"b"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"c"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"d"</span>);
    ​
    ​
            <span style="color:#aa5500">// 遍历并使用(修改)</span>
            <span style="color:#aa5500">// 在增强for中修改元素的值,无效</span>
            <span style="color:#aa5500">// 可以这样理解:增强for将集合中每个元素拿出来,赋值给了一个第三方的变量ele</span>
            <span style="color:#aa5500">// ele并不是元素本身,而是记录了元素地址值的另外一个变量</span>
            <span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">ele</span> : <span style="color:#000000">coll</span>) {
                <span style="color:#000000">ele</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"q"</span>;
            }
            <span style="color:#aa5500">// 查看是否修改成功</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"coll = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">coll</span>);
        }
    }</span>

  • 图示

2.2.3 Collection遍历3-forEach

需要用到Collection中定义的一个方法forEach:

方法签名说明
default void forEach(Consumer<? super T> action)封装了增强for的遍历方式,需要配合Lambda使用

演示代码:

  • CollectionDemo07.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Collection</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">function</span>.<span style="color:#000000">Consumer</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Collection遍历方式3-forEach</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo07</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建集合对象。多态:父接口引用指向子类对象</span>
            <span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// boolean add(E e)     添加元素</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"赵敏"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"小昭"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"素素"</span>);
            <span style="color:#000000">coll</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"灭绝"</span>);
    ​
            <span style="color:#aa5500">// default void forEach(Consumer<? super T> action) 封装了增强for的遍历方式,需要配合Lambda使用</span>
            <span style="color:#aa5500">// annoInnerClass(coll);</span>
    ​
            <span style="color:#aa5500">// Lambda写法</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">forEach</span>(<span style="color:#000000">str</span> <span style="color:#981a1a">-></span> <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"str = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">str</span>));
    ​
        }
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* 匿名内部类写法</span>
         <span style="color:#aa5500">*</span>
         <span style="color:#aa5500">* @param coll</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#770088">private</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">annoInnerClass</span>(<span style="color:#000000">Collection</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">coll</span>) {
            <span style="color:#aa5500">// 消费者接口,就只管消费。</span>
            <span style="color:#000000">coll</span>.<span style="color:#000000">forEach</span>(<span style="color:#770088">new</span> <span style="color:#000000">Consumer</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span>() {
                <span style="color:#aa5500">/**</span>
                 <span style="color:#aa5500">* 底层使用增强for,遍历得到每个元素,并传递给消费者接口的accept方法</span>
                 <span style="color:#aa5500">* @param s 值为通过增强for得到的每个元素对象</span>
                 <span style="color:#aa5500">*/</span>
                <span style="color:#555555">@Override</span>
                <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">accept</span>(<span style="color:#008855">String</span> <span style="color:#000000">s</span>) {
                    <span style="color:#aa5500">// 打印每个元素</span>
                    <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"s = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">s</span>);
                }
            });
        }
    }</span>

消费者接口:

  • Consumer.java

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">/**</span>
        <span style="color:#aa5500">常用函数式接口。称为消费者接口;</span>
        <span style="color:#aa5500">消费者接口:只接收参数并使用(消费),不会返回任何内容(生产)。</span>
        <span style="color:#aa5500">通过其唯一的抽象方法,也可以明确这个特性:有入参(形参)无出参(返回值)</span>
    <span style="color:#aa5500">**/</span>
    ​
    <span style="color:#555555">@FunctionalInterface</span>
    <span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">Consumer</span><span style="color:#981a1a"><</span><span style="color:#000000">T</span><span style="color:#981a1a">></span> {
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* Performs this operation on the given argument.</span>
         <span style="color:#aa5500">*</span>
         <span style="color:#aa5500">* @param t the input argument</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#008855">void</span> <span style="color:#000000">accept</span>(<span style="color:#000000">T</span> <span style="color:#000000">t</span>);
    }</span>

2.2.4 遍历方式汇总&练习

集合遍历有三种方式:

  1. 迭代器Iterator(所有单列集合可用)

  2. 增强for(迭代器的简化写法,还可以遍历数组)

  3. forEach方法(JDK8总提供的方式,增强for+Lambda)

如果是有索引的集合,还可以使用下面的方式

  • 普通for循环+get(索引)(集合元素有索引)

练习需求:

  • 在集合中存储自定义的对象,并遍历。自定义对象包含信息如下图:

    tips:电影最少包含三个属性:名称、评分、主要演员名称(封装到一个String中即可)

演示代码:

  • Movie.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 自定义电影类</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">Movie</span> {
        <span style="color:#aa5500">/** 电影名称 */</span>
        <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
        <span style="color:#aa5500">/** 电影评分 */</span>
        <span style="color:#770088">private</span> <span style="color:#008855">double</span> <span style="color:#000000">score</span>;
        <span style="color:#aa5500">/** 电影主演 */</span>
        <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">actor</span>;
    ​
        <span style="color:#770088">public</span> <span style="color:#000000">Movie</span>() {
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#000000">Movie</span>(<span style="color:#008855">String</span> <span style="color:#000000">name</span>, <span style="color:#008855">double</span> <span style="color:#000000">score</span>, <span style="color:#008855">String</span> <span style="color:#000000">actor</span>) {
            <span style="color:#770088">this</span>.<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">name</span>;
            <span style="color:#770088">this</span>.<span style="color:#000000">score</span> <span style="color:#981a1a">=</span> <span style="color:#000000">score</span>;
            <span style="color:#770088">this</span>.<span style="color:#000000">actor</span> <span style="color:#981a1a">=</span> <span style="color:#000000">actor</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getName</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">name</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setName</span>(<span style="color:#008855">String</span> <span style="color:#000000">name</span>) {
            <span style="color:#770088">this</span>.<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">name</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">double</span> <span style="color:#000000">getScore</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">score</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setScore</span>(<span style="color:#008855">double</span> <span style="color:#000000">score</span>) {
            <span style="color:#770088">this</span>.<span style="color:#000000">score</span> <span style="color:#981a1a">=</span> <span style="color:#000000">score</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getActor</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">actor</span>;
        }
    ​
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setActor</span>(<span style="color:#008855">String</span> <span style="color:#000000">actor</span>) {
            <span style="color:#770088">this</span>.<span style="color:#000000">actor</span> <span style="color:#981a1a">=</span> <span style="color:#000000">actor</span>;
        }
    ​
        <span style="color:#555555">@Override</span>
        <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">toString</span>() {
            <span style="color:#770088">return</span> <span style="color:#aa1111">"Movie{"</span> <span style="color:#981a1a">+</span>
                    <span style="color:#aa1111">"name='"</span> <span style="color:#981a1a">+</span> <span style="color:#000000">name</span> <span style="color:#981a1a">+</span> <span style="color:#aa1111">'\''</span> <span style="color:#981a1a">+</span>
                    <span style="color:#aa1111">", score="</span> <span style="color:#981a1a">+</span> <span style="color:#000000">score</span> <span style="color:#981a1a">+</span>
                    <span style="color:#aa1111">", actor='"</span> <span style="color:#981a1a">+</span> <span style="color:#000000">actor</span> <span style="color:#981a1a">+</span> <span style="color:#aa1111">'\''</span> <span style="color:#981a1a">+</span>
                    <span style="color:#aa1111">'}'</span>;
        }
    }</span>

  • CollectionDemo08.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Collection集合存储自定义对象并遍历使用</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo08</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 新建集合对象,存储Movie</span>
            <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><</span><span style="color:#000000">Movie</span><span style="color:#981a1a">></span> <span style="color:#000000">movies</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 新建多个Movie并添加到集合中</span>
            <span style="color:#000000">movies</span>.<span style="color:#000000">add</span>(<span style="color:#770088">new</span> <span style="color:#000000">Movie</span>(<span style="color:#aa1111">"满江红"</span>,<span style="color:#116644">9.3</span>,<span style="color:#aa1111">"易烊千玺"</span>));
            <span style="color:#000000">movies</span>.<span style="color:#000000">add</span>(<span style="color:#770088">new</span> <span style="color:#000000">Movie</span>(<span style="color:#aa1111">"流浪地球2"</span>,<span style="color:#116644">9.0</span>,<span style="color:#aa1111">"吴京、刘德华、沙溢"</span>));
            <span style="color:#000000">movies</span>.<span style="color:#000000">add</span>(<span style="color:#770088">new</span> <span style="color:#000000">Movie</span>(<span style="color:#aa1111">"熊出没"</span>,<span style="color:#116644">7.9</span>,<span style="color:#aa1111">"熊大、熊二"</span>));
    ​
    ​
            <span style="color:#aa5500">// 遍历并打印</span>
            <span style="color:#770088">for</span> (<span style="color:#000000">Movie</span> <span style="color:#000000">movie</span> : <span style="color:#000000">movies</span>) {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"movie = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">movie</span>);
            }
        }
    }</span>

==3. List集合==

3.1 List概述

ListCollection单列集合的一个最常用的分支。有如下特点:

  1. 有序。存取顺序一致。

    eg:存的时候是1、3、2、8、4、6、7,取的时候也是1、3、2、8、4、6、7这个顺序

  2. 有索引。可以通过索引操作元素。

  3. 可重复。存储的元素可以重复。

List是一个接口,不能创建对象。ArrayList是其实现类之一。

如下图所示:

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">List</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* List特点演示</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ListDemo01</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 有序、可重复、有索引</span>
    ​
            <span style="color:#aa5500">// 创建集合对象</span>
            <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 添加元素</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"b"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"a"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"e"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"d"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"c"</span>);
    ​
            <span style="color:#aa5500">// 增强for遍历:演示有序,存取顺序一致</span>
            <span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">s</span> : <span style="color:#000000">list</span>) {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"s = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">s</span>);
            }
    ​
            <span style="color:#aa5500">// 演示可重复</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"a"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
            <span style="color:#aa5500">// 演示有索引</span>
            <span style="color:#770088">for</span> (<span style="color:#008855">int</span> <span style="color:#000000">i</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>; <span style="color:#000000">i</span> <span style="color:#981a1a"><</span> <span style="color:#000000">list</span>.<span style="color:#000000">size</span>(); <span style="color:#000000">i</span><span style="color:#981a1a">++</span>) {
                <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.get(i) = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">get</span>(<span style="color:#000000">i</span>));
            }
        }
    }</span>

3.2 List特有的成员方法

List相对于Collection来说,多了一些特点,比方说有索引。

那么,List中就会有一些与索引相关的特有方法,这些方法在Collection没有。

  • 成员方法

    成员方法作用
    E get(int index)获取指定索引处的元素
    E remove(int index)删除指定索引处的元素并返回
    void add(int index,E e)向集合中指定索引位置添加元素,后面所有元素后移一位
    E set(int index,E e)修改指定索引处的元素,返回被修改的元素

  • 方法说明

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">// E get(int index)     返回指定索引处的元素</span>
    <span style="color:#aa5500">// void add(int index,E element)    在此集合中的指定位置插入指定的元素</span>
    <span style="color:#aa5500">// E remove(int index)      删除指定索引处的元素,返回被删除的元素</span>
    <span style="color:#aa5500">// E set(int index,E element)   修改指定索引处的元素,返回被修改的元素</span></span>

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">List</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* List中特有成员方法演示</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ListDemo02</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建List集合对象</span>
            <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 添加元素,默认添加到集合的末尾</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"蔡徐坤"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"Ikun"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"丁震"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"刘亦菲"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"肖战"</span>);
    ​
            <span style="color:#aa5500">// E get(int index)     返回指定索引处的元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.get(3) = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">get</span>(<span style="color:#116644">3</span>));
    ​
    ​
            <span style="color:#aa5500">// void add(int index,E element)    在此集合中的指定位置插入指定的元素</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#116644">3</span>,<span style="color:#aa1111">"高圆圆"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
            <span style="color:#aa5500">// E remove(int index)      删除指定索引处的元素,返回被删除的元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.remove(4) = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">remove</span>(<span style="color:#116644">4</span>));
    ​
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
    ​
            <span style="color:#aa5500">// E set(int index,E element)   修改指定索引处的元素,返回被修改的元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.set(3,\"贾玲\") = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">set</span>(<span style="color:#116644">3</span>, <span style="color:#aa1111">"贾玲"</span>));
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
        }
    }</span>

3.3 List遍历方式

继承自Collection的方式:

  1. 迭代器

  2. 增强for

  3. forEach+Lambda

List有索引,所有有一种特有的遍历方式

  • 普通for+get(索引)

演示代码:

  • CollectionDemo03.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">ArrayList</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* ArrayList集合遍历</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">CollectionDemo03</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"杭州黑马"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"Java70"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"高薪就业"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"niubility"</span>);
    ​
            <span style="color:#aa5500">// 遍历集合:普通for循环 + get(索引)</span>
            <span style="color:#770088">for</span> (<span style="color:#008855">int</span> <span style="color:#000000">i</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>; <span style="color:#000000">i</span> <span style="color:#981a1a"><</span> <span style="color:#000000">list</span>.<span style="color:#000000">size</span>(); <span style="color:#000000">i</span><span style="color:#981a1a">++</span>) {
                <span style="color:#aa5500">// 遍历得到每一个元素</span>
                <span style="color:#008855">String</span> <span style="color:#000000">str</span> <span style="color:#981a1a">=</span> <span style="color:#000000">list</span>.<span style="color:#000000">get</span>(<span style="color:#000000">i</span>);
            }
        }
    }</span>

3.4 ArrayList

3.4.1 概述

ArrayList底层数据结构是数组,查询快,增删慢。

List集合乃至整个Collection集合体系中,使用频率最高的一个实现类。没有之一!

数组长度不可变,ArrayList是如何实现长度可变的呢?原理如下:

3.4.2 ArrayList底层原理

  1. ArrayList底层是数组,使用无参构造会在底层创建一个长度为0的数组。

  2. 调用add方法添加元素的时候,会自动创建一个长度为10的数组elementData,并使用变量size记录已经存储的元素个数。这里的size有两个作用。

    1. 存储下一次要操作的元素的索引

    2. 集合中已有元素的个数

  3. 添加原理:添加的时候,在size索引处添加元素,后size++

  4. 扩容原理:

    存满了之后,会创建一个新的长度为原长度*1.5的数组,复制原有元素到新的数组后添加

    如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

  5. 查询原理:使用索引获取元素

  6. size()方法返回的就是ArrayList中变量size的值

图示:

ArrayList集合底层是基于数组结构实现的,也就是说当你往集合容器中存储元素时,底层本质上是往数组中存储元素。 特点如下:

我们知道数组的长度是固定的,但是集合的长度是可变的,这是怎么做到的呢?原理如下:

数组扩容,并不是在原数组上扩容(原数组是不可以扩容的),底层是创建一个新数组,然后把原数组中的元素全部复制到新数组中去。

3.4.3 应用场景

  • 适用场景:通过索引查询,且数据量不大时;

  • 不适用场景:数据量大且增删频繁时。

3.5 LinkedList

3.5.1 概述

底层是链表(双向链表)。

特点:查询慢(相对数组而言),增删快。特点决定了其应用场景。

单向链表:链表结构是由一个一个的节点组成,一个节点由数据值、下一个元素的地址组成。

3.5.2 LinkedList底层原理

链表结构是由一个一个的节点组成,一个节点由数据值、下一个元素的地址组成。如下图所示

假如,现在要在B节点和D节点中间插入一个元素,只需要把B节点指向D节点的地址断掉,重新指向新的节点地址就可以了。如下图所示:

假如,现在想要把D节点删除,只需要让C节点指向E节点的地址,然后把D节点指向E节点的地址断掉。此时D节点就会变成垃圾,会把垃圾回收器清理掉。

上面的链表是单向链表,它的方向是从头节点指向尾节点的,只能从左往右查找元素,这样查询效率比较慢;还有一种链表叫做双向链表,不光可以从做往右找,还可以从右往左找。如下图所示:

LinkedList集合是基于双向链表实现的。

3.5.3 LinkedList特有成员方法

受LinkedList底层数据结构(双向链表)的影响,其特有方法都是和首尾相关。

  • 特有方法

    方法名说明
    public void addFirst(E e)在该列表开头插入指定的元素
    public void addLast(E e)将指定的元素追加到此列表的末尾,同add(E e)
    public E getFirst()返回此列表中的第一个元素
    public E getLast()返回此列表中的最后一个元素
    public E removeFirst()从此列表中删除并返回第一个元素
    public E removeLast()从此列表中删除并返回最后一个元素
  • 注释

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">// public void addFirst(E e)    在该列表开头插入指定的元素</span>
    <span style="color:#aa5500">// public void addLast(E e) 将指定的元素追加到此列表的末尾</span>
    <span style="color:#aa5500">// public E getFirst()      返回此列表中的第一个元素</span>
    <span style="color:#aa5500">// public E getLast()       返回此列表中的最后一个元素</span>
    <span style="color:#aa5500">// public E removeFirst()       从此列表中删除并返回第一个元素</span>
    <span style="color:#aa5500">// public E removeLast()        从此列表中删除并返回最后一个元</span></span>

  • 演示代码

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">LinkedList</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">List</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* LInkedList特有成员方法</span>
     <span style="color:#aa5500">*</span>
     <span style="color:#aa5500">* @Author Vsunks.v</span>
     <span style="color:#aa5500">* @Date 2023/3/1 15:05</span>
     <span style="color:#aa5500">* @Blog blog.sunxiaowei.net/996.mba</span>
     <span style="color:#aa5500">* @Description: LInkedList特有成员方法</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ListDemo03</span> {
    ​
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建集合对象</span>
            <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">list</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 添加元素</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"aaa"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"bbb"</span>);
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"ccc"</span>);
    ​
            <span style="color:#aa5500">// public void addFirst(E e)    在该列表开头插入指定的元素</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">addFirst</span>(<span style="color:#aa1111">"ddd"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
    ​
            <span style="color:#aa5500">// public void addLast(E e) 将指定的元素追加到此列表的末尾</span>
            <span style="color:#aa5500">// 和add(E e)效果一样</span>
            <span style="color:#000000">list</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"eee"</span>);
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
    ​
            <span style="color:#aa5500">// public E getFirst()      返回此列表中的第一个元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.getFirst() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">getFirst</span>());
    ​
    ​
            <span style="color:#aa5500">// public E getLast()       返回此列表中的最后一个元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.getLast() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">getLast</span>());
    ​
    ​
            <span style="color:#aa5500">// public E removeFirst()       从此列表中删除并返回第一个元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.removeFirst() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">removeFirst</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
    ​
            <span style="color:#aa5500">// public E removeLast()        从此列表中删除并返回最后一个元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list.removeLast() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>.<span style="color:#000000">removeLast</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"list = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">list</span>);
    ​
        }
    }</span>

3.5.3 应用场景

  • 查询少,增删多的场景。

  • 模拟其他数据结构:栈、队列

4. 数据结构(理解)

程序 = 数据结构 + 算法

数据结构:数据在计算机中存储时候的组织形式。不同的组织形式,特点不同,带来的结果(运行&存储的效率)也不一样。

常见的数据结构:栈、队列、数组、链表

4.1 数组

数组是一种查询快,增删慢的数据结构。

查询数据通过数组地址和索引,查询任意数据耗时基本相同,查询速度快

删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低

添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低

  • 这里的添加指的是在数组中间添加,而非添加在最后

4.2 链表

一个链表由有多个节点组成,每个节点存储一个元素;链表分为单向链表双向链表

单向链表的节点包含两部分:节点值、下一个节点的地址值。只能正向查找

双向链表的节点包含三部分:上一个节点的地址值、节点值、下一个节点的地址值,可以双向查找

链表删除和添加节点不需要移动元素,只需要修改某个节点中存储的上/下一个节点的地址,所以增删快

查询时:

  • 单向链表只能从前往后挨个查询,每次查询都要把之前所有的元素都遍历一遍,所以对比数组查询速度慢

  • 双向链表,根据查询的元素索引,从离他最近的一个头/尾节点开始找,速度稍快;但是和数组相比,还是查询速度慢

4.3 栈

4.3.1 概述

数据进入栈模型的过程称为:压/进栈;

数据离开栈模型的过程称为:弹/出栈;

栈的特点是:先进后出(FILO:First input last output

有没有感觉栈结构很像,手枪的子弹夹呀!!第一个压进入的子弹在最底下,最后一个才能打出来,最后一个压进入的子弹在最顶上,第一个打出来。

4.3.2 模拟演示

使用链表模拟栈结构演示代码:

  • 栈Mystack.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">javax</span>.<span style="color:#000000">lang</span>.<span style="color:#000000">model</span>.<span style="color:#000000">element</span>.<span style="color:#000000">VariableElement</span>;
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">LinkedList</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 使用LinkedList模拟栈数据结构</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MyStack</span><span style="color:#981a1a"><</span><span style="color:#000000">T</span><span style="color:#981a1a">></span> {
        <span style="color:#aa5500">// 1. 创建LInkedList对象,用于存储数据</span>
        <span style="color:#770088">private</span> <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><</span><span style="color:#000000">T</span><span style="color:#981a1a">></span> <span style="color:#000000">data</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><></span>();
    ​
    ​
        <span style="color:#aa5500">// 2. 定义压栈的方法,存数据到LInkedList对象中</span>
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">push</span>(<span style="color:#000000">T</span> <span style="color:#000000">element</span>){
            <span style="color:#000000">data</span>.<span style="color:#000000">addLast</span>(<span style="color:#000000">element</span>);
        }
    ​
    ​
        <span style="color:#aa5500">// 3. 定义弹栈的方法,从LInkedList对象中获取数据</span>
        <span style="color:#770088">public</span> <span style="color:#000000">T</span> <span style="color:#000000">pop</span>(){
            <span style="color:#770088">return</span> <span style="color:#000000">data</span>.<span style="color:#000000">removeLast</span>();
        }
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* 重写toString方法,方便查看数据</span>
         <span style="color:#aa5500">* @return</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#555555">@Override</span>
        <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">toString</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">data</span>.<span style="color:#000000">toString</span>();
        }
    }</span>
  • 测试类ListDemo04.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 使用LinkedList模拟栈数据结构:测试类</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ListDemo04</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建栈对象</span>
            <span style="color:#000000">MyStack</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">ms</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">MyStack</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 压栈数据</span>
            <span style="color:#000000">ms</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"子弹一"</span>);
            <span style="color:#000000">ms</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"子弹二"</span>);
            <span style="color:#000000">ms</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"子弹三"</span>);
            <span style="color:#000000">ms</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"子弹四"</span>);
    ​
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"ms = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">ms</span>);
    ​
            <span style="color:#aa5500">// 弹栈</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"ms.pop() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">ms</span>.<span style="color:#000000">pop</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"ms = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">ms</span>);
        }
    }</span>

JDK中提供了类:Stack,对应的就是栈这种数据结构。

4.4 队列

4.4.1 概述

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

队列的特点是:先进先出(FIFO:First input first output

  • 元素从上端入队列,从下端出队列。

入队列可以调用LinkedList集合的addLast方法,出队列可以调用removeFirst()方法.

4.4.2 模拟演示

使用链表模拟栈结构演示代码:

  • 栈Mystack.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">LinkedList</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 使用LinkedList模拟队列数据结构</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MyQueue</span><span style="color:#981a1a"><</span><span style="color:#000000">X</span><span style="color:#981a1a">></span> {
        <span style="color:#aa5500">// 1. 定义LinkedList容器对象,存储数据</span>
        <span style="color:#770088">private</span> <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><</span><span style="color:#000000">X</span><span style="color:#981a1a">></span> <span style="color:#000000">data</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">LinkedList</span><span style="color:#981a1a"><></span>();
    ​
        <span style="color:#aa5500">// 2. 定义方法,完成入队列,存入LinkedList对象末尾</span>
        <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">push</span>(<span style="color:#000000">X</span> <span style="color:#000000">element</span>) {
            <span style="color:#000000">data</span>.<span style="color:#000000">addLast</span>(<span style="color:#000000">element</span>);
        }
    ​
    ​
        <span style="color:#aa5500">// 3. 定义方法,完成出队列,从LinkedList对象头部取值</span>
        <span style="color:#770088">public</span> <span style="color:#000000">X</span> <span style="color:#000000">pop</span>() {
            <span style="color:#770088">return</span> <span style="color:#000000">data</span>.<span style="color:#000000">removeFirst</span>();
        }
    }</span>
  • 测试类ListDemo04.java

    <span style="background-color:#f8f8f8"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
    ​
    <span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Queue</span>;
    ​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 使用LinkedList模拟队列数据结构:测试类</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ListDemo05</span> {
        <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
            <span style="color:#aa5500">// 创建队列对象</span>
            <span style="color:#000000">MyQueue</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">mq</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">MyQueue</span><span style="color:#981a1a"><></span>();
    ​
            <span style="color:#aa5500">// 排队,添加元素</span>
            <span style="color:#000000">mq</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"患者1"</span>);
            <span style="color:#000000">mq</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"患者2"</span>);
            <span style="color:#000000">mq</span>.<span style="color:#000000">push</span>(<span style="color:#aa1111">"患者3"</span>);
    ​
    ​
            <span style="color:#aa5500">// 离队,取出元素</span>
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"mq.pop() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">mq</span>.<span style="color:#000000">pop</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"mq.pop() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">mq</span>.<span style="color:#000000">pop</span>());
            <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"mq.pop() = "</span> <span style="color:#981a1a">+</span> <span style="color:#000000">mq</span>.<span style="color:#000000">pop</span>());
    ​
        }
    }</span>

JDK中提供了接口:Queue及一系列的实现类,对应的就是队列这种数据结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值