JAVA筆記10-18

10.01_面向?qū)ο?package關(guān)鍵字的概述及作用)(了解)

  • A:為什么要有包

    • 將字節(jié)碼(.class)進(jìn)行分類存放
    • 包其實(shí)就是文件夾
    • www.briup.com com.briup.項(xiàng)目名
  • B:包的概述

  • 舉例:
    學(xué)生:增加,刪除崎场,修改胖秒,查詢
    老師:增加吃警,刪除蛛淋,修改,查詢
    ...

      方案1:按照功能分
          com.briup.add
              AddStudent
              AddTeacher
          com.briup.delete
              DeleteStudent
              DeleteTeacher
          com.briup.update
              UpdateStudent
              UpdateTeacher
          com.briup.find
              FindStudent
              FindTeacher
      
      方案2:按照模塊分
          com.briup.teacher
              AddTeacher
              DeleteTeacher
              UpdateTeacher
              FindTeacher
          com.briup.student
              AddStudent
              DeleteStudent
              UpdateStudent
              FindStudent
    

10.02_面向?qū)ο?包的定義及注意事項(xiàng))(掌握)

  • A:定義包的格式
    • package 包名;
    • 多級(jí)包用.分開即可
  • B:定義包的注意事項(xiàng)
    • A:package語句必須是程序的第一條可執(zhí)行的代碼
    • B:package語句在一個(gè)java文件中只能有一個(gè)
    • C:如果沒有package,默認(rèn)表示無包名
  • C:案例演示
    • 包的定義及注意事項(xiàng)

10.03_面向?qū)ο?帶包的類編譯和運(yùn)行)(掌握)

  • A:如何編譯運(yùn)行帶包的類
    • a:javac編譯的時(shí)候帶上-d即可
      • javac -d . HelloWorld.java
    • b:通過java命令執(zhí)行岗宣。
      • java 包名.HellWord

10.04_面向?qū)ο?不同包下類之間的訪問)(掌握)

  • A:案例演示
    • 不同包下類之間的訪問
    • com.包名.類名 去使用別的類。
    • 注意:在不同的包中淋样,默認(rèn)修飾符 的成員不能使用耗式;
    • 封裝:隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問方式趁猴。

10.05_面向?qū)ο?import關(guān)鍵字的概述和使用)(掌握)

  • A:案例演示
    • 為什么要有import
      • 其實(shí)就是讓有包的類對(duì)調(diào)用者可見,不用寫全類名了
  • B:導(dǎo)包格式
    • import 包名.類名;
    • 注意:
    • 這種方式導(dǎo)入是到類的名稱。
    • 雖然可以最后寫*,但是不建議鹿寻。
  • C:package,import,class有沒有順序關(guān)系(面試題)
  • D:案例演示
    • 當(dāng)前目錄 Student.java Test.java
      Student: package com.briup.student;
      Test: package com.briup.test; Test中實(shí)例化Student對(duì)象渐尿;
      編譯:
      javac -d . Student.java
      javac -d . Test.java
      java com.briup.test.Test

      javac -d bin Student.java
      javac -d bin Test.java
      cd bin
      java com.briup.test.Test

      javac -d bin Student.java
      javac -d . Test.java
      java -cp .;bin com.briup.test.Test

10.06_面向?qū)ο?四種權(quán)限修飾符的測(cè)試)(掌握)

  • A:案例演示
    • 四種權(quán)限修飾符
  • B:結(jié)論
  •               本類   同一個(gè)包下  不同包下(子類)    不同包下(無關(guān)類)
      private     Y       
      默認(rèn)          Y       Y
      protected   Y       Y       Y
      public      Y       Y       Y               Y
    

10.07_面向?qū)ο?類及其組成所使用的常見修飾符)(掌握)

  • A:修飾符:

    • 權(quán)限修飾符:private,默認(rèn)的捕犬,protected跷坝,public
    • 狀態(tài)修飾符:static,final
    • 抽象修飾符:abstract
  • B:類:

    • 權(quán)限修飾符:默認(rèn)修飾符碉碉,public

    • 狀態(tài)修飾符:final

    • 抽象修飾符:abstract

    • 用的最多的就是:public

  • C:成員變量:

    • 權(quán)限修飾符:private柴钻,默認(rèn)的,protected垢粮,public

    • 狀態(tài)修飾符:static贴届,final

    • 用的最多的就是:private

  • D:構(gòu)造方法:

    • 權(quán)限修飾符:private,默認(rèn)的蜡吧,protected粱腻,public

    • 用的最多的就是:public

  • E:成員方法:

    • 權(quán)限修飾符:private,默認(rèn)的斩跌,protected绍些,public

    • 狀態(tài)修飾符:static,final

    • 抽象修飾符:abstract

    • 用的最多的就是:public

  • F:除此以外的組合規(guī)則:

    • 成員變量:public static final
    • 成員方法:
      • public static
      • public abstract
      • public final

10.08_面向?qū)ο?內(nèi)部類概述和訪問特點(diǎn))(了解)

  • A:內(nèi)部類概述
    • 成員內(nèi)部類
    • 靜態(tài)內(nèi)部類
    • 局部?jī)?nèi)部類
    • 匿名內(nèi)部類

10.08_成員內(nèi)部類

  • A:成員內(nèi)部類訪問特點(diǎn)
    • a:內(nèi)部類可以直接訪問外部類的成員耀鸦,包括【私有】柬批。此時(shí)可以把內(nèi)部類看成外部類的一個(gè)成員。
    • b:外部類可以訪問內(nèi)部類的成員【包括私有】袖订,但必須創(chuàng)建內(nèi)部類對(duì)象氮帐。
    • 外部類名.內(nèi)部類名 對(duì)象名 = 外部類對(duì)象.內(nèi)部類對(duì)象;
    • Outer.Inner inn = new Outer().new Inner();
  • B:案例演示
  •   class Outer {
          private int num = 10;
          String name = "test";
    
          class Inner {
              private int i_num = 5;
              private int num = 20;
    
              public void show() {
                  System.out.println("in Inner,i_num: " + i_num + ",Outer.num: " + num);
              }
              
              public void show2() {
                  int num = 30;
                  System.out.println(num);        //num
                  System.out.println(this.num);   //this.num
                  System.out.println(Outer.this.num); //Outer.this.num
              }
          }
    
          public void disp() {
              System.out.println("in Outer,num: " + num);
              Inner inn = new Inner();
              inn.i_num = 20;
              inn.show();
          }
      }
    
      class Demo1_Inner {
          public static void main(String[] args) {
              Outer.Inner inn = new Outer().new Inner();
              inn.show();
      
              new Outer().disp();
          }
      }
    

10.09_面向?qū)ο?成員內(nèi)部類私有使用)(了解)

  • private 修飾成員內(nèi)部類,可以將內(nèi)部類 理解成一個(gè)私有成員
  • 可以在外部類其他方法中去使用成員私有內(nèi)部類

10.10_面向?qū)ο?靜態(tài)成員內(nèi)部類)(了解)

  • static 看成靜態(tài)成員
  • 成員內(nèi)部類被靜態(tài)修飾后的訪問方式是:
    • 外部類.內(nèi)部類 對(duì)象名 = new 外部類.內(nèi)部類(...);
  • 注意 靜態(tài)只能訪問靜態(tài)
    • static內(nèi)部類里面所有方法 都可以看成 static的
    • stataic內(nèi)部類中 只能訪問外部類中static成員[屬性洛姑、方法]

10.11_面向?qū)ο?成員內(nèi)部類的面試題)(掌握)

  • A:面試題
  •   要求:使用已知的變量上沐,在控制臺(tái)輸出30,20楞艾,10参咙。
      
      class Outer {
          public int num = 10;
          class Inner {
              public int num = 20;
    
              public void show() {
                  int num = 30;
                  System.out.println(?);  //num
                  System.out.println(??); //this.num
                  System.out.println(???);//Outer.this.num
              }
          }
      }
      class InnerClassTest {
          public static void main(String[] args) {
              Outer.Inner oi = new Outer().new Inner();
              oi.show();
          }   
      }
    
      //Outer.this.num;在外部類下面的成員
    

10.12_面向?qū)ο?局部?jī)?nèi)部類訪問局部變量的問題)(掌握)

  • 局部?jī)?nèi)部類就是在方法內(nèi)部定義的類
  • 其只能在方法內(nèi)部實(shí)例化對(duì)象龄广,然后調(diào)用其方法實(shí)現(xiàn)功能
  • A:案例演示
    • 局部?jī)?nèi)部類訪問局部變量必須用final修飾

    • 局部?jī)?nèi)部類在訪問他所在方法中的局部變量必須用final修飾,為什么?
      因?yàn)楫?dāng)調(diào)用這個(gè)方法時(shí),局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個(gè)局部變量也會(huì)消失,那么如果局部?jī)?nèi)部類對(duì)象還沒有馬上消失想用這個(gè)局部變量,就沒有了,如果用final修飾會(huì)在類加載的時(shí)候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用【延遲生命周期】

      但是jdk1.8取消了這個(gè)事情【不加final也可以】,所以我認(rèn)為這是個(gè)bug

10.13_面向?qū)ο?匿名內(nèi)部類的格式和理解)

  • A:匿名內(nèi)部類
    • 就是內(nèi)部類的簡(jiǎn)化寫法。
  • B:前提:存在一個(gè)類或者接口
    • 這里的類可以是具體類也可以是抽象類蕴侧。
  • C:格式:
  •   new 類名或者接口名() {
          重寫方法;
      }
      獲取一個(gè)匿名對(duì)象;
    
  • D:本質(zhì)是什么呢?
    • 是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象择同。
  • E:案例演示
    • 按照要求來一個(gè)匿名內(nèi)部類
  •   interface Inter {
          void show(); //public abstract
      }
    
      class Outer {
          private int num = 10;
      
          class Inner implements Inter {
              public void show() {
                  System.out.println("show");
              }
          }
      
          public void method() {
              //普通方式調(diào)用
              Inter inn1 = new Inner();
              inn1.show();
              
              //匿名內(nèi)部類方式調(diào)用
              Inter inn2 = new Inter() {
                  public void show() {
                      System.out.println("noname inner class show");
                  }
              };
              inn2.show();
          }
      }
    

10.14_面向?qū)ο?匿名內(nèi)部類重寫多個(gè)方法調(diào)用)

  • 必須重寫所有方法
  • 案例演示
    • 匿名內(nèi)部類的方法調(diào)用

10.15_面向?qū)ο?匿名內(nèi)部類在開發(fā)中的應(yīng)用)

  • A:代碼如下
  •   //這里寫抽象類,接口都行
      abstract class Person {
          public abstract void show();
      }
    
      class PersonDemo {
          public void method(Person p) {
              p.show();
          }
      }
    
      class PersonTest {
          public static void main(String[] args) {
              //如何調(diào)用PersonDemo中的method方法呢?
              PersonDemo pd = new PersonDemo ();
          }
      }
    

10.16_面向?qū)ο?匿名內(nèi)部類的面試題)

  • A:面試題
  •   按照要求净宵,補(bǔ)齊代碼
      interface Inter { 
          void show(); 
      }
    
      class Outer { 
          //補(bǔ)齊代碼 
          public static Inter method() {
              return new Inter() {
                  public void show() {
                      System.out.println("HelloWorld");
                  }
              };
          } 
      }
    
      class OuterDemo {
          public static void main(String[] args) {
                Outer.method().show();
            }
      }
      要求在控制臺(tái)輸出”HelloWorld”
    

11.01_Java開發(fā)工具(常見開發(fā)工具介紹)(了解)

  • A:操作系統(tǒng)自帶的記事本軟件
  • B:高級(jí)記事本軟件
  • C:集成開發(fā)環(huán)境 IDE
    • (Integrated Development Environment)
  • D:Eclipse和MyEclipse的區(qū)別
    • a:Eclipse是一種可擴(kuò)展的開放源代碼的IDE敲才。
    • b:Eclipse的特點(diǎn)描述
      • 免費(fèi)
      • 純Java語言編寫
      • 免安裝
      • 擴(kuò)展性強(qiáng)
    • c:MyEclipse
      • 在Eclipse基礎(chǔ)上追加的功能性插件,對(duì)插件收費(fèi)
      • 在WEB開發(fā)中提供強(qiáng)大的系統(tǒng)架構(gòu)平臺(tái)
  • E:下載 http://eclipse.org/
    • org是非盈利團(tuán)體
  • F:軟件分類
    • 綠色版 解壓就可以使用(Eclipse)
    • 安裝版 雙擊運(yùn)行,一路next即可(JDK)
  • G:卸載
    • 綠色版 直接刪除文件夾即可
    • 安裝版 專業(yè)卸載軟件或者控制面板添加刪除程序

11.02_Java開發(fā)工具(Eclipse中HelloWorld案例以及漢化)(了解)

  • A:選擇工作空間
    • 工作空間 其實(shí)就是我們寫的源代碼所在的目錄
  • B:用Eclipse來完成一個(gè)HelloWorld案例
    • 代碼以項(xiàng)目為基本單位
    • 創(chuàng)建項(xiàng)目
    • 創(chuàng)建包
    • 創(chuàng)建類
    • 編寫代碼
  • C:編譯和運(yùn)行
  • D:Eclipse的漢化
    • 從Eclipse3.5開始择葡,安裝目錄下就多了一個(gè)dropins目錄,只要將插件解壓后放到到該目錄即可紧武。
    • 同理,這種方式卸載插件也是特別的方便敏储,推薦這種方式
  • E:語法檢查提示
    • 紅色波浪線
      • 必須處理,否則編譯通不過
    • 黃色波浪線
      • 可以不搭理他

