Java基礎

一、數(shù)組

1、數(shù)組的使用

Java 中操作數(shù)組只需要四個步驟:
1、 聲明數(shù)組
語法: 數(shù)據(jù)類型[ ] 數(shù)組名;
或者 數(shù)據(jù)類型 數(shù)組名[ ];
其中,數(shù)組名可以是任意合法的變量名,如:


image.png

2、 分配空間
簡單地說,就是指定數(shù)組中最多可存儲多少個元素
語法: 數(shù)組名 = new 數(shù)據(jù)類型 [ 數(shù)組長度 ];
其中,數(shù)組長度就是數(shù)組中能存放元素的個數(shù),如:


image.png

話說,我們也可以將上面的兩個步驟合并,在聲明數(shù)組的同時為它分配空間,如:


image.png

3、 賦值
分配空間后就可以向數(shù)組中放數(shù)據(jù)了,數(shù)組中元素都是通過下標來訪問的,例如向 scores 數(shù)組中存放學生成績


image.png

4、 處理數(shù)組中數(shù)據(jù)
我們可以對賦值后的數(shù)組進行操作和處理,如獲取并輸出數(shù)組中元素的值


image.png

在 Java 中還提供了另外一種直接創(chuàng)建數(shù)組的方式,它將聲明數(shù)組、分配空間和賦值合并完成,如


image.png

它等價于:


image.png

2、使用Arrays類操作Java中的數(shù)組

Arrays 類是 Java 中提供的一個工具類,在 java.util 包中。該類中包含了一些方法用來直接操作數(shù)組,比如可直接實現(xiàn)數(shù)組的排序、搜索等(關于類和方法的相關內(nèi)容在后面的章節(jié)中會詳細講解滴~~)。
Arrays 中常用的方法:
1、 排序
語法: Arrays.sort(數(shù)組名);
可以使用 sort( ) 方法實現(xiàn)對數(shù)組的排序,只要將數(shù)組名放在 sort( ) 方法的括號中,就可以完成對該數(shù)組的排序(按升序排列),如:


image.png

運行結果:


image.png

2、 將數(shù)組轉(zhuǎn)換為字符串
語法: Arrays.toString(數(shù)組名);
可以使用 toString( ) 方法將一個數(shù)組轉(zhuǎn)換成字符串,該方法按順序把多個數(shù)組元素連接在一起,多個元素之間使用逗號和空格隔開,如:


image.png

運行結果為:

輸出數(shù)組nums中的元素:[25,7,126,53,14,86]

3、使用 foreach 操作數(shù)組

foreach 并不是 Java 中的關鍵字,是 for 語句的特殊簡化版本,在遍歷數(shù)組、集合時, foreach 更簡單便捷。從英文字面意思理解 foreach 也就是“ for 每一個”的意思,那么到底怎么使用 foreach 語句呢?
語法:


image.png

我們分別使用 for 和 foreach 語句來遍歷數(shù)組


image.png

運行結果:


image.png

看到 foreach 的方便了吧??!
留個思考問題給大家:如果想在 foreach 語句中獲取數(shù)組元素的下標,該如何做呢??

4、Java 中的二維數(shù)組

所謂二維數(shù)組,可以簡單的理解為是一種“特殊”的一維數(shù)組,它的每個數(shù)組空間中保存的是一個一維數(shù)組。
那么如何使用二維數(shù)組呢,步驟如下:
1、 聲明數(shù)組并分配空間


image.png

或者


image.png

如:


image.png

2、 賦值
二維數(shù)組的賦值,和一維數(shù)組類似,可以通過下標來逐個賦值,注意索引從 0 開始


image.png

也可以在聲明數(shù)組的同時為其賦值


image.png

如:


image.png

3、 處理數(shù)組
二維數(shù)組的訪問和輸出同一維數(shù)組一樣,只是多了一個下標而已。在循環(huán)輸出時,需要里面再內(nèi)嵌一個循環(huán),即使用二重循環(huán)來輸出二維數(shù)組中的每一個元素。如:


