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
- a:javac編譯的時(shí)候帶上-d即可
10.04_面向?qū)ο?不同包下類之間的訪問)(掌握)
- A:案例演示
- 不同包下類之間的訪問
- com.包名.類名 去使用別的類。
- 注意:在不同的包中淋样,默認(rèn)修飾符 的成員不能使用耗式;
- 封裝:隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問方式趁猴。
10.05_面向?qū)ο?import關(guān)鍵字的概述和使用)(掌握)
- A:案例演示
- 為什么要有import
- 其實(shí)就是讓有包的類對(duì)調(diào)用者可見,不用寫全類名了
- 為什么要有import
- 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
- 當(dāng)前目錄 Student.java Test.java
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
- a:Java代碼區(qū)域的字體大小和顏色:
- 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ū)域中刪除
- 從硬盤上刪除
- 選中項(xiàng)目 – 右鍵 – 刪除
- 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)
- Debug:斷點(diǎn)測(cè)試的地方
-
如何去斷點(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:它的值等于:
- 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]"
- 舉例:
- 需求:把數(shù)組中的數(shù)據(jù)按照指定個(gè)格式拼接成一個(gè)字符串
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;
- }
- 需求:把字符串反轉(zhuǎn)
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ū)本身
- public StringBuffer append(String str):
13.04_常見對(duì)象(StringBuffer的刪除功能)
- A:StringBuffer的刪除功能
- public StringBuffer deleteCharAt(int index):
- 刪除指定位置的字符署恍,并返回本身
- public StringBuffer delete(int start,int end):
- 刪除從指定位置開始指定位置結(jié)束的內(nèi)容崎溃,并返回本身
- public StringBuffer deleteCharAt(int index):
13.05_常見對(duì)象(StringBuffer的替換和反轉(zhuǎn)功能)
- A:StringBuffer的替換功能
- public StringBuffer replace(int start,int end,String str):
- 從start開始到end用str替換
- public StringBuffer replace(int start,int end,String str):
- B:StringBuffer的反轉(zhuǎn)功能
- public StringBuffer reverse():
- 字符串反轉(zhuǎn)
- public StringBuffer reverse():
13.06_常見對(duì)象(StringBuffer的截取功能及注意事項(xiàng))
- A:StringBuffer的截取功能
- public String substring(int start):
- 從指定位置截取到末尾
- public String substring(int start,int end):
- 截取從指定位置開始到結(jié)束位置,包括開始位置盯质,不包括結(jié)束位置
- public String substring(int start):
- 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)改變了我最原始的元素索引。
- 如果數(shù)組無序,就不能使用二分查找破镰。
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)
- 區(qū)別1 :
- 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)
- 區(qū)別1 :
- 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版
-
底層借助迭代器實(shí)現(xiàn).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); }
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)
- 可以保證怎么存就怎么取
- 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
- a.自然順序(Comparable)
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è)值
- 查看API可以知道:
- 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
- 如果鍵不是第一次存在,就用值把以前的值替換掉魔招,返回以前的值
- V put(K key,V value):添加元素始赎。
- 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ù)
- a:添加功能
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)的可以保證怎么存就怎么取
- LinkedHashMap的特點(diǎ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值
- HashMap和Hashtable的區(qū)別
- 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中添加,必須指定比較器