11.03_Java開發(fā)工具(Eclipse的視窗和視圖概述)(了解)

  • A:視窗 每一個(gè)基本的窗體被稱為視窗
    • PackageExplorer 包資源管理器阻星,顯示項(xiàng)目結(jié)構(gòu),包虹曙,類迫横,及資源
    • Outline 大綱視窗,顯示類的結(jié)構(gòu)酝碳,方便查找矾踱,識(shí)別,修改
    • Console 程序運(yùn)行的結(jié)果在該窗口顯示
    • Hierarchy 顯示Java繼承層次結(jié)構(gòu)疏哗,選中類后按F4顯示
  • B:視圖 是由某些視窗的組合而成的
    • Java視圖
    • JavaEE視圖
    • Debug視圖

11.04_Java開發(fā)工具(Eclipse工作空間的基本配置)(掌握)

  • A:程序的編譯和運(yùn)行的環(huán)境配置(一般不改)
    • window -- Preferences -- Java
    • 編譯環(huán)境:Compiler 默認(rèn)選中的就是最高版本呛讲。
    • 運(yùn)行環(huán)境:Installed JREs 默認(rèn)會(huì)找你安裝的那個(gè)JDK。建議配置了Java的環(huán)境變量返奉。
    • 問題:
      • 低編譯贝搁,高運(yùn)行⊙科可以雷逆。
      • 高編譯,低運(yùn)行污尉。不可以膀哲。
      • 建議,編譯和運(yùn)行的版本一致被碗。
  • B:如何去掉默認(rèn)注釋?
    • window -- Preferences -- Java -- Code Style -- Code Templates
    • 選擇你不想要的內(nèi)容某宪,通過右邊Edit編輯。
    • 注意:請(qǐng)只刪除注釋部分锐朴,不是注釋部分的不要?jiǎng)h除兴喂。
  • C:行號(hào)的顯示和隱藏
    • 顯示:在代碼區(qū)域的最左邊的空白區(qū)域,右鍵 -- Show Line Numbers即可。
    • 隱藏:把上面的動(dòng)作再做一次衣迷。
  • D:字體大小及顏色
    • a:Java代碼區(qū)域的字體大小和顏色:
      • window -- Preferences -- General -- Appearance -- Colors And Fonts --Java修改 -- Java Edit Text Font
    • b:控制臺(tái)
      • window -- Preferences -- General -- Appearance -- Colors And Fonts -- Debug -- Console font
    • c:其他文件
      • window -- Preferences -- General -- Appearance -- Colors And Fonts -- Basic -- Text Font
  • E:窗體給弄亂了畏鼓,怎么辦?
    • window -- Perspective -- Reset Perspective
  • F:輸出控制臺(tái)找不到了滴肿,怎么辦?
    • Window--Show View—Console
  • G:取消懸浮提示
    • window -- Preferences -- Java--Editor--Hovers 到右邊將Combined Hover勾去掉佃迄,
    • 這樣代碼的懸浮框就不會(huì)自動(dòng)出現(xiàn)了呵俏。如果想看提示滔灶,將光標(biāo)懸浮在代碼上,按F2即可动猬。

11.05_Java開發(fā)工具(Eclipse中內(nèi)容輔助鍵的使用)(掌握)

  • A:Alt+/ 起提示作用
  • B:main+alt+/,syso+alt+/,給出其他提示
  • C:補(bǔ)充輸出語句,選中需要輸出的部分,alt+/選擇最后一項(xiàng)即可
  • C:定義自己的alt + /
    • windows--perference-Java-Editor-Templates--New

11.06_Java開發(fā)工具(Eclipse中快捷鍵的使用)(掌握)

  • A:新建 ctrl + n
  • B:導(dǎo)入包 ctrl+shift+o 整理包
  • C:注釋 ctrl+/,ctrl+shift+/,ctrl+shift+\
  • //桌面 右鍵 圖形選項(xiàng) -- 快捷鍵 -- 禁用
  • D:代碼上下移動(dòng) 選中代碼alt+上/下箭頭
  • E:查看源碼 選中類名(F3或者Ctrl+鼠標(biāo)點(diǎn)擊)
  • F:查找具體的類 ctrl + shift + t
  • G:在具體類java文件中查找具體方法 ctrl + o
  • H:給建議 ctrl+1,根據(jù)右邊生成左邊的數(shù)據(jù)類型,生成方法
  • I:刪除一整行代碼 ctrl + d
  • J:抽取方法alt + shift + m
  • K:改名alt + shift + r

11.07_Java開發(fā)工具(Eclipse中如何提高開發(fā)效率)(掌握)

  • alt + shift + s
  • A:自動(dòng)生成構(gòu)造方法
  • B:自動(dòng)生成get/set方法

11.08_Java開發(fā)工具(Eclipse中一個(gè)標(biāo)準(zhǔn)學(xué)生類及其測(cè)試)(掌握)

  • A:案例演示
    • 用Eclipse實(shí)現(xiàn)標(biāo)準(zhǔn)學(xué)生類及其測(cè)試

11.09_Java開發(fā)工具(Eclipse中接口抽象類具體類代碼體現(xiàn))(掌握)

  • A:案例演示
    • 用Eclipse實(shí)現(xiàn)接口抽象類具體類代碼
    • 注意彼水,將抽象類放在一個(gè)項(xiàng)目中,測(cè)試類放在另一個(gè)項(xiàng)目中

11.10_Java開發(fā)工具(Eclipse中如何生成jar包并導(dǎo)入到項(xiàng)目中)(了解)

  • A:jar是什么?
    • jar是多個(gè)class文件的壓縮包。
  • B:jar有什么用?
    • 用別人寫好的東西
  • C:打jar包
    • 選中項(xiàng)目--右鍵--Export--Java--Jar--自己指定一個(gè)路徑和一個(gè)名稱--Finish
  • D:導(dǎo)入jar包
    • 復(fù)制到項(xiàng)目路徑下并添加至構(gòu)建路徑。

11.11_Java開發(fā)工具(Eclipse中如何刪除項(xiàng)目和導(dǎo)入項(xiàng)目)(掌握)

  • A:刪除項(xiàng)目
    • 選中項(xiàng)目 – 右鍵 – 刪除
      • 從項(xiàng)目區(qū)域中刪除
      • 從硬盤上刪除
  • B:導(dǎo)入項(xiàng)目
    • 在項(xiàng)目區(qū)域右鍵找到import
    • 找到General,展開璃哟,并找到
    • Existing Projects into Workspace
    • 點(diǎn)擊next,然后選擇你要導(dǎo)入的項(xiàng)目
    • 注意:這里選擇的是項(xiàng)目名稱

11.12_Java開發(fā)工具(Eclipse中斷點(diǎn)調(diào)試的基本使用)(了解)

  • A:Debug的作用
    • 調(diào)試程序
    • 查看程序執(zhí)行流程
  • B:如何查看程序執(zhí)行流程
    • 什么是斷點(diǎn):

      • 就是一個(gè)標(biāo)記,從哪里開始。
    • 如何設(shè)置斷點(diǎn):

      • 你想看哪里的程序,你就在那個(gè)有效程序的左邊雙擊即可。
    • 在哪里設(shè)置斷點(diǎn):

      • 哪里不會(huì)點(diǎn)哪里。
      • 目前:我們就在每個(gè)方法的第一條有效語句上都加。
    • 如何運(yùn)行設(shè)置斷點(diǎn)后的程序:

      • 右鍵 -- Debug as -- Java Application
    • 看哪些地方:

      • Debug:斷點(diǎn)測(cè)試的地方
        • 在這個(gè)地方,記住F6,或者點(diǎn)擊也可以。一次看一行的執(zhí)行過程。
      • Variables:查看程序的變量變化
      • ForDemo:被查看的源文件
      • Console:控制臺(tái)
    • 如何去斷點(diǎn):

      • a:再次雙擊即可
      • b:找到Debug視圖,Variables界面,找到Breakpoints碍扔,并點(diǎn)擊溶耘,然后看到所有的斷點(diǎn)卓鹿,最后點(diǎn)擊那個(gè)雙叉聚蝶。

11.13_Java開發(fā)工具(Eclipse查看Java中參數(shù)傳遞問題)(了解)

  • A:斷點(diǎn)演示
    • 斷點(diǎn)查看Java中參數(shù)傳遞問題

11.14_常見對(duì)象(API概述)(了解)

  • A:API(Application Programming Interface)
    • 應(yīng)用程序編程接口
  • B:Java API
    • 就是Java提供給我們使用的類桩卵,這些類將底層的實(shí)現(xiàn)封裝了起來,
    • 我們不需要關(guān)心這些類是如何實(shí)現(xiàn)的,只需要學(xué)習(xí)這些類如何使用。

11.15_常見對(duì)象(Object類的概述)(了解)

  • A:Object類概述
    • 類層次結(jié)構(gòu)的根類
    • 所有類都直接或者間接的繼承自該類
  • B:構(gòu)造方法
    • public Object()
    • 回想面向?qū)ο笾袨槭裁凑f:
    • 子類的構(gòu)造方法默認(rèn)訪問的是父類的無參構(gòu)造方法

11.16_常見對(duì)象(Object類的hashCode()方法)(了解)

  • A:案例演示
    • public int hashCode()
    • a:返回該對(duì)象的哈希碼值阔拳。默認(rèn)情況下土浸,該方法會(huì)根據(jù)對(duì)象的地址來計(jì)算。
    • b:不同對(duì)象的,hashCode()一般來說不會(huì)相同。但是,同一個(gè)對(duì)象的hashCode()值肯定相同。

11.17_常見對(duì)象(Object類的getClass()方法)(在反射的時(shí)候掌握)

  • A:案例演示
    • public final Class getClass()
    • a:返回此 Object 的運(yùn)行時(shí)類。
    • b:可以通過Class類中的一個(gè)方法,獲取對(duì)象的真實(shí)類的全名稱。
      • public String getName()

11.18_常見對(duì)象(Object類的toString()方法)(掌握)

  • A:案例演示
    • public String toString()
    • a:返回該對(duì)象的字符串表示。
  •   public Stirng toString() {
          return name + "," + age;
      }
    
    • b:它的值等于:
      • getClass().getName() + "@" + Integer.toHexString(hashCode())
    • c:由于默認(rèn)情況下的數(shù)據(jù)對(duì)我們來說沒有意義魄藕,一般建議重寫該方法嫩与。
  • B:最終版
    • 自動(dòng)生成

11.19_常見對(duì)象(Object類的equals()方法)(掌握)

  • A:案例演示
    • a:指示其他某個(gè)對(duì)象是否與此對(duì)象“相等”埃篓。
    • b:默認(rèn)情況下比較的是對(duì)象的引用是否相同。
    • c:由于比較對(duì)象的引用沒有意義,一般建議重寫該方法钱雷。
  • B: equals在Object中的源代碼
  • public boolean equals(Object obj) {
    return (this == obj);
    }
    比較兩個(gè)對(duì)象 所對(duì)應(yīng) 內(nèi)存地址值套蒂。

11.20_常見對(duì)象(==號(hào)和equals方法的區(qū)別)(掌握)

  • ==是一個(gè)比較運(yùn)算符號(hào),既可以比較基本數(shù)據(jù)類型,也可以比較引用數(shù)據(jù)類型,基本數(shù)據(jù)類型比較的是值,引用數(shù)據(jù)類型比較的是地址值
  • equals方法是一個(gè)方法,只能比較引用數(shù)據(jù)類型,所有的對(duì)象都會(huì)繼承Object類中的方法,如果沒有重寫Object類中的equals方法,equals方法和==號(hào)比較引用數(shù)據(jù)類型無區(qū)別,重寫后的equals方法比較的是對(duì)象中的屬性

11.21_day11總結(jié)

  • 把今天的知識(shí)點(diǎn)總結(jié)一遍婴洼。

12.01_常見對(duì)象(Scanner的概述和方法介紹)(掌握)

  • A:Scanner的概述

  • B:Scanner的構(gòu)造方法原理

    • Scanner(InputStream source)
    • System類下有一個(gè)靜態(tài)的字段:
      • public static final InputStream in; 標(biāo)準(zhǔn)的輸入流粉捻,對(duì)應(yīng)著鍵盤錄入杏头。
  • C:一般方法

    • hasNextXxx() 判斷是否還有下一個(gè)輸入項(xiàng),其中Xxx可以是Int,Double等崭添。如果需要判斷是否包含下一個(gè)字符串,則可以省略Xxx
    • nextXxx() 獲取下一個(gè)輸入項(xiàng)。Xxx的含義和上個(gè)方法中的Xxx相同,默認(rèn)情況下帅容,Scanner使用空格,回車等作為分隔符

12.02_常見對(duì)象(Scanner獲取數(shù)據(jù)出現(xiàn)的小問題及解決方案)(掌握)

  • A:兩個(gè)常用的方法:
    • public int nextInt():獲取一個(gè)int類型的值
    • public String nextLine():獲取一個(gè)String類型的值
  • B:案例演示
    • a:先演示獲取多個(gè)int值,多個(gè)String值的情況
    • b:再演示先獲取int值声畏,然后獲取String值出現(xiàn)問題
    • c:問題解決方案
      • 第一種:先獲取一個(gè)數(shù)值后,在創(chuàng)建一個(gè)新的鍵盤錄入對(duì)象獲取字符串。
      • 第二種:把所有的數(shù)據(jù)都先按照字符串獲取,然后要什么,你就對(duì)應(yīng)的轉(zhuǎn)換為什么。(后面講)

12.03_常見對(duì)象(String類的概述)(掌握)

  • A:String類的概述
    • 通過JDK提供的API挟纱,查看String類的說明

    • 可以看到這樣的兩句話。

      • a:字符串字面值"abc"也可以看成是一個(gè)字符串對(duì)象煎饼。 //"abc".equals(); OK
      • b:字符串是常量,一旦被賦值积蔚,就不能被改變漱贱。