image.png

運行結果:


image.png

需要了解的:在定義二維數(shù)組時也可以只指定行的個數(shù),然后再為每一行分別指定列的個數(shù)。如果每行的列數(shù)不同,則創(chuàng)建的是不規(guī)則的二維數(shù)組,如下所示:


image.png

運行結果為:


image.png

二、面向?qū)ο?/h2>

1、什么是 Java 中的內(nèi)部類

問:什么是內(nèi)部類呢?
答:內(nèi)部類( Inner Class )就是定義在另外一個類里面的類。與之對應,包含內(nèi)部類的類被稱為外部類。
問:那為什么要將一個類定義在另一個類里面呢?清清爽爽的獨立的一個類多好?。。?br> 答:內(nèi)部類的主要作用如下:

  1. 內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個包中的其他類訪問該類
  2. 內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù),包括私有的數(shù)據(jù)
  3. 內(nèi)部類所實現(xiàn)的功能使用外部類同樣可以實現(xiàn),只是有時使用內(nèi)部類更方便
    問:內(nèi)部類有幾種呢?
    答:內(nèi)部類可分為以下幾種:
    ·成員內(nèi)部類
    ·靜態(tài)內(nèi)部類
    ·方法內(nèi)部類
    ·匿名內(nèi)部類

2、Java 中的成員內(nèi)部類

內(nèi)部類中最常見的就是成員內(nèi)部類,也稱為普通內(nèi)部類。我們來看如下代碼:


image.png

運行結果為:
從上面的代碼中我們可以看到,成員內(nèi)部類的使用方法:
1、 Inner 類定義在 Outer 類的內(nèi)部,相當于 Outer 類的一個成員變量的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等
2、 Inner 類中定義的 test() 方法可以直接訪問 Outer 類中的數(shù)據(jù),而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性a
3、 定義了成員內(nèi)部類后,必須使用外部類對象來創(chuàng)建內(nèi)部類對象,而不能直接去 new 一個內(nèi)部類對象,即:內(nèi)部類 對象名 = 外部類對象.new 內(nèi)部類( );
4、 編譯上面的程序后,會發(fā)現(xiàn)產(chǎn)生了兩個 .class 文件


image.png

其中,第二個是外部類的 .class 文件,第一個是內(nèi)部類的 .class 文件,即成員內(nèi)部類的 .class 文件總是這樣:外部類名$內(nèi)部類名.class
另外,友情提示哦:
1、 外部類是不能直接使用內(nèi)部類的成員和方法滴


image.png

可先創(chuàng)建內(nèi)部類的對象,然后通過內(nèi)部類的對象來訪問其成員變量和方法。
2、 如果外部類和內(nèi)部類具有相同的成員變量或方法,內(nèi)部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字。如:


image.png

運行結果:
image.png

3、Java 中的靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類是 static 修飾的內(nèi)部類,這種內(nèi)部類的特點是:
1、 靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同,可通過“類名.靜態(tài)成員”訪問外部類的靜態(tài)成員;如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱不相同,則可通過“成員名”直接調(diào)用外部類的靜態(tài)成員
3、 創(chuàng)建靜態(tài)內(nèi)部類的對象時,不需要外部類的對象,可以直接創(chuàng)建 內(nèi)部類 對象名= new 內(nèi)部類();


image.png

運行結果 :


image.png

4、方法內(nèi)部類

方法內(nèi)部類就是內(nèi)部類定義在外部類的方法中,方法內(nèi)部類只在該方法的內(nèi)部可見,即只在該方法內(nèi)可以使用。


image.png

一定要注意哦:由于方法內(nèi)部類不能在外部類的方法以外的地方使用,因此方法內(nèi)部類不能使用訪問控制符和 static 修飾符。

三、異常

1、概念

1.異常:有異于常態(tài),和正常情況不一樣,有錯誤出現(xiàn),阻止當前方法或作用域。
2.異常處理:將出現(xiàn)的異常提示給編程人員與用戶,使原本將要中斷的程序繼續(xù)運行或者退出。并且能夠保存數(shù)據(jù)和釋放資源。
2、異常體系結構
1.所有異常都繼承于Throwable類,其下有兩大子類:
(1)Error類:錯誤,一般編程人員不太接觸,如虛擬機錯誤、線程死鎖。硬傷:使程序崩潰
(2)Exception類:異常,編碼、環(huán)境、用戶輸入等問題,其子類主要有:
·非檢查異常(運行時異常RuntimeException):【由java虛擬機自動捕獲】如空指針NullPointer、越界ArrayIndexOutofBounds、錯誤類型轉(zhuǎn)換ClassCast、算數(shù)異常Arithmetic等
·檢查異常CheckException:【需要手動添加捕獲和處理語句】文件異常IO等


image.png

3、異常處理
1.try-catch(多catch塊)-finally
(1)try塊:負責捕獲異常,一旦try中發(fā)現(xiàn)異常,程序的控制權將被移交給catch塊中的異常處理程序?!総ry語句塊不可以獨立存在,必須與 catch 或者 finally 塊同存】
(2)catch塊:如何處理?比如發(fā)出警告:提示、檢查配置、網(wǎng)絡連接,記錄錯誤等。執(zhí)行完catch塊之后程序跳出catch塊,繼續(xù)執(zhí)行后面的代碼。
·編寫catch塊的注意事項:多個catch塊處理的異常類,要按照先catch子類后catch父類的處理方式,因為會【就近處理】異常(由上自下)。
(3)finally:最終執(zhí)行的代碼,用于關閉和釋放資源等
代碼如下

try{
//一些會拋出的異常
}catch(Exception e){
//處理該異常的代碼塊
}finally{
//最終要執(zhí)行的代碼
} 

終止執(zhí)行,交由異常處理程序(拋出提醒或記錄日志等),異常代碼塊外代碼正常執(zhí)行。
try會拋出很多種類型的異常,多個catch塊捕獲多鐘錯誤。
多重異常處理代碼塊順序問題:先子類再父類(順序不對也會提醒錯誤),finally語句塊處理最終將要執(zhí)行的代碼.
catch順序為從子類到父類,如圖:


image.png

四、Java 中字符串的不變性

String 對象創(chuàng)建后則不能被修改,是不可變的,所謂的修改其實是創(chuàng)建了新的對象,所指向的內(nèi)存空間不同。如下所示:

運行結果:

結合上面的代碼,關于字符串小伙伴們必須需要了解滴:

1、 通過 String s1="愛慕課"; 聲明了一個字符串對象, s1 存放了到字符串對象的引用,在內(nèi)存中的存放引用關系如下圖所示:

然后通過 s1="歡迎來到:"+s1; 改變了字符串 s1 ,其實質(zhì)是創(chuàng)建了新的字符串對象,變量 s1 指向了新創(chuàng)建的字符串對象,如下圖所示:

2、 一旦一個字符串在內(nèi)存中創(chuàng)建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用StringBuffer或者StringBuilder(后面章節(jié)中會講到)。

3、 每次 new 一個字符串就是產(chǎn)生一個新的對象,即便兩個字符串的內(nèi)容相同,使用 ”==” 比較時也為 ”false” ,如果只需比較內(nèi)容是否相同,應使用 ”equals()” 方法(前面條件運算符章節(jié)講過哦~~)

1、Java 中 String 類的常用方法 Ⅰ

String 類提供了許多用來處理字符串的方法,例如,獲取字符串長度、對字符串進行截取、將字符串轉(zhuǎn)換為大寫或小寫、字符串分割等,下面我們就來領略它的強大之處吧。

String 類的常用方法:

結合代碼來熟悉一下方法的使用:

運行結果:

、

友情提示:

1. 字符串 str 中字符的索引從0開始,范圍為 0 到 str.length()-1

2. 使用 indexOf 進行字符或字符串查找時,如果匹配返回位置索引;如果沒有匹配結果,返回 -1