12.04_常見對(duì)象(String類的構(gòu)造方法)(掌握)

  • A:常見構(gòu)造方法
    • public String():空構(gòu)造
    • public String(byte[] bytes):把字節(jié)數(shù)組轉(zhuǎn)成字符串
    • public String(byte[] bytes,int index,int length):把字節(jié)數(shù)組的一部分轉(zhuǎn)成字符串
    • public String(char[] value):把字符數(shù)組轉(zhuǎn)成字符串
    • public String(char[] value,int index,int count):把字符數(shù)組的一部分轉(zhuǎn)成字符串
    • public String(String original):把字符串常量值轉(zhuǎn)成字符串
  • B:案例演示
    • 演示String類的常見構(gòu)造方法

12.05_常見對(duì)象(String類的常見面試題)(掌握)

  • 1.判斷定義為String類型的s1和s2是否相等
    • String s1 = "abc";
    • String s2 = "abc";
    • System.out.println(s1 == s2);
    • System.out.println(s1.equals(s2));
  • 2.下面這句話在內(nèi)存中創(chuàng)建了幾個(gè)對(duì)象?
    • String s1 = new String("abc");
  • 3.判斷定義為String類型的s1和s2是否相等
    • String s1 = new String("abc");
    • String s2 = "abc";
    • System.out.println(s1 == s2); ?
    • System.out.println(s1.equals(s2)); ?
  • 4.判斷定義為String類型的s1和s2是否相等
    • String s1 = "a" + "b" + "c";
    • String s2 = "abc";
    • System.out.println(s1 == s2); ?
    • System.out.println(s1.equals(s2)); ?
  • 5.判斷定義為String類型的s1和s2是否相等
    • String s1 = "ab";
    • String s2 = "abc";
    • String s3 = s1 + "c"; //new StringBuffer --> toString
    • System.out.println(s3 == s2);
    • System.out.println(s3.equals(s2)); ?

12.06_常見對(duì)象(String類的判斷功能)(掌握)

  • A:String類的判斷功能
    • boolean equals(Object obj):比較字符串的內(nèi)容是否相同,區(qū)分大小寫
    • boolean equalsIgnoreCase(String str):比較字符串的內(nèi)容是否相同,忽略大小寫
    • boolean contains(String str):判斷大字符串中是否包含小字符串
    • boolean startsWith(String str):判斷字符串是否以某個(gè)指定的字符串開頭
    • boolean endsWith(String str):判斷字符串是否以某個(gè)指定的字符串結(jié)尾
    • boolean isEmpty():判斷字符串是否為空擎值。

12.07_常見對(duì)象(模擬用戶登錄)(掌握)

  • A:作業(yè) LoginTest.java
    • 需求:模擬登錄,給三次機(jī)會(huì),并提示還有幾次进每。
    • 用戶名和密碼都是admin

12.08_常見對(duì)象(String類的獲取功能)(掌握)

  • A:String類的獲取功能
    • int length():獲取字符串的長(zhǎng)度肉瓦。
    • char charAt(int index):獲取指定索引位置的字符
    • int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引。
    • int indexOf(String str):返回指定字符串在此字符串中第一次出現(xiàn)處的索引挨厚。
    • int indexOf(int ch,int fromIndex):返回指定字符在此字符串中從指定位置后第一次出現(xiàn)處的索引巢价。
    • int indexOf(String str,int fromIndex):返回指定字符串在此字符串中從指定位置后第一次出現(xiàn)處的索引。
    • lastIndexOf
    • String substring(int start):從指定位置開始截取字符串,默認(rèn)到末尾漏麦。
    • String substring(int start,int end):從指定位置開始到指定位置結(jié)束截取字符串。[start,end)

12.09_常見對(duì)象(字符串的遍歷)(掌握)

  • A:案例演示
    • 需求:遍歷字符串

12.10_常見對(duì)象(統(tǒng)計(jì)不同類型字符個(gè)數(shù))(掌握)

  • A:作業(yè) CountTest.java
    • 需求:統(tǒng)計(jì)一個(gè)字符串中大寫字母字符,小寫字母字符讶隐,數(shù)字字符出現(xiàn)的次數(shù),其他字符出現(xiàn)的次數(shù)炉峰。
    • ABCDEabcd123456!@#$%^ ch >= 'a' && ch <= 'z'

12.11_常見對(duì)象(String類的轉(zhuǎn)換功能)(掌握)

  • A:String的轉(zhuǎn)換功能:
    • byte[] getBytes():把字符串轉(zhuǎn)換為字節(jié)數(shù)組疼阔。

    • char[] toCharArray():把字符串轉(zhuǎn)換為字符數(shù)組戒劫。

    • static String valueOf(char[] chs):把字符數(shù)組轉(zhuǎn)成字符串。

    • static String valueOf(int i):把int類型的數(shù)據(jù)轉(zhuǎn)成字符串迅细。

      • 注意:String類的valueOf方法可以把任意類型的數(shù)據(jù)轉(zhuǎn)成字符串。
    • String toLowerCase():把字符串轉(zhuǎn)成小寫淘邻。(了解)

    • String toUpperCase():把字符串轉(zhuǎn)成大寫茵典。

    • String concat(String str):把字符串拼接。

12.12_常見對(duì)象(按要求轉(zhuǎn)換字符)(鏈?zhǔn)骄幊陶莆?

  • A:作業(yè) TransTest.java
    • 需求:把一個(gè)字符串的首字母轉(zhuǎn)成大寫宾舅,其余為小寫敬尺。(只考慮英文大小寫字母字符)

12.13_常見對(duì)象(把數(shù)組轉(zhuǎn)成字符串)

  • A:作業(yè) TransTest2.java
    • 需求:把數(shù)組中的數(shù)據(jù)按照指定個(gè)格式拼接成一個(gè)字符串
      • 舉例:
        • int[] arr = {1,2,4,3};
      • 輸出結(jié)果:
        • "[1, 2, 4, 3]"

12.14_常見對(duì)象(String類的其他功能)

  • A:String的替換功能及案例演示
    • String replace(char old,char new)
    • String replace(String old,String new)
  • B:String的去除字符串兩空格及案例演示
    • String trim() " zhang san " --> "zhang san"
  • C:String的按字典順序比較兩個(gè)字符串及案例演示
    • int compareTo(String str)(暫時(shí)不用掌握)
    • int compareToIgnoreCase(String str)(了解)

12.15_常見對(duì)象(字符串反轉(zhuǎn))

  • A:作業(yè) ReversalTest.java
    • 需求:把字符串反轉(zhuǎn)
      • 舉例:鍵盤錄入"abc"
      • 輸出結(jié)果:"cba"
      • public static String reversal(String str) {
      • //str = "hello"; --> char[] s = "";
      • //對(duì)字符數(shù)組進(jìn)行反轉(zhuǎn)
      • //char[] --> String s;
      • retrun s;
      • }

12.16_常見對(duì)象(在大串中查找小串出現(xiàn)的次數(shù)思路圖解)

  • A:畫圖演示
    • 需求:統(tǒng)計(jì)大串中小串出現(xiàn)的次數(shù)
    • public static int count(String max,String min)
    • 這里的大串和小串可以自己根據(jù)情況給出
    • String max = "helloworldnihaobuhaohello";
    •           max = "buhaohello";   substring();
      
    •           max = "hello";
      
    • String min = "hao";
    • max.indexOf(min) ==> 子串第一次出現(xiàn)的index值
    • int index = max.indexOf(min);
    • //while((index = max.indexOf(min)) != -1) {
    • while(index != -1) {
    • count++;
    • //截取子串 12 + 3 15
    • max = max.substring(index+min.length());
    • index = max.indexOf(min);
    • }
    • syso(count);

12.17_常見對(duì)象(在大串中查找小串出現(xiàn)的次數(shù)代碼實(shí)現(xiàn))

  • A:作業(yè) CountSubTest.java
    • 統(tǒng)計(jì)大串中小串出現(xiàn)的次數(shù)
    • indexOf()幫助實(shí)現(xiàn)

13.01_常見對(duì)象(StringBuffer類的概述)

  • A:StringBuffer類概述 [StringBulider]
    • 通過JDK提供的API,查看StringBuffer類的說明
    • 線程安全的可變字符序列
  • B:StringBuffer和String的區(qū)別
    • String是一個(gè)不可變的字符序列
    • StringBuffer是一個(gè)可變的字符序列
    • 多線程訪問的時(shí)候 銀行 主卡 副卡 同一個(gè)時(shí)刻去各自存錢1000 0+1000=1000 1000+1000=2000

13.02_常見對(duì)象(StringBuffer類的構(gòu)造方法)

  • A:StringBuffer的構(gòu)造方法:
    • public StringBuffer():無參構(gòu)造方法
    • public StringBuffer(int capacity):指定容量的字符串緩沖區(qū)對(duì)象
    • public StringBuffer(String str):指定字符串內(nèi)容的字符串緩沖區(qū)對(duì)象
  • B:StringBuffer的方法:
    • public int capacity():返回當(dāng)前容量贴浙。 理論值(不掌握)
    • public int length():返回長(zhǎng)度(字符數(shù))。 實(shí)際值
  • C:案例演示
    • 構(gòu)造方法和長(zhǎng)度方法的使用

13.03_常見對(duì)象(StringBuffer的添加功能)

  • A:StringBuffer的添加功能
    • public StringBuffer append(String str):
      • 可以把任意類型數(shù)據(jù)添加到字符串緩沖區(qū)里面,并返回字符串緩沖區(qū)本身
    • public StringBuffer insert(int offset,String str):
      • 在指定位置把任意類型的數(shù)據(jù)插入到字符串緩沖區(qū)里面,并返回字符串緩沖區(qū)本身

13.04_常見對(duì)象(StringBuffer的刪除功能)

  • A:StringBuffer的刪除功能
    • public StringBuffer deleteCharAt(int index):
      • 刪除指定位置的字符署恍,并返回本身
    • public StringBuffer delete(int start,int end):
      • 刪除從指定位置開始指定位置結(jié)束的內(nèi)容崎溃,并返回本身

13.05_常見對(duì)象(StringBuffer的替換和反轉(zhuǎn)功能)

  • A:StringBuffer的替換功能
    • public StringBuffer replace(int start,int end,String str):
      • 從start開始到end用str替換
  • B:StringBuffer的反轉(zhuǎn)功能
    • public StringBuffer reverse():
      • 字符串反轉(zhuǎn)

13.06_常見對(duì)象(StringBuffer的截取功能及注意事項(xiàng))

  • A:StringBuffer的截取功能
    • public String substring(int start):
      • 從指定位置截取到末尾
    • public String substring(int start,int end):
      • 截取從指定位置開始到結(jié)束位置,包括開始位置盯质,不包括結(jié)束位置
  • B:注意事項(xiàng)
    • 注意:返回值類型不再是StringBuffer本身

13.07_常見對(duì)象(StringBuffer和String的相互轉(zhuǎn)換)

  • A:String -- StringBuffer
    • a:通過構(gòu)造方法
    • b:通過append()方法
  • B:StringBuffer -- String
    • a:通過構(gòu)造方法
    • b:通過toString()方法
    • c:通過subString(0,length);

13.08_常見對(duì)象(把數(shù)組轉(zhuǎn)成字符串)

  • A:作業(yè) TransArrToString.java
    • 需求:把數(shù)組中的數(shù)據(jù)按照指定個(gè)格式拼接成一個(gè)字符串
    •   舉例:
            int[] arr = {1,2,3};    
        輸出結(jié)果:
            "[1, 2, 3]"
            
        用StringBuffer的功能實(shí)現(xiàn)
      

13.09_常見對(duì)象(字符串反轉(zhuǎn))

  • A:案例演示
  •   需求:把字符串反轉(zhuǎn)
          舉例:鍵盤錄入"abc"        
          輸出結(jié)果:"cba"
          
      用StringBuffer的功能實(shí)現(xiàn)  
    

13.10_常見對(duì)象(StringBuffer和StringBuilder的區(qū)別)

  • A:StringBuilder的概述
    • 通過查看API了解一下StringBuilder類
  • B:面試題
    • StringBuffer和StringBuilder的區(qū)別

      • StringBuffer是jdk1.0版本的,是線程安全的,效率低
      • StringBuilder是jdk1.5版本的,是線程不安全的,效率高
    • String和StringBuffer,StringBuilder的區(qū)別

      • String是一個(gè)不可變的字符序列
      • StringBuffer,StringBuilder是可變的字符序列

13.11_常見對(duì)象(String和StringBuffer分別作為參數(shù)傳遞)

  • A:形式參數(shù)問題
    • String作為參數(shù)傳遞 傳值
    • StringBuffer作為參數(shù)傳遞 傳地址
  • B:案例演示
    • String和StringBuffer分別作為參數(shù)傳遞問題

13.14_常見對(duì)象(數(shù)組高級(jí)選擇排序原理圖解)

  • A:畫圖演示
    • 需求:
      • 數(shù)組元素:{24, 69, 80, 57, 13}

      • 請(qǐng)對(duì)數(shù)組元素進(jìn)行排序袁串。

      • 選擇排序

        • 從0索引開始概而,依次和后面元素比較,小的往前放囱修,第一次完畢赎瑰,最小值出現(xiàn)在了最小索引處

13.15_常見對(duì)象(數(shù)組高級(jí)選擇排序代碼實(shí)現(xiàn))

  • A:案例演示
    • 數(shù)組高級(jí)選擇排序代碼

13.16_常見對(duì)象(數(shù)組高級(jí)二分查找原理圖解)

  • A:畫圖演示
    • 二分查找
    • 前提:數(shù)組元素有序