3. 使用 substring(beginIndex , endIndex) 進行字符串截取時,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符

2、Java 中的 String 類常用方法 Ⅱ

我們繼續(xù)來看 String 類常用的方法,如下代碼所示:

運行結果:

那么,“==” 和 equals() 有什么區(qū)別呢?

==: 判斷兩個字符串在內(nèi)存中首地址是否相同,即判斷是否是同一個字符串對象

equals(): 比較存儲在兩個字符串對象中的內(nèi)容是否一致

PS:字節(jié)是計算機存儲信息的基本單位,1 個字節(jié)等于 8 位, gbk 編碼中 1 個漢字字符存儲需要 2 個字節(jié)1 個英文字符存儲需要 1 個字節(jié)。所以我們看到上面的程序運行結果中,每個漢字對應兩個字節(jié)值,如“學”對應 “-47 -89” ,而英文字母 “J” 對應 “74” 。同時,我們還發(fā)現(xiàn)漢字對應的字節(jié)值為負數(shù),原因在于每個字節(jié)是 8 位,最大值不能超過 127,而漢字轉(zhuǎn)換為字節(jié)后超過 127,如果超過就會溢出,以負數(shù)的形式顯示。

3、 Java 中的 StringBuilder 類

在Java中,除了可以使用 String 類來存儲字符串,還可以使用 StringBuilder 類或 StringBuffer 類存儲字符串,那么它們之間有什么區(qū)別呢?

String 類具有是不可變性。如

運行結果:

從運行結果中我們可以看到,程序運行時會額外創(chuàng)建一個對象,保存 "helloworld"。當頻繁操作字符串時,就會額外產(chǎn)生很多臨時變量。使用 StringBuilder 或 StringBuffer 就可以避免這個問題。至于 StringBuilder 和StringBuffer ,它們基本相似,不同之處,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現(xiàn)線程安全功能,所以性能略高。因此一般情況下,如果需要創(chuàng)建一個內(nèi)容可變的字符串對象,應優(yōu)先考慮使用 StringBuilder 類。

那么如何定義 StringBuilder 類的對象呢? 我們來看下面的代碼:

運行結果: imooc

4、 Java 中的 StringBuilder 類的常用方法

StringBuilder 類提供了很多方法來操作字符串:

例如:在下面的示例代碼中,創(chuàng)建了 StringBuilder 對象,用來存儲字符串,并對其做了追加和插入操作。這些操作修改了 str 對象的值,而沒有創(chuàng)建新的對象,這就是 StringBuilder 和 String 最大的區(qū)別。

運行結果:

5、使用 Date 和 SimpleDateFormat 類表示時間

在程序開發(fā)中,經(jīng)常需要處理日期和時間的相關數(shù)據(jù),此時我們可以使用 java.util 包中的 Date 類。這個類最主要的作用就是獲取當前時間,我們來看下 Date 類的使用:

image.png

使用 Date 類的默認無參構造方法創(chuàng)建出的對象就代表當前時間,我們可以直接輸出 Date 對象顯示當前的時間,顯示的結果如下:

image.png

其中, Wed 代表 Wednesday (星期三), Jun 代表 June (六月), 11 代表 11 號, CST 代表 China Standard Time (中國標準時間,也就是北京時間,東八區(qū))。

從上面的輸出結果中,我們發(fā)現(xiàn),默認的時間格式不是很友好,與我們?nèi)粘?吹降娜掌诟袷讲惶粯?,如果想要按指定的格式進行顯示,如 2014-06-11 09:22:30 ,那該怎么做呢?

此時就到了 java.text 包中的 SimpleDateFormat 類大顯身手的時候了!!可以使用 SimpleDateFormat 來對日期時間進行格式化,如可以將日期轉(zhuǎn)換為指定格式的文本,也可將文本轉(zhuǎn)換為日期。

1. 使用 format() 方法將日期轉(zhuǎn)換為指定格式的文本

image.png

代碼中的 “yyyy-MM-dd HH:mm:ss” 為預定義字符串, yyyy 表示四位年, MM 表示兩位月份, dd 表示兩位日期, HH 表示小時(使用24小時制), mm 表示分鐘, ss 表示秒,這樣就指定了轉(zhuǎn)換的目標格式,最后調(diào)用 **format() **方法將時間轉(zhuǎn)換為指定的格式的字符串。

運行結果: 2014-06-11 09:55:48

2. 使用 parse() 方法將文本轉(zhuǎn)換為日期

image.png

代碼中的 “yyyy年MM月dd日 HH:mm:ss” 指定了字符串的日期格式,調(diào)用 **parse() **方法將文本轉(zhuǎn)換為日期。

運行結果:
image.png

一定要注意哦:

1、 調(diào)用 SimpleDateFormat 對象的 parse() 方法時可能會出現(xiàn)轉(zhuǎn)換異常,即 ParseException ,因此需要進行異常處理

2、 使用 Date 類時需要導入 java.util 包,使用 SimpleDateFormat 時需要導入 java.text 包

6、Calendar 類的應用

Date 類最主要的作用就是獲得當前時間,同時這個類里面也具有設置時間以及一些其他的功能,但是由于本身設計的問題,這些方法卻遭到眾多批評,不建議使用,更推薦使用 Calendar 類進行時間和日期的處理。

java.util.Calendar 類是一個抽象類,可以通過調(diào)用 getInstance()靜態(tài)方法獲取一個 Calendar 對象,此對象已由當前日期時間初始化,即默認代表當前時間,如 Calendar c = Calendar.getInstance();

那么如何使用 Calendar 獲取年、月、日、時間等信息呢?我們來看下面的代碼:

image.png

其中,調(diào)用 Calendar 類的 getInstance() 方法獲取一個實例,然后通過調(diào)用 get() 方法獲取日期時間信息,參數(shù)為需要獲得的字段的值, Calendar.Year 等為 Calendar 類中定義的靜態(tài)常量。

運行結果:
image.png

Calendar 類提供了 getTime() 方法,用來獲取 Date 對象,完成 Calendar 和 Date 的轉(zhuǎn)換,還可通過 getTimeInMillis() 方法,獲取此 Calendar 的時間值,以毫秒為單位。如下所示:

image.png

運行結果:

image.png

7、使用 Math 類操作數(shù)據(jù)

Math 類位于 java.lang 包中,包含用于執(zhí)行基本數(shù)學運算的方法, Math 類的所有方法都是靜態(tài)方法,所以使用該類中的方法時,可以直接使用類名.方法名,如: Math.round();

常用的方法:

image.png

通過案例我們來認識一下他們的使用吧??!

image.png

運行結果:

image.png

PS: Math 類還提供了許多其他方法,各位小伙伴們可以注意關注 wiki ,查閱更多信息

五、集合

1、集合框架概述

JAVA集合框架體系結構:Collection與Map是兩個根接口。
Collection接口:內(nèi)部存儲的是一個個獨立的對象。包含:
1.List接口:序列,存儲元素排列有序且可重復。實現(xiàn)類:ArrayList,數(shù)組序列。實現(xiàn)類:LinkedList,鏈表。
2.Queue接口:隊列,存儲元素排列有序且可重復。實現(xiàn)類:LinkedList,鏈表。
3.Set接口:集,存儲元素無序且不可重復。實現(xiàn)類:HashSet,哈希集。
Map接口:內(nèi)部以<Key,Value>兩個對象(任意類型)為一個映射去存儲數(shù)據(jù),這一個映射就是Entry類(Map的內(nèi)部類)的實例。包括:實現(xiàn)類:HashMap,哈希表。


image.png

2、List接口值ArrayList類