13.17_常見對(duì)象(數(shù)組高級(jí)二分查找代碼實(shí)現(xiàn)及注意事項(xiàng))

  • A:案例演示
    • 數(shù)組高級(jí)二分查找代碼
  • B:注意事項(xiàng)
    • 如果數(shù)組無序,就不能使用二分查找破镰。
      • 因?yàn)槿绻闩判蛄瞬吐悄闩判虻臅r(shí)候已經(jīng)改變了我最原始的元素索引。

13.18_常見對(duì)象(Arrays類的概述和方法使用)

  • A:Arrays類概述
    • 針對(duì)數(shù)組進(jìn)行操作的工具類鲜漩。
    • 提供了排序源譬,查找等功能。
  • B:成員方法
    • public static String toString(int[] a)
    • public static void sort(int[] a)孕似;底層快速排序
    • public static int binarySearch(int[] a,int key);如果沒有踩娘,返回負(fù)的插入點(diǎn)再減一;

13.19_常見對(duì)象(基本類型包裝類的概述)

  • A:為什么會(huì)有基本類型包裝類
    • 將基本數(shù)據(jù)類型封裝成對(duì)象的好處在于可以在對(duì)象中定義更多的功能方法操作該數(shù)據(jù)喉祭。
  • B:常用操作
    • 常用的操作之一:用于基本數(shù)據(jù)類型與字符串之間的轉(zhuǎn)換养渴。
  • C:基本類型和包裝類的對(duì)應(yīng)
  •   byte            Byte
      short           Short
      int             Integer         //*
      long            Long
      float           Float
      double          Double
      char            Character       //*
      boolean         Boolean
    

13.20_常見對(duì)象(Integer類的概述和構(gòu)造方法)

  • A:Integer類概述
    • 通過JDK提供的API,查看Integer類的說明

    • Integer 類在對(duì)象中包裝了一個(gè)基本類型 int 的值,

    • 該類提供了多個(gè)方法泛烙,能在 int 類型和 String 類型之間互相轉(zhuǎn)換理卑,

    • 還提供了處理 int 類型時(shí)非常有用的其他一些常量和方法

  • B:構(gòu)造方法
    • public Integer(int value)
    • public Integer(String s)
  • C:案例演示
    • 使用構(gòu)造方法創(chuàng)建對(duì)象

13.21_常見對(duì)象(String和int類型的相互轉(zhuǎn)換)

  • A:int -- String
    • a:和""進(jìn)行拼接
    • b:public static String valueOf(int i)
    • c:int -- Integer -- String(Integer類的toString方法())
    • d:public static String toString(int i)(Integer類的靜態(tài)方法)
  • B:String -- int
    • a:String -- Integer -- int
    • public static int parseInt(String s)

13.22_常見對(duì)象(JDK5的新特性自動(dòng)裝箱和拆箱)

  • A:JDK5的新特性
    • 自動(dòng)裝箱:把基本類型轉(zhuǎn)換為包裝類類型
    • 自動(dòng)拆箱:把包裝類類型轉(zhuǎn)換為基本類型
  • B:案例演示
    • JDK5的新特性自動(dòng)裝箱和拆箱

    • Integer ii = 100;

    • int num = ii + 10;

    • ii += 200;

  • C:注意事項(xiàng)
    • 在使用時(shí),Integer x = null;代碼就會(huì)出現(xiàn)NullPointerException胶惰。
    • 建議先判斷是否為null傻工,然后再使用。

13.23_常見對(duì)象(Integer的面試題)

  • A:Integer的面試題
  • 參考Integer.valueOf()源碼
  •   看程序?qū)懡Y(jié)果
      
      Integer i1 = new Integer(97);
      Integer i2 = new Integer(97);
      System.out.println(i1 == i2);
      System.out.println(i1.equals(i2));
      System.out.println("-----------");
    
      Integer i3 = new Integer(197);
      Integer i4 = new Integer(197);
      System.out.println(i3 == i4);
      System.out.println(i3.equals(i4));
      System.out.println("-----------");
    
      Integer i5 = 97;
      Integer i6 = 97;
      System.out.println(i5 == i6);
      System.out.println(i5.equals(i6));
      System.out.println("-----------");
    
      Integer i7 = 197;
      Integer i8 = 197;
      System.out.println(i7 == i8);
      System.out.println(i7.equals(i8));
    

14.01_常見對(duì)象(Math類概述和方法使用)

  • A:Math類概述
    • Math 類包含用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法孵滞,如初等指數(shù)中捆、對(duì)數(shù)、平方根和三角函數(shù)坊饶。
  • B:成員方法
    • public static int abs(int a) 求絕對(duì)值
    • public static double ceil(double a) 向上取整
    • public static double floor(double a) 向下取整
    • public static int max(int a,int b) min自學(xué)
    • public static double pow(double a,double b) 求a^b
    • public static double random() 獲取隨機(jī)數(shù)
    • public static int round(float a) 參數(shù)為double的自學(xué) 四舍五入
    • public static double sqrt(double a) 開平方

14.02_常見對(duì)象(Random類的概述和方法使用)

  • A:Random類的概述
    • 此類用于產(chǎn)生隨機(jī)數(shù)如果用相同的種子創(chuàng)建兩個(gè) Random 實(shí)例泄伪,
    • 則對(duì)每個(gè)實(shí)例進(jìn)行相同的方法調(diào)用序列,它們將生成并返回相同的數(shù)字序列匿级。
  • B:構(gòu)造方法
    • public Random()
    • public Random(long seed)
  • C:成員方法
    • public int nextInt()
    • public int nextInt(int n)(重點(diǎn)掌握)

14.03_常見對(duì)象(System類的概述和方法使用)

  • A:System類的概述
    • System 類包含一些有用的類字段和方法蟋滴。它不能被實(shí)例化。
  • B:成員方法
    • public static void gc()
    • public static void exit(int status)
    • public static long currentTimeMillis()
    • pubiic static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  • C:案例演示
    • System類的成員方法使用

14.04_常見對(duì)象(Date類的概述和方法使用)(掌握)

  • A:Date類的概述
    • 類 Date 表示特定的瞬間痘绎,精確到毫秒津函。
  • B:構(gòu)造方法
    • public Date()
    • public Date(long date)
  • C:成員方法
    • public long getTime()
    • public void setTime(long time)

14.05_常見對(duì)象(SimpleDateFormat類實(shí)現(xiàn)日期和字符串的相互轉(zhuǎn)換)(掌握)

  • A:DateFormat類的概述
    • DateFormat 是日期/時(shí)間格式化子類的抽象類,它以與語言無關(guān)的方式格式化并解析日期或時(shí)間孤页。是抽象類尔苦,所以使用其子類SimpleDateFormat
  • B:SimpleDateFormat構(gòu)造方法
    • public SimpleDateFormat()
    • public SimpleDateFormat(String pattern)
  • C:成員方法
    • public final String format(Date date)
    • public Date parse(String source)

14.06_常見對(duì)象(你來到這個(gè)世界多少天案例)(掌握)

  • A:案例演示
    • 需求:算一下你來到這個(gè)世界多少天?
    • 當(dāng)前系統(tǒng)時(shí)間 --> ms數(shù) num1
    • 你生日那天"1994.10.21" --> ms數(shù) num2
    • long num = num1 - num2;
    • 天數(shù) = num / 1000 / 60 / 60 / 24;

15.01_集合框架(對(duì)象數(shù)組的概述和使用)

  • A:案例演示

    • 需求:我有5個(gè)學(xué)生,請(qǐng)把這個(gè)5個(gè)學(xué)生的信息存儲(chǔ)到數(shù)組中,并遍歷數(shù)組允坚,獲取得到每一個(gè)學(xué)生信息魂那。
  •   Student[] arr = new Student[5];                 //存儲(chǔ)學(xué)生對(duì)象
      arr[0] = new Student("張三", 23);
      arr[1] = new Student("李四", 24);
      arr[2] = new Student("王五", 25);
      arr[3] = new Student("趙六", 26);
      arr[4] = new Student("馬哥", 20);
      
      for (int i = 0; i < arr.length; i++) {
          System.out.println(arr[i]);
      }
    
  • B:畫圖演示

    • 把學(xué)生數(shù)組的案例畫圖講解
    • 數(shù)組和集合存儲(chǔ)引用數(shù)據(jù)類型,存的都是地址值

15.02_集合框架(集合的由來及集合繼承體系圖)

  • A:集合的由來
    • 數(shù)組長(zhǎng)度是固定,當(dāng)添加的元素超過了數(shù)組的長(zhǎng)度時(shí)需要對(duì)數(shù)組重新定義,太麻煩,java內(nèi)部給我們提供了集合類,能存儲(chǔ)任意對(duì)象,長(zhǎng)度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少.
  • B:數(shù)組和集合的區(qū)別
    • 區(qū)別1 :
      • 數(shù)組既可以存儲(chǔ)基本數(shù)據(jù)類型,又可以存儲(chǔ)引用數(shù)據(jù)類型,基本數(shù)據(jù)類型存儲(chǔ)的是值,引用數(shù)據(jù)類型存儲(chǔ)的是地址值
      • 集合只能存儲(chǔ)引用數(shù)據(jù)類型(對(duì)象),集合中也可以存儲(chǔ)基本數(shù)據(jù)類型,但是在存儲(chǔ)的時(shí)候會(huì)自動(dòng)裝箱變成對(duì)象
    • 區(qū)別2:
      • 數(shù)組長(zhǎng)度是固定的,不能自動(dòng)增長(zhǎng)
      • 集合的長(zhǎng)度的是可變的,可以根據(jù)元素的增加而增長(zhǎng)
  • C:數(shù)組和集合什么時(shí)候用
    • 如果元素個(gè)數(shù)是固定的推薦用數(shù)組
    • 如果元素個(gè)數(shù)不是固定的推薦用集合
  • D:集合繼承體系圖
    • 單列集合 頂層接口Collection
    • 實(shí)現(xiàn)子類 List有序、重復(fù) Set無序稠项、不能重復(fù)
    • ArrayList LinkedList Vector HashSet哈希算法 TreeSet二叉樹算法

15.03_集合框架(Collection集合的基本功能測(cè)試)

  • A:案例演示

  •   基本功能演示
      
      boolean add(E e)
      boolean remove(Object o)
      void clear()
      boolean contains(Object o)
      boolean isEmpty()
      int size()
    
  • B:注意:

  •   collectionXxx.java使用了未經(jīng)檢查或不安全的操作.
      注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:unchecked重新編譯.
      java編譯器認(rèn)為該程序存在安全隱患
      溫馨提示:這不是編譯失敗,所以先不用理會(huì),等學(xué)了泛型你就知道了
    

15.04_集合框架(集合的遍歷之集合轉(zhuǎn)數(shù)組遍歷)

  • A:集合的遍歷
    • 其實(shí)就是依次獲取集合中的每一個(gè)元素涯雅。
  • B:案例演示
    • 把集合轉(zhuǎn)成數(shù)組,可以實(shí)現(xiàn)集合的遍歷
    • toArray()
    •   Collection coll = new ArrayList();
        coll.add(new Student("張三",23));     //Object obj = new Student("張三",23);
        coll.add(new Student("李四",24));
        coll.add(new Student("王五",25));
        coll.add(new Student("趙六",26));
        
        Object[] arr = coll.toArray();              //將集合轉(zhuǎn)換成數(shù)組
        for (int i = 0; i < arr.length; i++) {
            Student s = (Student)arr[i];            //強(qiáng)轉(zhuǎn)成Student
            System.out.println(s.getName() + "," + s.getAge());
        }
      

15.05_集合框架(Collection集合的帶All功能測(cè)試)

  • A:案例演示
  •   帶All的功能演示
      
      boolean addAll(Collection c)
      boolean removeAll(Collection c)
      boolean containsAll(Collection c)
      boolean retainAll(Collection c)     取交集
    

15.06_集合框架(集合的遍歷之迭代器遍歷)

  • A:迭代器概述
    • 集合是用來存儲(chǔ)元素,存儲(chǔ)的元素需要查看,那么就需要迭代(遍歷)
  • B:案例演示
    • 迭代器的使用

        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        
        Iterator it = c.iterator();                     //獲取迭代器的引用
        while(it.hasNext()) {                           //集合中的迭代方法(遍歷)
            System.out.println(it.next());
        }
      

15.07_集合框架(Collection存儲(chǔ)自定義對(duì)象并遍歷)

  • A:案例演示
    • Collection存儲(chǔ)自定義對(duì)象并用迭代器遍歷
    •   Collection c = new ArrayList();
        
        c.add(new Student("張三",23));
        c.add(new Student("李四",24));
        c.add(new Student("王五",25));
        c.add(new Student("趙六",26));
        c.add(new Student("趙六",26));
        
        for(Iterator it = c.iterator();it.hasNext();) {
            Student s = (Student)it.next();                     //向下轉(zhuǎn)型
            System.out.println(s.getName() + "," + s.getAge()); //獲取對(duì)象中的姓名和年齡
        }
        System.out.println("------------------------------");
        Iterator it = c.iterator();                             //獲取迭代器
        while(it.hasNext()) {                                   //判斷集合中是否有元素
            //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
            Student s = (Student)it.next();                     //向下轉(zhuǎn)型
            System.out.println(s.getName() + "," + s.getAge()); //獲取對(duì)象中的姓名和年齡
        }
      

15.08_集合框架(迭代器的原理及源碼解析)(了解)

  • A:迭代器原理
    • 迭代器原理:迭代器是對(duì)集合進(jìn)行遍歷,而每一個(gè)集合內(nèi)部的存儲(chǔ)結(jié)構(gòu)都是不同的,所以每一個(gè)集合存和取都是不一樣,那么就需要在每一個(gè)類中定義hasNext()和next()方法,這樣做是可以的,但是會(huì)讓整個(gè)集合體系過于臃腫,迭代器是將這樣的方法向上抽取出接口,然后在每個(gè)類的內(nèi)部,定義自己迭代方式,這樣做的好處有二,第一規(guī)定了整個(gè)集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內(nèi)部實(shí)現(xiàn),使用者不用管怎么實(shí)現(xiàn)的,會(huì)用即可
  • B:迭代器源碼解析
    • 1,在eclipse中ctrl + shift + t找到ArrayList類
    • 2,ctrl+o查找iterator()方法
    • 3,查看返回值類型是new Itr(),說明Itr這個(gè)類實(shí)現(xiàn)Iterator接口
    • 4,查找Itr這個(gè)內(nèi)部類,發(fā)現(xiàn)重寫了Iterator中的所有抽象方法