1.ArrayList類中的add方法可以向列表中插入成員,插入的成員依照插入的時間向后排列,如果在前面制定了插入的下標,那么原來下標所在位置及其后面的所有成員均向后挪。
2.添加進list中的位置(index)介于0和length之間;0代表插到隊頭,length代表插到隊尾。
3.如果插入的位置大于length或小于0,則會出現(xiàn)數(shù)組下表越界異常。
4.addAll方法可以將collection對象插入到ArrayList當中,亦可以指定下標添加。ArrayList.asList()方法可以將數(shù)組轉(zhuǎn)化為arrayList。
5.set方法可以修改指定下標所在的成員的值。
6.刪除方法remove()和removeAll()的用法同add()、addAll()方法相同。

3、使用迭代器遍歷列表

//使用Iterator迭代器遍歷列表
Iterator it = testList.iterator();
while(it.hasNext()){
    System.out.println(""+it.next());
}

4、使用foreach方法遍歷列表

//注意ArrayList里面沒有指定泛型的話都是以Object類來存儲的,取出之后需要強轉(zhuǎn)
for(Object obj:testList){
    int a = (int)obj;
     System.out.println(""+a);
}

5、泛型

this.ArrayList=new ArrayList<OBJ>(); //為List確定存入數(shù)據(jù)的類型即為泛型;
1.可以實現(xiàn)在編譯前告警其裝入數(shù)據(jù)對象類型的情況。
2.泛型確定后不再需要做List取出元素的強制類型轉(zhuǎn)換.
3.泛型約定之后除了可以往里放入指定的類型之外,還可以放入指定類型的子類。
4.泛型不能規(guī)定基本類型,例如int、long、boolean等,如果要使用,必須使用其包裝類,如Integer、Long、Boolean等。

6、Set類當中的HashSet類

1.哈希集是無序的且不重復的,所以無法使用get()方法根據(jù)指定下標取值。
2.哈希集的增刪方法的用法與ArrayList相同。
3.哈希集可以往里增加null值。

7、Map類當中的HashMap類

  1. Map接口提供了一中映射關系,其中的元素是鍵值對(key-value)的形式存儲的,能夠?qū)崿F(xiàn)根據(jù)Key快速查找value。Key-value可以是任何對象,是以Entry類型的對象實例存在的。
    2.Key是不可以重復的,Value是可以重復的。Key-value都可以為null,不過只能有一個key是null。
    3.map支持泛型,Map<K,V>。
    4.每個鍵最多只能映射到一個值。
    5.HashMap中的Entry對象是無序排列的,HashMap是Map的一個重要實現(xiàn)類,也是最常用的,基于哈希表是實現(xiàn)。
    6.HashMap通過put(K key,V value)增加/修改數(shù)據(jù),remove(Object key)刪除數(shù)據(jù),通過get(Object key)查詢映射關系,size()方法返回此映射關系中的鍵-值關系數(shù)。

8、判斷List中是否存在

List 的 contains()方法的真是內(nèi)幕是,主動便利List中的每一個元素,并使用Objet類的equals方法,和傳進來的引用依次做比較,一旦發(fā)現(xiàn)傳進來的對象和某個元素指向的是同一塊內(nèi)存那么就返回true。
知道contains方法的工作原理之后,就可以這樣。這里還以courseToSelect序列為例,我穿進去的不是引用對象了,換成課程名稱,也就是說,使用contains判斷輸入的名稱是否為某值的課程。這是就是需要改寫一下Course類的equals方法即可。
這里改寫equals方法堪稱經(jīng)典模版 改寫 比較兩個引用指向內(nèi)存的內(nèi)容是不是相同 這是 是包含 二者指向同一個內(nèi)存塊的情況

public void equals (Object obj)
{
  if(this == obj)  // 指向同一個內(nèi)存快 必然是相同的
     returned true;  //為什么contains(course2) 返回的是false 原因就在在這里 只是比較了一下 引用的值是否相同 沒有進一步的比較 內(nèi)存塊中的值 下就是對這里記性了改寫
  if (obj == null)  // 如果obj為空 就直接沒有戲了
     return false;
  if(! (obj instanceof Course))  //如果兩者的不屬于同一類型則 也直接沒戲了
    return false;
  //經(jīng)過以上的這么多的比較 終于可以判斷二者的值是不是相同了
  //首相要把objet型的obj轉(zhuǎn)成 Course
  Course course = (Course)  obj;
  if( this.name == null )
  {
     if(course.name == null )
        return true;
     else return false;
   }
   else
   {
     if(this.name.equals(course.name)) return true;
     else return false;
   )
   //如果還有別的屬性接著寫
}