15.09_集合框架(List集合的特有功能概述和測(cè)試)

  • A:List集合的特有功能概述
    • void add(int index,E element)
    • E remove(int index)
    • E get(int index)
    • E set(int index,E element)

15.10_集合框架(List集合存儲(chǔ)學(xué)生對(duì)象并遍歷)

  • A:案例演示
    • 通過size()和get()方法結(jié)合使用遍歷展运。

        List list = new ArrayList();
        list.add(new Student("張三", 18));
        list.add(new Student("李四", 18));
        list.add(new Student("王五", 18));
        list.add(new Student("趙六", 18));
        
        for(int i = 0; i < list.size(); i++) {
            Student s = (Student)list.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
      

15.11_集合框架(并發(fā)修改異常產(chǎn)生的原因及解決方案)

  • A:案例演示

    • 需求:我有一個(gè)集合活逆,請(qǐng)問,我想判斷里面有沒有"world"這個(gè)元素乐疆,如果有划乖,我就添加一個(gè)"javaee"元素,請(qǐng)寫代碼實(shí)現(xiàn)挤土。

        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("world");
        list.add("d");
        list.add("e");
        
        /*Iterator it = list.iterator();
        while(it.hasNext()) {
            String str = (String)it.next();
            if(str.equals("world")) {
                list.add("javaee");         //這里會(huì)拋出ConcurrentModificationException并發(fā)修改異常
            }
        }*/
      
  • B:ConcurrentModificationException出現(xiàn)

    • 迭代器遍歷琴庵,集合修改集合
  • C:解決方案

    • a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

    • b:集合遍歷元素仰美,集合修改元素

        ListIterator lit = list.listIterator();     //如果想在遍歷的過程中添加元素,可以用ListIterator中的add方法
        while(lit.hasNext()) {
            String str = (String)lit.next();
            if(str.equals("world")) {
                lit.add("javaee");  
                //list.add("javaee");
            }
        }
      

15.12_集合框架(ListIterator)(了解)

  • boolean hasNext()是否有下一個(gè)
  • boolean hasPrevious()是否有前一個(gè)
  • Object next()返回下一個(gè)元素
  • Object previous();返回上一個(gè)元素

15.13_集合框架(Vector的特有功能)

  • A:Vector類概述
  • B:Vector類特有功能
    • public void addElement(E obj)
    • public E elementAt(int index)
    • public Enumeration elements()
  • C:案例演示
    • Vector的迭代

        Vector v = new Vector();                //創(chuàng)建集合對(duì)象,List的子類
        v.addElement("a");
        v.addElement("b");
        v.addElement("c");
        v.addElement("d");
        
        //Vector迭代
        Enumeration en = v.elements();          //獲取枚舉
        while(en.hasMoreElements()) {           //判斷集合中是否有元素
            System.out.println(en.nextElement());//獲取集合中的元素
        }
      

15.14_集合框架(數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組和鏈表)

  • A:數(shù)組
    • 查詢快修改也快
    • 增刪慢
  • B:鏈表
    • 查詢慢,修改也慢
    • 增刪快

15.15_集合框架(List的三個(gè)子類的特點(diǎn))

  • A:List的三個(gè)子類的特點(diǎn)
  •   ArrayList:
          底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組迷殿,查詢快,增刪慢咖杂。
          線程不安全庆寺,效率高。
      Vector:
          底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組诉字,查詢快懦尝,增刪慢。
          線程安全壤圃,效率低陵霉。
    
      Vector相對(duì)ArrayList查詢慢(線程安全的)
      Vector相對(duì)LinkedList增刪慢(數(shù)組結(jié)構(gòu))
      LinkedList:
          底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢伍绳,增刪快踊挠。
          線程不安全,效率高冲杀。
    
      Vector和ArrayList的區(qū)別
          Vector是線程安全的,效率低
          ArrayList是線程不安全的,效率高
      共同點(diǎn):都是數(shù)組實(shí)現(xiàn)的
      ArrayList和LinkedList的區(qū)別
          ArrayList底層是數(shù)組結(jié)果,查詢和修改快
          LinkedList底層是鏈表結(jié)構(gòu)的,增和刪比較快,查詢和修改比較慢
      共同點(diǎn):都是線程不安全的
    
  • B:List有三個(gè)兒子效床,我們到底使用誰呢?
    查詢多用ArrayList
    增刪多用LinkedList
    如果都多ArrayList

15.01_集合框架(對(duì)象數(shù)組的概述和使用)

  • A:案例演示

    • 需求:我有5個(gè)學(xué)生,請(qǐng)把這個(gè)5個(gè)學(xué)生的信息存儲(chǔ)到數(shù)組中权谁,并遍歷數(shù)組剩檀,獲取得到每一個(gè)學(xué)生信息。
  •   Student[] arr = new Student[5];                 //存儲(chǔ)學(xué)生對(duì)象
      arr[0] = new Student("張三", 23);
      arr[1] = new Student("李四", 24);
      arr[2] = new Student("王五", 25);
      arr[3] = new Student("趙六", 26);
      arr[4] = new Student("馬哥", 20);
      
      for (int i = 0; i < arr.length; i++) {
          System.out.println(arr[i]);
      }
    
  • B:畫圖演示

    • 把學(xué)生數(shù)組的案例畫圖講解
    • 數(shù)組和集合存儲(chǔ)引用數(shù)據(jù)類型,存的都是地址值

15.02_集合框架(集合的由來及集合繼承體系圖)

  • A:集合的由來
    • 數(shù)組長(zhǎng)度是固定,當(dāng)添加的元素超過了數(shù)組的長(zhǎng)度時(shí)需要對(duì)數(shù)組重新定義,太麻煩,java內(nèi)部給我們提供了集合類,能存儲(chǔ)任意對(duì)象,長(zhǎng)度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少.
  • B:數(shù)組和集合的區(qū)別
    • 區(qū)別1 :
      • 數(shù)組既可以存儲(chǔ)基本數(shù)據(jù)類型,又可以存儲(chǔ)引用數(shù)據(jù)類型,基本數(shù)據(jù)類型存儲(chǔ)的是值,引用數(shù)據(jù)類型存儲(chǔ)的是地址值
      • 集合只能存儲(chǔ)引用數(shù)據(jù)類型(對(duì)象),集合中也可以存儲(chǔ)基本數(shù)據(jù)類型,但是在存儲(chǔ)的時(shí)候會(huì)自動(dòng)裝箱變成對(duì)象
    • 區(qū)別2:
      • 數(shù)組長(zhǎng)度是固定的,不能自動(dòng)增長(zhǎng)
      • 集合的長(zhǎng)度的是可變的,可以根據(jù)元素的增加而增長(zhǎng)
  • C:數(shù)組和集合什么時(shí)候用
    • 1,如果元素個(gè)數(shù)是固定的推薦用數(shù)組
    • 2,如果元素個(gè)數(shù)不是固定的推薦用集合
  • D:集合繼承體系圖
    • 單列集合 頂層接口Collection
    • 實(shí)現(xiàn)子類 List有序旺芽、重復(fù) Set無序谨朝、不能重復(fù)
    • ArrayList LinkedList Vector HashSet哈希算法 TreeSet二叉樹算法

15.03_集合框架(Collection集合的基本功能測(cè)試)

  • A:案例演示

  •   基本功能演示
      
      boolean add(E e)
      boolean remove(Object o)
      void clear()
      boolean contains(Object o)
      boolean isEmpty()
      int size()
    
  • B:注意:

  •   collectionXxx.java使用了未經(jīng)檢查或不安全的操作.
      注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:unchecked重新編譯.
      java編譯器認(rèn)為該程序存在安全隱患
      溫馨提示:這不是編譯失敗,所以先不用理會(huì),等學(xué)了泛型你就知道了
    

15.04_集合框架(集合的遍歷之集合轉(zhuǎn)數(shù)組遍歷)

  • A:集合的遍歷
    • 其實(shí)就是依次獲取集合中的每一個(gè)元素卤妒。
  • B:案例演示
    • 把集合轉(zhuǎn)成數(shù)組,可以實(shí)現(xiàn)集合的遍歷
    • toArray()
    •   Collection coll = new ArrayList();
        coll.add(new Student("張三",23));     //Object obj = new Student("張三",23);
        coll.add(new Student("李四",24));
        coll.add(new Student("王五",25));
        coll.add(new Student("趙六",26));
        
        Object[] arr = coll.toArray();              //將集合轉(zhuǎn)換成數(shù)組
        for (int i = 0; i < arr.length; i++) {
            Student s = (Student)arr[i];            //強(qiáng)轉(zhuǎn)成Student
            System.out.println(s.getName() + "," + s.getAge());
        }
      

15.05_集合框架(Collection集合的帶All功能測(cè)試)

  • A:案例演示
  •   帶All的功能演示
      
      boolean addAll(Collection c)
      boolean removeAll(Collection c)
      boolean containsAll(Collection c)
      boolean retainAll(Collection c)     取交集字币,如果集合內(nèi)容改變則返回true,否則返回false
    

15.06_集合框架(集合的遍歷之迭代器遍歷)

  • A:迭代器概述
    • 集合是用來存儲(chǔ)元素,存儲(chǔ)的元素需要查看,那么就需要迭代(遍歷)
  • B:案例演示
    • 迭代器的使用

        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        
        Iterator it = c.iterator();                     //獲取迭代器的引用
        while(it.hasNext()) {                           //集合中的迭代方法(遍歷)
            System.out.println(it.next());
        }
      

15.07_集合框架(Collection存儲(chǔ)自定義對(duì)象并遍歷)

  • A:案例演示
    • Collection存儲(chǔ)自定義對(duì)象并用迭代器遍歷
    •   Collection c = new ArrayList();
        
        c.add(new Student("張三",23));
        c.add(new Student("李四",24));
        c.add(new Student("王五",25));
        c.add(new Student("趙六",26));
        c.add(new Student("趙六",26));
        
        for(Iterator it = c.iterator();it.hasNext();) {
            Student s = (Student)it.next();                     //向下轉(zhuǎn)型
            System.out.println(s.getName() + "," + s.getAge()); //獲取對(duì)象中的姓名和年齡
        }
        System.out.println("------------------------------");
        Iterator it = c.iterator();                             //獲取迭代器
        while(it.hasNext()) {                                   //判斷集合中是否有元素
            //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
            Student s = (Student)it.next();                     //向下轉(zhuǎn)型
            System.out.println(s.getName() + "," + s.getAge()); //獲取對(duì)象中的姓名和年齡
        }
      

15.08_集合框架(迭代器的原理及源碼解析)(了解)

  • A:迭代器原理
    • 迭代器原理:迭代器是對(duì)集合進(jìn)行遍歷,而每一個(gè)集合內(nèi)部的存儲(chǔ)結(jié)構(gòu)都是不同的,所以每一個(gè)集合存和取都是不一樣,那么就需要在每一個(gè)類中定義hasNext()和next()方法,這樣做是可以的,但是會(huì)讓整個(gè)集合體系過于臃腫,迭代器是將這樣的方法向上抽取出接口,然后在每個(gè)類的內(nèi)部,定義自己迭代方式,這樣做的好處有二,第一規(guī)定了整個(gè)集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內(nèi)部實(shí)現(xiàn),使用者不用管怎么實(shí)現(xiàn)的,會(huì)用即可
  • B:迭代器源碼解析
    • 1,在eclipse中ctrl + shift + t找到ArrayList類
    • 2,ctrl+o查找iterator()方法
    • 3,查看返回值類型是new Itr(),說明Itr這個(gè)類實(shí)現(xiàn)Iterator接口
    • 4,查找Itr這個(gè)內(nèi)部類,發(fā)現(xiàn)重寫了Iterator中的所有抽象方法

15.09_集合框架(List集合的特有功能概述和測(cè)試)

  • A:List集合的特有功能概述
    • void add(int index,E element)
    • E remove(int index)
    • E get(int index)
    • E set(int index,E element)

15.10_集合框架(List集合存儲(chǔ)學(xué)生對(duì)象并遍歷)

  • A:案例演示
    • 通過size()和get()方法結(jié)合使用遍歷抛蚁。

        List list = new ArrayList();
        list.add(new Student("張三", 18));
        list.add(new Student("李四", 18));
        list.add(new Student("王五", 18));
        list.add(new Student("趙六", 18));
        
        for(int i = 0; i < list.size(); i++) {
            Student s = (Student)list.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
      

15.11_集合框架(并發(fā)修改異常產(chǎn)生的原因及解決方案)

  • A:案例演示

    • 需求:我有一個(gè)集合痒给,請(qǐng)問笛谦,我想判斷里面有沒有"world"這個(gè)元素莱没,如果有毡咏,我就添加一個(gè)"javaee"元素主之,請(qǐng)寫代碼實(shí)現(xiàn)拂檩。

        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("world");
        list.add("d");
        list.add("e");
        
        /*Iterator it = list.iterator();
        while(it.hasNext()) {
            String str = (String)it.next();
            if(str.equals("world")) {
                list.add("javaee");         //這里會(huì)拋出ConcurrentModificationException并發(fā)修改異常
            }
        }*/
      
  • B:ConcurrentModificationException出現(xiàn)

    • 迭代器遍歷芬迄,集合名 修改集合內(nèi)部值
  • C:解決方案

    • a:迭代器迭代元素便贵,迭代器修改元素(ListIterator的特有功能add)

    • b:集合遍歷元素菠镇,集合修改元素

        ListIterator lit = list.listIterator();     //如果想在遍歷的過程中添加元素,可以用ListIterator中的add方法
        while(lit.hasNext()) {
            String str = (String)lit.next();
            if(str.equals("world")) {
                lit.add("javaee");  
                //list.add("javaee");
            }
        }
      

15.12_集合框架(ListIterator)(了解)

  • boolean hasNext()是否有下一個(gè)
  • boolean hasPrevious()是否有前一個(gè)
  • Object next()返回下一個(gè)元素
  • Object previous();返回上一個(gè)元素

15.13_集合框架(Vector的特有功能)

  • A:Vector類概述
  • B:Vector類特有功能
    • public void addElement(E obj)
    • public E elementAt(int index)
    • public Enumeration elements()
  • C:案例演示
    • Vector的迭代

        Vector v = new Vector();                //創(chuàng)建集合對(duì)象,List的子類
        v.addElement("a");
        v.addElement("b");
        v.addElement("c");
        v.addElement("d");
        
        //Vector迭代
        Enumeration en = v.elements();          //獲取枚舉
        while(en.hasMoreElements()) {           //判斷集合中是否有元素
            System.out.println(en.nextElement());//獲取集合中的元素
        }
      

15.14_集合框架(數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組和鏈表)

  • A:數(shù)組
    • 查詢快修改也快
    • 增刪慢
  • B:鏈表
    • 查詢慢,修改也慢
    • 增刪快

15.15_集合框架(List的三個(gè)子類的特點(diǎn))

  • A:List的三個(gè)子類的特點(diǎn)
  •   ArrayList:
          底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快承璃,增刪慢利耍。
          線程不安全,效率高盔粹。
      Vector:
          底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組隘梨,查詢快,增刪慢舷嗡。
          線程安全轴猎,效率低。
    
      Vector相對(duì)ArrayList查詢慢(線程安全的)
      Vector相對(duì)LinkedList增刪慢(數(shù)組結(jié)構(gòu))
      LinkedList:
          底層數(shù)據(jù)結(jié)構(gòu)是鏈表进萄,查詢慢捻脖,增刪快。
          線程不安全中鼠,效率高可婶。
    
      Vector和ArrayList的區(qū)別
          Vector是線程安全的,效率低
          ArrayList是線程不安全的,效率高
      共同點(diǎn):都是數(shù)組實(shí)現(xiàn)的
      ArrayList和LinkedList的區(qū)別
          ArrayList底層是數(shù)組結(jié)果,查詢和修改快
          LinkedList底層是鏈表結(jié)構(gòu)的,增和刪比較快,查詢和修改比較慢
      共同點(diǎn):都是線程不安全的
    
  • B:List有三個(gè)兒子,我們到底使用誰呢?
    查詢多用ArrayList
    增刪多用LinkedList
    如果都多ArrayList

16.01_集合框架(去除ArrayList中重復(fù)字符串元素方式)(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中字符串的重復(fù)值(字符串的內(nèi)容相同)

    • 思路:創(chuàng)建新集合方式

        /**
         *  A:案例演示
         * 需求:ArrayList去除集合中字符串的重復(fù)值(字符串的內(nèi)容相同)
         * 思路:創(chuàng)建新集合方式
         */
        public static void main(String[] args) {
            ArrayList list = new ArrayList();
            list.add("a");
            list.add("a");
            list.add("b");
            list.add("b");
            list.add("b");
            list.add("c");
            list.add("c");
            list.add("c");
            list.add("c");
            
            System.out.println(list);
            ArrayList newList = getSingle(list);
            System.out.println(newList);
        }
      
        /*
         * 去除重復(fù)
         * 1,返回ArrayList
         * 2,參數(shù)列表ArrayList
         */
        public static ArrayList getSingle(ArrayList list) {
            ArrayList newList = new ArrayList();            //創(chuàng)建一個(gè)新集合
            Iterator it = list.iterator();                  //獲取迭代器
            while(it.hasNext()) {                           //判斷老集合中是否有元素
                String temp = (String)it.next();            //將每一個(gè)元素臨時(shí)記錄住
                if(!newList.contains(temp)) {               //如果新集合中不包含該元素
                    newList.add(temp);                      //將該元素添加到新集合中
                }
            }
            return newList;                                 //將新集合返回
        }
      

16.02_集合框架(去除ArrayList中重復(fù)自定義對(duì)象元素)(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中自定義對(duì)象元素的重復(fù)值(對(duì)象的成員變量值相同)
  • B:注意事項(xiàng)
    • 重寫equals()方法的

16.03_集合框架(LinkedList的特有功能)(掌握)

  • A:LinkedList類概述
  • B:LinkedList類特有功能
    • public void addFirst(E e)及addLast(E e)
    • public E getFirst()及getLast()
    • public E removeFirst()及public E removeLast()
    • public E get(int index);
  • C: 利用特有方法添加成員到 集合中兜蠕,然后遍歷扰肌; 然后再刪除頭尾,再次遍歷熊杨。

16.04_集合框架(棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu))(掌握)

    • 先進(jìn)后出
  • 隊(duì)列
    • 先進(jìn)先出

16.05_集合框架(用LinkedList模擬棧數(shù)據(jù)結(jié)構(gòu)的集合并測(cè)試)(掌握)

  • A:案例演示
    • 需求:請(qǐng)用LinkedList模擬棧數(shù)據(jù)結(jié)構(gòu)的集合曙旭,并測(cè)試
    • 創(chuàng)建一個(gè)類將Linked中的方法封裝
    •   public class Stack {
            private LinkedList list = new LinkedList();     //創(chuàng)建LinkedList對(duì)象
            
            public void in(Object obj) {
                list.addLast(obj);                          //封裝addLast()方法
            }
            
            public Object out() {
                return list.removeLast();                   //封裝removeLast()方法
            }
            
            public boolean isEmpty() {
                return list.isEmpty();                      //封裝isEmpty()方法
            }
        }
      

16.06_集合框架(泛型概述和基本使用)(掌握)

  • A:泛型概述
    • 不確定的類型 什么都可以的意思。
  • B:泛型好處
    • 提高安全性【將運(yùn)行期的錯(cuò)誤轉(zhuǎn)換到編譯期】
    • 省去強(qiáng)轉(zhuǎn)的麻煩
  • C:泛型基本使用
    • <>中放的必須是引用數(shù)據(jù)類型
  • D:泛型使用注意事項(xiàng)
    • 前后的泛型必須一致,或者后面的泛型可以省略不寫(1.7的新特性菱形泛型)
    • 泛型類的使用 固定格式
    • 泛型類<確定類型1,確定類型2,...> 對(duì)象名 = new 泛型類<>();

16.07_集合框架(ArrayList存儲(chǔ)字符串和自定義對(duì)象并遍歷泛型版)(掌握)

  • A:案例演示
    • ArrayList存儲(chǔ)字符串并遍歷泛型版

16.08_集合框架(泛型的由來)(了解)

  • A:案例演示
    • 泛型的由來:通過Object轉(zhuǎn)型問題引入
    • 早期的Object類型可以接收任意的對(duì)象類型晶府,但是在實(shí)際的使用中桂躏,會(huì)有類型轉(zhuǎn)換的問題。也就存在這隱患川陆,所以Java提供了泛型來解決這個(gè)安全問題剂习。

16.09_集合框架(泛型類的概述及使用)(了解)

  • A:泛型類概述<T>
    • 把泛型定義在類上
  • B:定義格式
    • public class 類名<泛型類型1,…>
  • C:注意事項(xiàng)
    • 泛型類型必須是引用類型
  • D:案例演示
    • 泛型類的使用

16.10_集合框架(泛型方法的概述和使用)(了解)

  • A:泛型方法概述
    • 把泛型定義在方法上
  • B:定義格式
    • public<泛型類型> 返回類型 方法名(泛型類型 變量名)
    • 最好與類泛型一致
  • C:案例演示
    • 泛型方法的使用
  • D:靜態(tài)方法中,必須聲明自己的泛型
    • 靜態(tài)方法不依賴對(duì)象,而類泛型只有在創(chuàng)建對(duì)象時(shí)傳遞類型值。

16.11_集合框架(泛型接口的概述和使用)(了解)

  • A:泛型接口概述
    • 把泛型定義在接口上
  • B:定義格式
    • public interface 接口名<泛型類型>
    • a. 實(shí)現(xiàn)類中確定類型
    • b. class Demo<T> implements 接口<T> { ... }
  • C:案例演示
    • 泛型接口的使用

16.12_集合框架(泛型高級(jí)之通配符)(了解)

  • A:泛型通配符<?>
    • 任意類型鳞绕,如果沒有明確失仁,那么就是Object以及任意的Java類了
  • B:? extends E
    • 向下限定,E及其子類
    • addAll(Collection<? extends E>);
  • C:? super E
    • 向上限定们何,E及其父類

16.13_集合框架(增強(qiáng)for的概述和使用)(掌握)

  • A:增強(qiáng)for概述
    • 簡(jiǎn)化數(shù)組和Collection集合的遍歷
    • 底層是通過迭代器實(shí)現(xiàn)的萄焦。
  • B:格式:
  •   for(元素?cái)?shù)據(jù)類型 變量 : 數(shù)組或者Collection集合) {
          使用變量即可,該變量就是元素
      }
    
  • C:案例演示
    • 數(shù)組冤竹,集合存儲(chǔ)元素用增強(qiáng)for遍歷
  • D:好處
    • 簡(jiǎn)化遍歷

16.14_集合框架(ArrayList存儲(chǔ)字符串和自定義對(duì)象并遍歷增強(qiáng)for版)(掌握)

  • A:案例演示
    • ArrayList存儲(chǔ)字符串并遍歷增強(qiáng)for版
    •   ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for(String s : list) {
            System.out.println(s);
        }
      
      底層借助迭代器實(shí)現(xiàn).

16.15_集合框架(三種迭代的能否刪除)(掌握)

  • 普通for循環(huán),可以刪除,但是【索引要--】
  • 迭代器,可以刪除,但是必須使用迭代器自身的remove方法,否則會(huì)出現(xiàn)并發(fā)修改異常
  • 增強(qiáng)for循環(huán)不能刪除【底層通過迭代器實(shí)現(xiàn)拂封,不能刪除】

16.16_集合框架(靜態(tài)導(dǎo)入的概述和使用)(掌握)

  • A:靜態(tài)導(dǎo)入概述
  • B:格式:
    • import static 包名….類名.static方法;
    • import static 包名...類名.static成員;
    • 可以直接導(dǎo)入到方法的級(jí)別
  • C:注意事項(xiàng)
    • 方法必須是靜態(tài)的,如果有同名的方法,就不知道使用誰?這個(gè)時(shí)候要使用鹦蠕,必須加前綴冒签。由此可見,意義不大钟病,所以一般不用萧恕,但是要能看懂。

16.17_集合框架(可變參數(shù)的概述和使用)(掌握)

  • A:可變參數(shù)概述
    • 定義方法的時(shí)候不知道該定義多少個(gè)參數(shù)
  • B:格式
    • 修飾符 返回值類型 方法名(數(shù)據(jù)類型… 變量名){}
  • C:注意事項(xiàng):
    • 這里可變參數(shù) 其實(shí) 是一個(gè)數(shù)組
    • 如果一個(gè)方法有可變參數(shù)档悠,并且有多個(gè)參數(shù)廊鸥,那么,可變參數(shù)肯定是最后一個(gè)
    • outArray(int len,int... arr); ok
    • outArray(int... arr,int len); error

16.18_集合框架(Arrays工具類的asList()方法的使用)(掌握)

  • A:案例演示
    • Arrays工具類的asList()方法的使用

    • 將數(shù)組轉(zhuǎn)換成集合

    • 注意:轉(zhuǎn)換成集合后辖所,不可以增加或減少元素惰说,但可以用集合思想操作數(shù)據(jù)。

    •  如果操作標(biāo)準(zhǔn)數(shù)據(jù)類型數(shù)組缘回,則將數(shù)組當(dāng)成一個(gè)元素添加到數(shù)組中吆视。
      
    • Collection中toArray(T[] a)泛型版的集合轉(zhuǎn)數(shù)組

    • 例如 list.toArray(new String[n]); n值不同,轉(zhuǎn)換得到的數(shù)組不同

16.19_集合框架(集合嵌套之ArrayList嵌套ArrayList)(掌握)

  • A:案例演示
    • 集合嵌套之ArrayList嵌套ArrayList
    • 專業(yè)中包含多個(gè)班級(jí)酥宴,每個(gè)班級(jí)包含多個(gè)學(xué)生

17.01_集合框架(HashSet存儲(chǔ)字符串并遍歷)

  • A:Set集合概述及特點(diǎn)
    • 通過API查看即可
  • B:案例演示
    • HashSet存儲(chǔ)字符串并遍歷
    •   HashSet<String> hs = new HashSet<>();
        boolean b1 = hs.add("a");
        boolean b2 = hs.add("a");           //當(dāng)存儲(chǔ)不成功的時(shí)候,返回false
        
        System.out.println(b1);
        System.out.println(b2);
        for(String s : hs) {
            System.out.println(s);
        }
      

17.02_集合框架(HashSet存儲(chǔ)自定義對(duì)象保證元素唯一性)

  • A:案例演示
    • 存儲(chǔ)自定義對(duì)象啦吧,并保證元素唯一性。

        HashSet<Person> hs = new HashSet<>();
        hs.add(new Person("張三", 23));
        hs.add(new Person("張三", 23));
        hs.add(new Person("李四", 23));
        hs.add(new Person("李四", 23));
        hs.add(new Person("王五", 23));
        hs.add(new Person("趙六", 23));
      
  • 重寫hashCode()和equals()方法

17.03_集合框架(HashSet存儲(chǔ)自定義對(duì)象保證元素唯一性圖解及代碼優(yōu)化)

  • A:畫圖演示
    • 畫圖說明比較過程
  • B:代碼優(yōu)化
    • 為了減少比較拙寡,優(yōu)化hashCode()代碼寫法授滓。
    • 最終版就是自動(dòng)生成即可。

17.04_集合框架(HashSet如何保證元素唯一性的原理)

  • 1.HashSet原理
    • 我們使用Set集合都是需要去掉重復(fù)元素的, 如果在存儲(chǔ)的時(shí)候逐個(gè)equals()比較, 效率較低,哈希算法提高了去重復(fù)的效率, 降低了使用equals()方法的次數(shù)
    • 當(dāng)HashSet調(diào)用add()方法存儲(chǔ)對(duì)象的時(shí)候, 先調(diào)用對(duì)象的hashCode()方法得到一個(gè)哈希值, 然后在集合中查找是否有哈希值相同的對(duì)象
      • 如果沒有哈希值相同的對(duì)象就直接存入集合
      • 如果有哈希值相同的對(duì)象, 就和哈希值相同的對(duì)象逐個(gè)進(jìn)行equals()比較,比較結(jié)果為false就存入, true則不存
  • 2.將自定義類的對(duì)象存入HashSet去重復(fù)
    • 類中必須重寫hashCode()和equals()方法
    • hashCode(): 屬性相同的對(duì)象返回值必須相同, 屬性不同的返回值盡量不同(提高效率)
    • equals(): 屬性相同返回true, 屬性不同返回false,返回false的時(shí)候存儲(chǔ)

17.05_集合框架(LinkedHashSet的概述和使用)

  • A:LinkedHashSet的特點(diǎn)
  • B:案例演示
    • LinkedHashSet的特點(diǎn)
      • 可以保證怎么存就怎么取

17.06_集合框架(產(chǎn)生10個(gè)1-20之間的隨機(jī)數(shù)要求隨機(jī)數(shù)不能重復(fù))

  • A:案例演示
    • 需求:編寫一個(gè)程序肆糕,獲取10個(gè)1至20的隨機(jī)數(shù)般堆,要求隨機(jī)數(shù)不能重復(fù)。并把最終的隨機(jī)數(shù)輸出到控制臺(tái)诚啃。
    •   HashSet<Integer> hs = new HashSet<>();      //創(chuàng)建集合對(duì)象
        Random r = new Random();                    //創(chuàng)建隨機(jī)數(shù)對(duì)象
        
        while(hs.size() < 10) {
            int num = r.nextInt(20) + 1;            //生成1到20的隨機(jī)數(shù)
            hs.add(num);
        }
        
        for (Integer integer : hs) {                //遍歷集合
            System.out.println(integer);            //打印每一個(gè)元素
        }
      

17.07_集合框架(練習(xí))

  • 使用Scanner從鍵盤讀取一行輸入,去掉其中重復(fù)字符, 打印出不同的那些字符
    • aaaabbbcccddd

        Scanner sc = new Scanner(System.in);            //創(chuàng)建鍵盤錄入對(duì)象
        System.out.println("請(qǐng)輸入一行字符串:");
        String line = sc.nextLine();                    //將鍵盤錄入的字符串存儲(chǔ)在line中
        char[] arr = line.toCharArray();                //將字符串轉(zhuǎn)換成字符數(shù)組
        HashSet<Character> hs = new HashSet<>();        //創(chuàng)建HashSet集合對(duì)象
        
        for(char c : arr) {                             //遍歷字符數(shù)組
            hs.add(c);                                  //將字符數(shù)組中的字符添加到集合中
        }
        
        for (Character ch : hs) {                       //遍歷集合
            System.out.println(ch);
        }
      

17.08_集合框架(練習(xí))

  • 將ArrayList集合中的重復(fù)元素去掉
  •       public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              list.add("a");
              list.add("a");
              list.add("a");
              list.add("b");
              list.add("b");
              list.add("b");
              list.add("b");
              list.add("c");
              list.add("c");
              list.add("c");
              list.add("c");
              
              System.out.println(list);
              System.out.println("去除重復(fù)后:");
              getSingle(list);
              System.out.println(list);
          }
          
          /*
           * 將集合中的重復(fù)元素去掉
           * 1,void
           * 2,List<String> list
           */
          
          public static void getSingle(List<String> list) {
              LinkedHashSet<String> lhs = new LinkedHashSet<>();
              lhs.addAll(list);                                   //將list集合中的所有元素添加到lhs
              list.clear();                                       //清空原集合
              list.addAll(lhs);                                   //將去除重復(fù)的元素添回到list中
          }
    