9、判斷Set中是否存在

使用set中的contains方法,set中調(diào)用contains(obj)方法,contains方法的實現(xiàn)機制:
先調(diào)用object中的hashcode方法,再調(diào)用object中的equals方法。
所以要對對象的hashcode()方法和equals方法重寫。
可以使用eclipse中的source>GENARATE hashcode(),在對象的類中,實現(xiàn)方法的重寫。

10、判斷Map中是否存在

Map中通過containsKey()方法和containsValue()方法來判斷鍵和值是否存在。
Map 中對對象進行了 Key 標記,通過 get(Key)可以取得對應的對象。
Map 的containsValue()方法的參數(shù)是 Object 對象,因為Map 的 Value 值是對象元素。
Map 的containsKey()方法判斷Map 映射中是否有該 Key 值。
List中的contains()方法借Map中的containsValue()方法調(diào)用equals()方法來進行比較。所以要重寫Hashcode和equals方法。
跟 List 的 contains()方法一樣,Map 中的 containsValue()方法也會調(diào)用每個 Value 值的 equals()方法去和參數(shù)對象比較。

id 是string類型 contains方法使用equals方法 來比較,所以值相等就返回ture
Value 是Student類型,自己定義的,默認的contains方法中的equals方法,比較的是兩個引用是否一樣,所以要重寫equals方法
由于是比較兩student類型是否相同,所以要做Student類中重寫equals方法

11、獲取List中的索引值

indexOf()方法與lastIndexOf()方法實現(xiàn)原理:
1、遍歷調(diào)用每個元素的equals()方法,如果返回true則將次元素的索引返回;
2、如果有多個相同元素,則只返回第一個元素的索引;
3、indexOf從第一個元素開始遍歷,返回元素第一次出現(xiàn)的位置;lastIndexOf()方法則從最后一個元素開始遍歷,返回元素最后一次出現(xiàn)的位置。如果沒有該元素,則返回-1。

12、Collections工具類

1.可以對數(shù)值和字符串List進行排序;
2.可以對實現(xiàn)了Comparable接口的對象和Comparator接口的對象進行比較;

13、Comparable接口和Comparator接口

compareable 是默認比較規(guī)則, comparator是臨時比較規(guī)則
1.Comparable接口------可比較的
實現(xiàn)該接口表示:這個類的實例可以比較大小,可以進行自然排序
定義了默認的比較規(guī)則
其實現(xiàn)類需實現(xiàn)compareTo()方法
comparaTo()方法返回正數(shù)表示大,負數(shù)表示小,0表示相等
2.Comparator接口-----比較工具接口
用于定義臨時比較規(guī)則,而不是默認比較規(guī)則
其實現(xiàn)類需要實現(xiàn)compare()方法
Comparator和Comparable都是Java集合框架的成員

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、一個".java"源文件中是否可以包括多個類(不是內(nèi)部類)?有什么限制?答:可以有多個類,但只能有一個publ...
    岳小川閱讀 1,015評論 0 2
  • 前言:最近感冒的不太想去面試,在家就對Java se的基礎做了一些小總結 1.JDK和JRE的區(qū)別 一 基礎知識 ...
    AntCode閱讀 1,205評論 0 1
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,806評論 0 11
  • Win7下如何打開DOS控制臺? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,702評論 4 12
  • 今天和幾個同事來了一次小范圍的聚會,五個人都在同一年齡段,聚在一起仿佛有說不完的話題~~扯扯部門的亂事,發(fā)發(fā)牢...
    胡茬兒_00c0閱讀 260評論 0 0

友情鏈接更多精彩內(nèi)容