17.09_集合框架(TreeSet存儲(chǔ)Integer類型的元素并遍歷)

  • A:案例演示
    • TreeSet存儲(chǔ)Integer類型的元素并遍歷

17.10_集合框架(TreeSet存儲(chǔ)自定義對(duì)象)

  • A:案例演示
    • 存儲(chǔ)Person對(duì)象

17.11_集合框架(TreeSet保證元素唯一和自然排序的原理和圖解)

  • A:畫圖演示
    • TreeSet保證元素唯一和自然排序的原理和圖解

17.12_集合框架(TreeSet存儲(chǔ)自定義對(duì)象并遍歷練習(xí)1)

  • A:案例演示
    • TreeSet存儲(chǔ)自定義對(duì)象并遍歷練習(xí)1(按照姓名排序)

17.13_集合框架(TreeSet存儲(chǔ)自定義對(duì)象并遍歷練習(xí)2)

  • A:案例演示
    • TreeSet存儲(chǔ)自定義對(duì)象并遍歷練習(xí)2(按照姓名的長(zhǎng)度排序)
    • compareTo(Person p) {
    • int num = name.length() - p.name.length();
    • return num;
    • }

17.14_集合框架(TreeSet保證元素唯一和比較器排序的原理及代碼實(shí)現(xiàn))

  • A:案例演示
    • TreeSet保證元素唯一和比較器排序的原理及代碼實(shí)現(xiàn)

17.15_集合框架(TreeSet原理)

  • 1.特點(diǎn)
    • TreeSet是用來排序的, 可以指定一個(gè)順序, 對(duì)象存入之后會(huì)按照指定的順序排列
  • 2.使用方式
    • a.自然順序(Comparable)
      • TreeSet類的add()方法中會(huì)把存入的對(duì)象提升為Comparable類型
      • 調(diào)用對(duì)象的compareTo()方法和集合中的對(duì)象比較
      • 根據(jù)compareTo()方法返回的結(jié)果進(jìn)行存儲(chǔ)
    • b.比較器順序(Comparator)
      • 創(chuàng)建TreeSet的時(shí)候可以制定 一個(gè)Comparator
      • 如果傳入了Comparator的子類對(duì)象, 那么TreeSet就會(huì)按照比較器中的順序排序
      • add()方法內(nèi)部會(huì)自動(dòng)調(diào)用Comparator接口中compare()方法排序
      • 調(diào)用的對(duì)象是compare方法的第一個(gè)參數(shù),集合中的對(duì)象是compare方法的第二個(gè)參數(shù)
    • c.兩種方式的區(qū)別
      • TreeSet構(gòu)造函數(shù)什么都不傳, 默認(rèn)按照類中Comparable的順序(沒有就報(bào)錯(cuò)ClassCastException)
      • TreeSet如果傳入Comparator, 就優(yōu)先按照Comparator

17.16_集合框架(練習(xí))

  • 在一個(gè)集合中存儲(chǔ)了無序并且重復(fù)的字符串,定義一個(gè)方法,讓其有序(字典順序),而且還不能去除重復(fù)

          public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              list.add("ccc");
              list.add("ccc");
              list.add("aaa");
              list.add("aaa");
              list.add("bbb");
              list.add("ddd");
              list.add("ddd");
              
              sort(list);
              System.out.println(list);
          }
          
          /*
           * 對(duì)集合中的元素排序,并保留重復(fù)
           * 1,void
           * 2,List<String> list
           */
          public static void sort(List<String> list) {
              TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {       //定義比較器(new Comparator(){}是Comparator的子類對(duì)象)
      
                  @Override
                  public int compare(String s1, String s2) {                      //重寫compare方法
                      int num = s1.compareTo(s2);                                 //比較內(nèi)容
                      return num == 0 ? 1 : num;                                  //如果內(nèi)容一樣返回一個(gè)不為0的數(shù)字即可
                  }
              });
              
              ts.addAll(list);                                                    //將list集合中的所有元素添加到ts中
              list.clear();                                                       //清空list
              list.addAll(ts);                                                    //將ts中排序并保留重復(fù)的結(jié)果在添加到list中
          }
    

17.17_集合框架(練習(xí))

  • 從鍵盤接收一個(gè)字符串, 程序?qū)ζ渲兴凶址M(jìn)行排序,例如鍵盤輸入: helloitcast程序打印:acehillostt

      Scanner sc = new Scanner(System.in);            //創(chuàng)建鍵盤錄入對(duì)象
      System.out.println("請(qǐng)輸入一行字符串:");
      String line = sc.nextLine();                    //將鍵盤錄入的字符串存儲(chǔ)在line中
      char[] arr = line.toCharArray();                //將字符串轉(zhuǎn)換成字符數(shù)組
      TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {
    
          @Override
          public int compare(Character c1, Character c2) {
              //int num = c1.compareTo(c2);
              int num = c1 - c2;                  //自動(dòng)拆箱
              return num == 0 ? 1 : num;
          }
      });
      
      for(char c : arr) {
          ts.add(c);
      }
      
      for(Character ch : ts) {
          System.out.print(ch);
      }
    

17.18_集合框架(練習(xí))

  • 程序1: 程序啟動(dòng)后, 可以從鍵盤輸入接收多個(gè)整數(shù), 直到輸入quit時(shí)結(jié)束輸入. 把所有輸入的整數(shù)倒序排列打印.

          Scanner sc = new Scanner(System.in);        //創(chuàng)建鍵盤錄入對(duì)象
          System.out.println("請(qǐng)輸入: ");
          TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {//將比較器傳給TreeSet的構(gòu)造方法
    
              @Override
              public int compare(Integer i1, Integer i2) {
                  //int num = i2 - i1;                    //自動(dòng)拆箱
                  int num = i2.compareTo(i1);
                  return num == 0 ? 1 : num;
              }
          });
          
          while(true) {
              String line = sc.nextLine();            //將鍵盤錄入的字符串存儲(chǔ)在line中
              if("quit".equals(line))                 //如果字符串常量和變量比較,常量放前面,這樣不會(huì)出現(xiàn)空指針異常,變量里面可能存儲(chǔ)null
                  break;
              try {
                  int num = Integer.parseInt(line);       //將數(shù)字字符串轉(zhuǎn)換成數(shù)字
                  ts.add(num);
              } catch (Exception e) {
                  System.out.println("您錄入的數(shù)據(jù)有誤,請(qǐng)輸入一個(gè)整數(shù)");
              }
              
          }
          
          for (Integer i : ts) {                      //遍歷TreeSet集合
              System.out.println(i);
          }
    

17.19_集合框架(鍵盤錄入學(xué)生信息按照總分排序后輸出在控制臺(tái))

  • A:案例演示
    • 需求:鍵盤錄入5個(gè)學(xué)生信息(姓名,語文成績(jī),數(shù)學(xué)成績(jī),英語成績(jī)),按照總分從高到低輸出到控制臺(tái)淮摔。

        Scanner sc = new Scanner(System.in);
        System.out.println("請(qǐng)輸入5個(gè)學(xué)生成績(jī)格式是:(姓名,語文成績(jī),數(shù)學(xué)成績(jī),英語成績(jī))");
        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s2.getSum() - s1.getSum();            //根據(jù)學(xué)生的總成績(jī)降序排列
                return num == 0 ? 1 : num;
            }
        });
        
        while(ts.size() < 5) {
            String line = sc.nextLine();
            try {
                String[] arr = line.split(",");
                int chinese = Integer.parseInt(arr[1]);             //轉(zhuǎn)換語文成績(jī)
                int math = Integer.parseInt(arr[2]);                //轉(zhuǎn)換數(shù)學(xué)成績(jī)
                int english = Integer.parseInt(arr[3]);             //轉(zhuǎn)換英語成績(jī)
                ts.add(new Student(arr[0], chinese, math, english));
            } catch (Exception e) {
                System.out.println("錄入格式有誤,輸入5個(gè)學(xué)生成績(jī)格式是:(姓名,語文成績(jī),數(shù)學(xué)成績(jī),英語成績(jī)");
            }
        }
        
        System.out.println("排序后的學(xué)生成績(jī)是:");
        for (Student s : ts) {
            System.out.println(s);
        }
      

17.20_day17總結(jié)

  • 1.List
    • a.普通for循環(huán), 使用get()逐個(gè)獲取
    • b.調(diào)用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • c.增強(qiáng)for循環(huán), 只要可以使用Iterator的類都可以用
    • d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
  • 2.Set
    • a.調(diào)用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • b.增強(qiáng)for循環(huán), 只要可以使用Iterator的類都可以用
  • 3.普通for循環(huán),迭代器,增強(qiáng)for循環(huán)是否可以在遍歷的過程中刪除

18.01_集合框架(Map集合概述和特點(diǎn))

  • A:Map接口概述
    • 查看API可以知道:
      • 將鍵映射到值的對(duì)象
      • 一個(gè)映射不能包含重復(fù)的鍵
      • 每個(gè)鍵最多只能映射到一個(gè)值
  • B:Map接口和Collection接口的不同
    • Map是雙列的,Collection是單列的
    • Map的鍵唯一,Collection的子體系Set是唯一的
    • Map集合的數(shù)據(jù)結(jié)構(gòu)值針對(duì)鍵有效,跟值無關(guān);Collection集合的數(shù)據(jù)結(jié)構(gòu)是針對(duì)元素有效

18.02_集合框架(Map集合的功能概述)

  • A:Map集合的功能概述
    • a:添加功能
      • V put(K key,V value):添加元素始赎。
        • 如果鍵是第一次存儲(chǔ)和橙,就直接存儲(chǔ)元素仔燕,返回null
        • 如果鍵不是第一次存在,就用值把以前的值替換掉魔招,返回以前的值
    • b:刪除功能
      • void clear():移除所有的鍵值對(duì)元素
      • V remove(Object key):根據(jù)鍵刪除鍵值對(duì)元素晰搀,并把值返回
    • c:判斷功能
      • boolean containsKey(Object key):判斷集合是否包含指定的鍵
      • boolean containsValue(Object value):判斷集合是否包含指定的值
      • boolean isEmpty():判斷集合是否為空
    • d:獲取功能
      • Set<Map.Entry<K,V>> entrySet():獲取集合中所有的鍵值對(duì)
      • V get(Object key):根據(jù)鍵獲取值
      • Set<K> keySet():獲取集合中所有鍵的集合
      • Collection<V> values():獲取集合中所有值的集合
    • e:長(zhǎng)度功能
      • int size():返回集合中的鍵值對(duì)的個(gè)數(shù)

18.03_集合框架(Map集合的遍歷之鍵找值)

  • A:鍵找值思路:
    • 獲取所有鍵的集合
    • 遍歷鍵的集合,獲取到每一個(gè)鍵
    • 根據(jù)鍵找值
  • B:案例演示
    • Map集合的遍歷之鍵找值

        HashMap<String, Integer> hm = new HashMap<>();
        hm.put("張三", 23);
        hm.put("李四", 24);
        hm.put("王五", 25);
        hm.put("趙六", 26);
        
        /*Set<String> keySet = hm.keySet();         //獲取集合中所有的鍵
        Iterator<String> it = keySet.iterator();    //獲取迭代器
        while(it.hasNext()) {                       //判斷單列集合中是否有元素
            String key = it.next();                 //獲取集合中的每一個(gè)元素,其實(shí)就是雙列集合中的鍵
            Integer value = hm.get(key);            //根據(jù)鍵獲取值
            System.out.println(key + "=" + value);  //打印鍵值對(duì)
        }*/
        
        for(String key : hm.keySet()) {             //增強(qiáng)for循環(huán)迭代雙列集合第一種方式
            System.out.println(key + "=" + hm.get(key));
        }
      

18.04_集合框架(Map集合的遍歷之鍵值對(duì)對(duì)象找鍵和值)

  • A:鍵值對(duì)對(duì)象找鍵和值思路:
    • 獲取所有鍵值對(duì)對(duì)象的集合
    • 遍歷鍵值對(duì)對(duì)象的集合仆百,獲取到每一個(gè)鍵值對(duì)對(duì)象
    • 根據(jù)鍵值對(duì)對(duì)象找鍵和值
  • B:案例演示
    • Map集合的遍歷之鍵值對(duì)對(duì)象找鍵和值

        HashMap<String, Integer> hm = new HashMap<>();
        hm.put("張三", 23);
        hm.put("李四", 24);
        hm.put("王五", 25);
        hm.put("趙六", 26);
        /*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet(); //獲取所有的鍵值對(duì)象的集合
        Iterator<Entry<String, Integer>> it = entrySet.iterator();//獲取迭代器
        while(it.hasNext()) {
            Entry<String, Integer> en = it.next();              //獲取鍵值對(duì)對(duì)象
            String key = en.getKey();                               //根據(jù)鍵值對(duì)對(duì)象獲取鍵
            Integer value = en.getValue();                          //根據(jù)鍵值對(duì)對(duì)象獲取值
            System.out.println(key + "=" + value);
        }*/
        
        for(Entry<String,Integer> en : hm.entrySet()) {
            System.out.println(en.getKey() + "=" + en.getValue());
        }
      

C:源碼分析

注意: Map.Entry<K,V> 表示Map接口內(nèi)部存在Entry接口厕隧。

18.05_集合框架(HashMap集合鍵是Student值是String的案例)

  • HashMap中的key如果是自定義類型,則需要重寫hashCode與equals方法
  • A:案例演示
    • HashMap集合鍵是Student值是String的案例

18.06_集合框架(LinkedHashMap的概述和使用)

  • 底層實(shí)現(xiàn)類似LinkedHashSet
  • A:案例演示 LinkedHashMapTest.java
    • LinkedHashMap的特點(diǎn)
      • 底層是鏈表實(shí)現(xiàn)的可以保證怎么存就怎么取

18.07_集合框架(TreeMap集合鍵是Student值是String的案例)

  • A:案例演示 TreeMapTest.java
    • TreeMap集合鍵是Student值是String的案例

18.08_集合框架(統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)的次數(shù))

  • A:案例演示
    • 需求:統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)的次數(shù)
      String str = "aaaabbbcccccccccc";
      char[] arr = str.toCharArray(); //將字符串轉(zhuǎn)換成字符數(shù)組
      HashMap<Character, Integer> hm = new HashMap<>(); //創(chuàng)建雙列集合存儲(chǔ)鍵和值

        for(char c : arr) {                                 //遍歷字符數(shù)組
            /*if(!hm.containsKey(c)) {                      //如果不包含這個(gè)鍵
                hm.put(c, 1);                               //就將鍵和值為1添加
            }else {                                         //如果包含這個(gè)鍵
                hm.put(c, hm.get(c) + 1);                   //就將鍵和值再加1添加進(jìn)來
            }
            
            //hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
            Integer i = !hm.containsKey(c) ? hm.put(c, 1) : hm.put(c, hm.get(c) + 1);
                    }
        
        for (Character key : hm.keySet()) {                 //遍歷雙列集合
            System.out.println(key + "=" + hm.get(key));
        }
      

18.09_集合框架(集合嵌套之HashMap嵌套HashMap)

  • A:案例演示
    • 集合嵌套之HashMap嵌套HashMap
    • 一個(gè)專業(yè)可以包含多個(gè)班級(jí)
    • java1班 里面包含3個(gè)學(xué)生 HashMap<String,Student> javaClass1;
    • java2班 也包含 3個(gè)學(xué)生 HashMap<String,Student> javaClass2;
    • 軟件開發(fā)專業(yè) 包含java1 java2班 HashMap<"Java1班",javaClass1> RJKAMap;

18.10_集合框架(HashMap和Hashtable的區(qū)別)

  • A:面試題
    • HashMap和Hashtable的區(qū)別
      • Hashtable是JDK1.0版本出現(xiàn)的,是線程安全的,效率低,HashMap是JDK1.2版本出現(xiàn)的,是線程不安全的,效率高
      • Hashtable不可以存儲(chǔ)null鍵和null值,HashMap可以存儲(chǔ)null鍵和null值
  • B:案例演示
    • HashMap和Hashtable的區(qū)別

18.11_集合框架(Collections工具類的概述和常見方法講解)

  • A:Collections類概述
    • 針對(duì)集合操作 的工具類
  • B:Collections成員方法
  •   public static <T> void sort(List<T> list)
      public static <T> int binarySearch(List<?> list,T key)
      public static <T> T max(Collection<?> coll)
      public static void reverse(List<?> list)
      public static void shuffle(List<?> list)
    

18.12_集合框架(模擬斗地主洗牌和發(fā)牌)

  • A:案例演示
    • 使用ArrayList集合模擬斗地主洗牌和發(fā)牌俄周,牌沒有排序

        //買一副撲克
        String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String[] color = {"方片","梅花","紅桃","黑桃"};
        ArrayList<String> poker = new ArrayList<>();
        
        for(String s1 : color) {
            for(String s2 : num) {
                poker.add(s1.concat(s2));
            }
        }
        
        poker.add("小王");
        poker.add("大王");
        //洗牌
        Collections.shuffle(poker);
        //發(fā)牌
        ArrayList<String> gaojin = new ArrayList<>();
        ArrayList<String> longwu = new ArrayList<>();
        ArrayList<String> me = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        
        for(int i = 0; i < poker.size(); i++) {
            if(i >= poker.size() - 3) {
                dipai.add(poker.get(i));
            }else if(i % 3 == 0) {
                gaojin.add(poker.get(i));
            }else if(i % 3 == 1) {
                longwu.add(poker.get(i));
            }else {
                me.add(poker.get(i));
            }
        }
        
        //看牌
        
        System.out.println(gaojin);
        System.out.println(longwu);
        System.out.println(me);
        System.out.println(dipai);
      

18.13_集合框架(模擬斗地主洗牌和發(fā)牌并對(duì)牌進(jìn)行排序的原理圖解)

  • A:畫圖演示
    • 畫圖說明排序原理

18.14_集合框架(模擬斗地主洗牌和發(fā)牌并對(duì)牌進(jìn)行排序的代碼實(shí)現(xiàn))

  • A:案例演示
    • 模擬斗地主洗牌和發(fā)牌并對(duì)牌進(jìn)行排序的代碼實(shí)現(xiàn)
  •       //買一副牌
          String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
          String[] color = {"方片","梅花","紅桃","黑桃"};
          HashMap<Integer, String> hm = new HashMap<>();          //存儲(chǔ)索引和撲克牌
          ArrayList<Integer> list = new ArrayList<>();            //存儲(chǔ)索引
          int index = 0;                                          //索引的開始值
          for(String s1 : num) {
              for(String s2 : color) {
                  hm.put(index, s2.concat(s1));                   //將索引和撲克牌添加到HashMap中
                  list.add(index);                                //將索引添加到ArrayList集合中
                  index++;
              }
          }
          hm.put(index, "小王");
          list.add(index);
          index++;
          hm.put(index, "大王");
          list.add(index);
          //洗牌
          Collections.shuffle(list);
          //發(fā)牌
          TreeSet<Integer> gaojin = new TreeSet<>();
          TreeSet<Integer> longwu = new TreeSet<>();
          TreeSet<Integer> me = new TreeSet<>();
          TreeSet<Integer> dipai = new TreeSet<>();
          
          for(int i = 0; i < list.size(); i++) {
              if(i >= list.size() - 3) {
                  dipai.add(list.get(i));                         //將list集合中的索引添加到TreeSet集合中會(huì)自動(dòng)排序
              }else if(i % 3 == 0) {
                  gaojin.add(list.get(i));
              }else if(i % 3 == 1) {
                  longwu.add(list.get(i));
              }else {
                  me.add(list.get(i));
              }
          }
          
          //看牌
          lookPoker("高進(jìn)", gaojin, hm);
          lookPoker("龍五", longwu, hm);
          lookPoker("馮佳", me, hm);
          lookPoker("底牌", dipai, hm);
          
      }
      
      public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
          System.out.print(name + "的牌是:");
          for (Integer index : ts) {
              System.out.print(hm.get(index) + " ");
          }
          
          System.out.println();
      }
    

18.15_集合框架(泛型固定下邊界)

  • ? super E 拿出來到比較器中做比較, TreeMap(Comparator<? super K> comparator);
  • ? extends E 放進(jìn)去,放入父類對(duì)象集合, boolean addAll(Collection<? extends E> c);

18.16_day18總結(jié)

  • 把今天的知識(shí)點(diǎn)總結(jié)一遍髓迎。
    泛型
    1.要會(huì)使用泛型 class ArrayList<E> ...
    List<Student> list = new ArrayList<>();
    2.如果定義泛型類 泛型方法 泛型接口
    固定格式 套路
    多做練習(xí)
    集合
    單列集合Collection根接口
    一些方法
    List接口
    新增 一些 和 index 有關(guān)的方法
    ArrayList Vector LinkedList[頭部 尾部 添加刪除]

    Set不可重復(fù) 無序
    HashSet
    自定義類 往 HashSet中添加峦朗,必須重寫 hashCode equals
    TreeSet
    自定義類 往 TreeSet中添加,必須指定比較器
    1.實(shí)現(xiàn)Comparable接口
    2.實(shí)例化一個(gè)Comparator類對(duì)象

    Map<key,value>
    HashMap
    自定義類 作為Key 往 HashMap中添加,必須重寫 hashCode equals
    TreeMap
    自定義類 作為Key 往 TreeMap中添加,必須指定比較器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末排龄,一起剝皮案震驚了整個(gè)濱河市波势,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌橄维,老刑警劉巖尺铣,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異争舞,居然都是意外死亡凛忿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門竞川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來店溢,“玉大人,你說我怎么就攤上這事委乌〈材粒” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵遭贸,是天一觀的道長(zhǎng)戈咳。 經(jīng)常有香客問我,道長(zhǎng)壕吹,這世上最難降的妖魔是什么著蛙? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮算利,結(jié)果婚禮上册踩,老公的妹妹穿的比我還像新娘。我一直安慰自己效拭,他們只是感情好暂吉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布胖秒。 她就那樣靜靜地躺著,像睡著了一般慕的。 火紅的嫁衣襯著肌膚如雪阎肝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天肮街,我揣著相機(jī)與錄音风题,去河邊找鬼。 笑死嫉父,一個(gè)胖子當(dāng)著我的面吹牛沛硅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绕辖,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摇肌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仪际?” 一聲冷哼從身側(cè)響起围小,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎树碱,沒想到半個(gè)月后肯适,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成榜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年框舔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伦连。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雨饺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惑淳,到底是詐尸還是另有隱情额港,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布歧焦,位于F島的核電站移斩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绢馍。R本人自食惡果不足惜向瓷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舰涌。 院中可真熱鬧猖任,春花似錦、人聲如沸瓷耙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至长搀,卻和暖如春宇弛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背源请。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工枪芒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谁尸。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓舅踪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親良蛮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硫朦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354