第一篇:Java基礎(chǔ)總結(jié)
? 基本數(shù)據(jù)類型
? 變量單元直接存放數(shù)據(jù)
? 賦值和傳參的方式:傳值,即傳遞副本
? 比較相等使用關(guān)系運(yùn)算符“==”
? 引用數(shù)據(jù)類型
? 變量單元存放引用即對(duì)象地址,而數(shù)據(jù)(對(duì)象)在另一內(nèi)存區(qū)域存放。
? 賦值和傳參的方式:傳引用(傳遞對(duì)象的地址),即傳遞對(duì)象本身。
? 使用關(guān)系運(yùn)算符“==”比較兩個(gè)引用類型變量,比較的是地址,如果比較結(jié)果為
真,說(shuō)明兩個(gè)變量引用了同一對(duì)象。
? 比較兩個(gè)對(duì)象是否相等應(yīng)使用equals方法
? Java是面向?qū)ο蟮恼Z(yǔ)言,開(kāi)發(fā)Java程序就是開(kāi)發(fā)Java類,Java的變量定義、方法(函
數(shù))和語(yǔ)句都必須在類中書(shū)寫,“無(wú)類即無(wú)Java”。
? 類的實(shí)例成員
屬性(成員變量):直接定義在類體中的變量(注:在方法或語(yǔ)句塊中定義的變量不是屬性)
方法:直接定義在類體中的方法。
類成員:直接定義在類體中的內(nèi)部類,即類成員。
注:對(duì)象的成員是從屬于對(duì)象的,必須通過(guò)對(duì)象訪問(wèn),在Java中不存在脫離對(duì)象和類而獨(dú)立存在的屬性和方法。
? 類、方法、語(yǔ)句三者的關(guān)系:
類中包含方法,方法中包含語(yǔ)句;方法中不能嵌套方法;語(yǔ)句不能直接寫在類體中。
? 變量的作用域
? 局部變量-方法的參數(shù)、方法體中定義的變量、語(yǔ)句塊中定義的變量,僅在所定義的方法體或語(yǔ)句塊中有效。
? 屬性-在整個(gè)類體中有效。
? 公有的屬性-其它類可以本類對(duì)象訪問(wèn)。
? 私有的屬性-僅限本類內(nèi)訪問(wèn)
? 局部變量(無(wú)論基本類型還是引用類型)在棧內(nèi)存中,對(duì)象在堆內(nèi)存中。注:引用類型的局部變量?jī)?nèi)存放是對(duì)象的引用(即地址),而對(duì)象在堆內(nèi)存中。
? 方法的重載-在同一類中多個(gè)方法同名的語(yǔ)法現(xiàn)象,方法重載應(yīng)符合以下條件:
? 方法同名
? 參數(shù)有所不同(即類型、個(gè)數(shù)和順序三者至少有一個(gè)不同)
注:方法是否重載不考慮返回類型等其它方面。
? 包和訪問(wèn)修飾符
? 包-類的目錄結(jié)構(gòu),主要用途是方便類的管理。
? 類的簡(jiǎn)稱:不含包名的類名
? 類的全限定名稱(類的全稱):帶包名的類名。
? 訪問(wèn)修飾符
? private-僅限本類內(nèi)訪問(wèn)
? public-任何類都能夠訪問(wèn)
? 默認(rèn)-限本包的類訪問(wèn)
? protected--限本包的類訪問(wèn)和子類的訪問(wèn)
? 類的成員(屬性、方法和成員內(nèi)部類)可以使用四種訪問(wèn)修飾符,頂級(jí)外部類僅能
使用public和默認(rèn)兩種修飾符。
? 數(shù)組
? 基本類型的數(shù)組的元素放的是數(shù)據(jù)
? 對(duì)象數(shù)據(jù)的元素放的是對(duì)象的引用
? 二維數(shù)組實(shí)際上是一個(gè)維數(shù)組,而其每個(gè)元素又是一個(gè)一維數(shù)組。
? 構(gòu)造方法-與類名同名并且無(wú)返回類型的方法
? 構(gòu)造方法的作用是創(chuàng)建對(duì)象,僅能通過(guò)new關(guān)鍵字調(diào)用。
? 類中未顯式定義構(gòu)造方法時(shí),類中會(huì)有默認(rèn)的構(gòu)造方法(即一個(gè)public、無(wú)參的構(gòu)
造方法);類中一旦定義顯式定義構(gòu)造方法,將不再產(chǎn)生默認(rèn)的構(gòu)造方法。
? 構(gòu)造方法可以重載
? 構(gòu)造方法只能可以使用四個(gè)訪問(wèn)修飾符,不可以使用其它修飾符(如static、final
等)。
? this關(guān)鍵字
? this表示本對(duì)象或?qū)ο笞陨淼囊?/p>
? 通過(guò)this可以調(diào)用本類的成員方法和屬性
? 通過(guò)this可以調(diào)用本類的構(gòu)造方法,this調(diào)用構(gòu)造方法的語(yǔ)句必須寫在構(gòu)造方法的第一句。
? 實(shí)例成員和靜態(tài)成員
? 類的成員(屬性、方法和成員類)可劃分為靜態(tài)成員和實(shí)例成員。
? 實(shí)例成員是屬于對(duì)象的,隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的銷毀而銷毀。? 靜態(tài)成員是屬于類的,隨著類的加載而存在,隨著類的銷毀而銷毀。
? 使用static修飾的成員是靜態(tài)成員,未使用static修飾的成員是實(shí)例成員。? 靜態(tài)成員內(nèi)不能使用this關(guān)鍵字。
? this表示當(dāng)前對(duì)象的引用。
? 對(duì)象的初始化
? 第一:實(shí)例屬性賦默認(rèn)值
? 第二:實(shí)例屬性賦初值
? 第三:執(zhí)行對(duì)象初始化塊
? 第四:執(zhí)行構(gòu)造方法
? 類的初始化
? 第一:靜態(tài)屬性賦默認(rèn)值
? 第二:靜態(tài)屬性賦初值
? 第三:執(zhí)行靜態(tài)塊
? 繼承的基本概念
? Java僅支持單繼承
?
?
?
?
? ? 如果一個(gè)類沒(méi)有顯式繼承任何類,則隱式繼承java.lang.Object類 ? 子類擁有父類的一切,子類對(duì)象由兩部分構(gòu)成:父類對(duì)象部分和子類個(gè)性化的部分。? 子類并不能訪問(wèn)父類的一切: ? 子類可以訪問(wèn)父類的public成員和protected成員 ? 子類不可以訪問(wèn)父類的private成員 ? 僅當(dāng)子類與父類同在一包時(shí),子類方可以訪問(wèn)父類的默認(rèn)訪問(wèn)控制的成員。繼承與類和對(duì)象的初始化 ? 構(gòu)造子類對(duì)象時(shí),首先構(gòu)造父類對(duì)象,其次構(gòu)造子類個(gè)性化部分,兩者共同構(gòu)成完整的子類對(duì)象,即首先進(jìn)行父類對(duì)象的初始化,在初始化子類對(duì)象(個(gè)性化)部分。? 子類構(gòu)造方法的執(zhí)行首先調(diào)用父類的構(gòu)造方法。? 若在子類構(gòu)造方法中無(wú)顯式調(diào)用父類構(gòu)造方法的語(yǔ)句,則系統(tǒng)默認(rèn)調(diào)用父類中可訪問(wèn)的無(wú)參的構(gòu)造方法,如果這時(shí)候父類中恰好沒(méi)有這樣的構(gòu)造方法,則編譯出錯(cuò)。? 在子類的構(gòu)造方法中可以通過(guò)super關(guān)鍵字調(diào)用父類構(gòu)造方法。這樣的調(diào)用語(yǔ)句只能出現(xiàn)在子類構(gòu)造方法的第一句。? 關(guān)于初始化的順序 ? 初始化父類 ? 初始化子類 ? 初始化父類對(duì)象 ? 初始化子類對(duì)象 繼承與類型轉(zhuǎn)換 ? 子類型對(duì)象可以自動(dòng)轉(zhuǎn)型為父類型 ? 父類型引用某個(gè)子類型對(duì)象時(shí),可以強(qiáng)制轉(zhuǎn)化為這個(gè)具體的子類型 方法重寫 ? 在繼承的情況下,子類的實(shí)例方法與父類的實(shí)例方法的方法名稱、參數(shù)、返回類型、throws聲明完全一致,并且該子類方法的訪問(wèn)權(quán)限不低于父類方法的訪問(wèn)權(quán)限,即方法重寫(子類方法重寫了父類方法),也稱方法覆蓋。? 方法重寫僅存在于父子類中的實(shí)例方法,靜態(tài)方法沒(méi)有重寫的概念。? 當(dāng)通過(guò)子類型對(duì)象執(zhí)行重寫方法時(shí),將始終表現(xiàn)為子類的行為,而且無(wú)論引用對(duì)象的變量是父類型還是子類型,也無(wú)論是直接調(diào)用還是通過(guò)父類型其它方法間接調(diào)用,都將如此。? final修飾的方法不可以被重寫 ? final修飾的類不可以被繼承 隱藏成員變量 ? 如果子類和父類中定義了同名稱的成員變量,則稱子類隱藏了父類的成員變量 ? 通過(guò)父類方法訪問(wèn)隱藏的成員變量時(shí),將獲得父類成員變量 ? 通過(guò)子類方法訪問(wèn)隱藏的成員變量時(shí),將獲得子類成員變量 ? 通過(guò)父類型的引用直接訪問(wèn)隱藏的成員變量時(shí),將獲得父類成員變量 ? 通過(guò)子類型的引用直接訪問(wèn)隱藏的成員變量時(shí),將獲得子類成員變量 super關(guān)鍵字
? super僅能用于子類中表示本對(duì)象的父對(duì)象部分
? super可以調(diào)用父類型的構(gòu)造方法
? Super可以調(diào)用父類的成員
? Super不可以使用在靜態(tài)上下文中
? Super不可以做為參數(shù)傳遞,不可以做為返回值返回。
? 當(dāng)方法重寫時(shí),或父類成員變量被隱藏時(shí),子類中只能通過(guò)super訪問(wèn)父類方法和
父類成員變量
? final關(guān)鍵字
? 用于變量,表示變量的值不可改變
? 用于類,表示類不可被繼承
? 用于方法,表示方法不可以被重寫
? 關(guān)于final變量的初始化時(shí)機(jī)
? 局部變量:聲明的時(shí)候初始化
? 實(shí)例成員變量:聲明、對(duì)象初始化塊和構(gòu)造方法三處之一
? 靜態(tài)成員變量:聲明、靜態(tài)塊兩處之一
? 抽象類
? 抽象類可以包含抽象方法,也可以不包含抽象方法
? 含有抽象方法的類必須定義為抽象類
? 抽象類有構(gòu)造方法
? 抽象類不能夠?qū)嵗?/p>
? 通過(guò)抽象類可以調(diào)用其靜態(tài)成員
? 抽象類是需要由子類繼承的,因此抽象類不允許是final類
? 抽象方法
? 抽象方法沒(méi)有方法體,包括一對(duì)空的大括號(hào)也不允許有
? 抽象方法必須是實(shí)例方法,抽象方法不允許是final的? 抽象類與繼承
? 抽象類可以被繼承
? 若抽象類的子類是非抽象類,則該子類必須實(shí)現(xiàn)(重寫)其父類的所有抽象方法 ? 若抽象類的子類也是抽象類,則該子類可以不實(shí)現(xiàn)(重寫)其父類的全部或部分抽象
方法。
? 接口
? 接口也是數(shù)據(jù)類型,可以將其理解為“純”抽象類
? 接口不是類,也沒(méi)有構(gòu)造方法,不能夠?qū)嵗?/p>
? 接口中的屬性一律是public、static、final的,并可以省略這三個(gè)關(guān)鍵字
? 接口的方法一律是public、abstract的,并且可以省略這兩個(gè)關(guān)鍵字
? 接口中可以不包含任何屬性和方法
? 接口與實(shí)現(xiàn)
? 接口不是類,因此接口與類的關(guān)系不是“繼承”關(guān)系,而是“實(shí)現(xiàn)”關(guān)系,我們可
以將實(shí)現(xiàn)理解為繼承(盡管這并不恰當(dāng))
? 如果接口的實(shí)現(xiàn)類是抽象類,則該實(shí)現(xiàn)類可以不實(shí)現(xiàn)接口的全部或部分方法 ? 如果接口的實(shí)現(xiàn)類是非抽象類,則該實(shí)現(xiàn)類必須實(shí)現(xiàn)接口的全部方法
? 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
? 接口與繼承
? 接口之間可以相互繼承
? 一個(gè)接口可以繼承多個(gè)接口
? 接口與類型轉(zhuǎn)換
? 接口的的子類型對(duì)象可以自動(dòng)向上轉(zhuǎn)型為接口類型
? 接口的子類型指:是接口的實(shí)現(xiàn)類或者接口的子接口
? 如果變量引用的對(duì)象實(shí)際是某個(gè)接口的實(shí)現(xiàn)類對(duì)象,而變量的類型不是這個(gè)接口的子類型,那么則可以強(qiáng)制轉(zhuǎn)換為這個(gè)接口類型。
? 異常的類層次結(jié)構(gòu)
? Throwable錯(cuò)誤類,表示不可恢復(fù)的致命錯(cuò)誤
? Exception運(yùn)行時(shí)異常,此類異常可以不做顯式處理
? 非運(yùn)行時(shí)異常catch
? 聲明拋出 在方法頭通過(guò)throws聲明可能拋出的異常類型
? 異常機(jī)制的五個(gè)關(guān)鍵字
? try catch finally throw throws
? 如何使用
? try-catch
? try-catch-finally注:只要try執(zhí)行,其對(duì)應(yīng)的finally塊才必然執(zhí)行
? try-finally注:只要try執(zhí)行,其對(duì)應(yīng)的finally塊才必然執(zhí)行
? throw 主動(dòng)拋出一個(gè)異常
? throws 用在方法聲明頭部,聲明方法可能拋出異常
? finally代碼塊多用于書(shū)寫資源回收代碼
? Java集合類(集合框架)
? Collection接口
? List接口 允許重復(fù)元素,元素有索引序號(hào),并按放入元素的次序編號(hào)
? ArrayList 線性表結(jié)構(gòu),查找快,增刪慢
? LinkedList 鏈表結(jié)構(gòu),查找慢,增刪快
? Vector 同步,查找、增刪性能都不高。
? Set接口 不允許重復(fù)元素,元素?zé)o索引編號(hào)
? HashSet 元素散列存放
? TreeSet元素按自然順序排序(即從小到大排序)
? Map接口
? HashMap
? 允許null值和null鍵
? 不同步
? Hashtable <--Properties
? 不允許null值和null鍵
? 同步
? 內(nèi)部類
第二篇:JAVA基礎(chǔ)總結(jié)
JAVA基礎(chǔ)總結(jié)
轉(zhuǎn)眼間,已經(jīng)來(lái)到這里學(xué)習(xí)半年了,而現(xiàn)在我們對(duì)于JAVA學(xué)習(xí)才算是真正的開(kāi)始。一開(kāi)始接觸的時(shí)候我發(fā)現(xiàn)這個(gè)和C語(yǔ)言的基本語(yǔ)法幾乎一模一樣的,老師說(shuō):JAVA語(yǔ)言本來(lái)就是C++語(yǔ)言發(fā)展過(guò)來(lái)的,而C++是從C語(yǔ)言發(fā)展來(lái)的,C C++ 還有JAVA雖然是不同的三種語(yǔ)言,但是其實(shí)他們的基本語(yǔ)法是一樣的,但是它們卻有巨大的區(qū)別,這個(gè)區(qū)別主要是體現(xiàn)在思想上。
都說(shuō)C語(yǔ)言是面向過(guò)程的語(yǔ)言,C++ C#和JAVA是面向?qū)ο蟮木幊蹋鋵?shí)就是思維方式稍微改了一下子,面向過(guò)程的語(yǔ)言主要是著重于算法,面向?qū)ο笾赜谶壿嫸选?/p>
這個(gè)教我們的老師是張成峰老師,張成峰是個(gè)很負(fù)責(zé)的老師,雖然JAVA基礎(chǔ)其實(shí)和C語(yǔ)言基礎(chǔ)差不多,但是仔細(xì)學(xué)學(xué)還是能找出很多不同的細(xì)節(jié)的,于是大家的問(wèn)題就很多,張老師幾乎就是手把手的教我們,所以整體來(lái)說(shuō)JAVA基礎(chǔ)學(xué)得挺扎實(shí)的。
我在這本書(shū)的學(xué)習(xí)不是挺好,聯(lián)系得少了,所以對(duì)代碼也不是特別熟悉。而且JAVA是一門重概念的書(shū),對(duì)于我來(lái)說(shuō),概念是我的要害,理論知識(shí)也是我最怕學(xué)習(xí)的,所以學(xué)習(xí)這本書(shū)對(duì)我來(lái)說(shuō)很是艱難,聽(tīng)了很久的課,代碼寫得出來(lái),但是理論知識(shí)幾乎一點(diǎn)也不明白,結(jié)果就造成了這次筆試考的不好。
筆試考的不好,機(jī)試也因?yàn)槲业拇中臎](méi)有考好,所以這次的成績(jī)不好。
學(xué)習(xí)JAVA基礎(chǔ)后,還要在學(xué)習(xí)的過(guò)程中對(duì)每個(gè)知識(shí)都要用心和細(xì)心,當(dāng)然最該注重的地方就是應(yīng)該提高我對(duì)理論知識(shí)的學(xué)習(xí),要多看書(shū),也要多敲敲代碼,這些就是提高學(xué)習(xí)知識(shí)全面的方法。
下一本書(shū)學(xué)習(xí)的是JAVAOO算是JAVA的一個(gè)重要的內(nèi)容了,這才會(huì)真正的接觸JAVA的核心課程,在這本書(shū)里我要好好的理解理論知識(shí),仔細(xì)的學(xué)習(xí)每個(gè)知識(shí)。
第三篇:《JAVA基礎(chǔ)》基本概念總結(jié)
《JAVA基礎(chǔ)》基本概念總結(jié)
1、在JAVA中所有萬(wàn)物皆對(duì)象,所有的代碼都要寫在一個(gè)類中,在類中只能包含屬性(變量)和方法(函數(shù)),其它代碼必須寫在某一個(gè)方法中,方法與方法之間是平行的,不能在方法中定義方法。
2、如果一個(gè)類名使用了public修飾符,則包含該類的JAVA文件名必須該類名一樣,一個(gè)JAVA文件中只能有一個(gè)類前面可以用public修飾符。
3、類是客觀實(shí)體的抽象,包含屬性(該類的數(shù)據(jù)),和對(duì)屬性進(jìn)行操作的方法,為了避免用戶對(duì)類的屬性進(jìn)行誤操作,我們一般把類的屬性定義為私有的,并提供相應(yīng)的get與 set方法去引用和修改這些屬性。
4、類的屬性與方法可以使用static修飾符,用static修飾的屬性與方法是該類的所有對(duì)象所共享的,它們可以直接通過(guò)類名去引用,在靜態(tài)方法中只能引用該類的靜態(tài)變量與靜態(tài)方法,因?yàn)榉庆o態(tài)的屬性與方法在該類沒(méi)有被實(shí)例化之前是不存在的,即沒(méi)有相應(yīng)的執(zhí)行空間,為了使用的方便,我們可以把不依賴于類的屬性(即在方法中不對(duì)類的屬性進(jìn)行操作)的方法定義為靜態(tài)的。
5、構(gòu)造函數(shù)是當(dāng)一個(gè)類被實(shí)例化時(shí)執(zhí)行的一段代碼,它決定了該類被實(shí)例化后的狀態(tài),其名稱與相應(yīng)的類名一樣,并且不寫返回值的類型,我們一般在構(gòu)造函數(shù)中對(duì)類的屬性進(jìn)行初始化。當(dāng)不寫構(gòu)造函數(shù)時(shí),系統(tǒng)會(huì)給我們提供一個(gè)不帶參數(shù)的空構(gòu)造函數(shù),如果我們寫了一個(gè)帶參的構(gòu)造函數(shù),系統(tǒng)就不再提供不帶參的構(gòu)造構(gòu)數(shù)了。
6、為了引用一個(gè)類中定義的非靜態(tài)屬性與方法,我們需要實(shí)例化一個(gè)該類的對(duì)象,通過(guò)該對(duì)象去引用相應(yīng)的方法。(這是我們實(shí)例化一個(gè)類的最直接的原因)
7、繼承可以實(shí)現(xiàn)代碼的復(fù)用,當(dāng)子類繼承了父類之后,子類就擁有了父類中定義的非私有屬性與方法。
8、子類對(duì)象可以直接賦值給父類變量,但賦值后就不能通過(guò)父類對(duì)象去引用在子類中定義的方法了。如果子類覆蓋了父類中的方法,則當(dāng)子類對(duì)象賦值給父類后,通過(guò)父類去引用該方法時(shí),執(zhí)行的是子類中該方法的代碼。
9、為了強(qiáng)制子類覆蓋父類中的某一方法,可以在父類中將該方法定義為抽象的,如果一個(gè)類中含有抽象方法,則該類必須被定義為抽象的,抽象類不能被實(shí)例化。
10、接口是一種特殊的抽象類,在接口中定義方法全是抽象的,它定義了一種上層規(guī)則或協(xié)議,使實(shí)現(xiàn)該接口的不同類之間可以交互。
11、接口與抽象類可以定義變量,可以作為函數(shù)的參數(shù),但傳遞給它的只能是實(shí)現(xiàn)該抽象類或接口中所有抽象方法的類的對(duì)象。
12、在JAVA中一個(gè)類一次只能繼承一個(gè)類,但可以實(shí)現(xiàn)多個(gè)接口,這是接口存在的一個(gè)非常重要的原因。
13、在程序中,有些代碼是不安全的,即在執(zhí)行的過(guò)程中有可能會(huì)產(chǎn)生錯(cuò)誤,為了處理這些錯(cuò)誤,在JAVA中引入了異常處理機(jī)制,異常的處理分為拋出(throws)和處理(try…catch..),我們一般在寫給其它地方用的方法中將有可能產(chǎn)生的異常拋出,而在main方法中,或?qū)嶋H使用時(shí)進(jìn)行處理。
14、異常是一種帶有強(qiáng)制性的業(yè)務(wù)規(guī)則,當(dāng)一個(gè)方法將異常拋出后,我們?cè)谑褂迷摲〞r(shí)就必須處理該異常,使用try…catch…可以將我們處理正常業(yè)務(wù)規(guī)則的代碼與處理錯(cuò)誤(即異常)的代碼分割開(kāi)來(lái),使程序的結(jié)構(gòu)更加清晰。寫在try語(yǔ)句中的代碼都是受保護(hù)的。
第四篇:JAVA基礎(chǔ)知識(shí)點(diǎn)總結(jié)
1)開(kāi)發(fā)Java語(yǔ)言的公司? Sun(Sun Microsystems)太陽(yáng)微電子公司開(kāi)發(fā) 2)
Java的3個(gè)版本?
J2SE(Java2 Standard Edition)標(biāo)準(zhǔn)版
J2EE(Java 2 Platform,Enterprise Edition)企業(yè)版 J2ME(Java 2 Micro Edition)微小版
在5.0以后新版本中稱作:JavaSE JavaEE JavaME 3)
Java語(yǔ)言的幾個(gè)主要特點(diǎn)?平臺(tái)無(wú)關(guān)性:能運(yùn)行于不同的平臺(tái)上
安全性:去掉了指針操作,內(nèi)存由操作系統(tǒng)分配 面向?qū)ο螅豪妙愂钩绦蚋永诰S護(hù)
分布式:可以使用網(wǎng)絡(luò)文件和使用本機(jī)文件一樣容易 健壯性:檢查程序編譯和運(yùn)行的錯(cuò)誤 4)
Java的三大核心機(jī)制
虛擬機(jī)機(jī)制:利用虛擬機(jī)解釋字節(jié)碼執(zhí)行java程序?qū)崿F(xiàn)跨平臺(tái) 垃圾收集機(jī)制:自動(dòng)內(nèi)存回收
代碼安全性機(jī)制:加載代碼后校驗(yàn)代碼后再執(zhí)行代碼 第2章Java語(yǔ)言的開(kāi)發(fā)環(huán)境 1)
JDK是什么?
JDK(Java Development Kit)Java開(kāi)發(fā)工具包。包括了JRE,是開(kāi)發(fā)Java的人員必備的開(kāi)發(fā)運(yùn)行Java程序的工具。2)
JRE是什么?
JRE(Java Runtime Environment)Java運(yùn)行環(huán)境,運(yùn)行JAVA程序所必須的環(huán)境的集合,包含JVM標(biāo)準(zhǔn)實(shí)現(xiàn)及Java核心類庫(kù)。3)
JVM是什么?
JVM(Java Virtual Machine)Java虛擬機(jī),它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。4)
安裝JDK的操作系統(tǒng)問(wèn)題?
必須針對(duì)于不同的操作系統(tǒng)下載安裝不同的JDK,例如windows下安裝針對(duì)于windows的JDK,linux下安裝針對(duì)于linux的JDK。
5)需要配置的相關(guān)環(huán)境變量? path:用于搜索外部命令,例如編譯程序的javac命令,執(zhí)行程序的java命令
classpath:用于搜索類,即class文件,例如可以在不同的位置執(zhí)行類文件 6)
配置環(huán)境變量的方式? 有兩種:臨時(shí)配置和持久配置
臨時(shí)配置:在命令行下用set 變量名=變量值,僅在當(dāng)前命令行窗口有效
持久配置:在我的電腦——屬性中配置,持久有效 7)可以編寫Java程序的常見(jiàn)開(kāi)發(fā)工具? 記事本,EditPlus,ULTRAEDIT,Eclipse,Jbuilder,NetBeans 8)
Java文件的類型?
有兩種:
擴(kuò)展名為java的文件:是Java源文件,屬于編譯之前的純文本文件,存儲(chǔ)java源代碼。
擴(kuò)展名為class的文件:是Java類文件,屬于編譯之后的二進(jìn)制文件,存儲(chǔ)字節(jié)碼。9)
Java的編譯運(yùn)行原理?
首先編寫java源文件,然后編譯成class類文件,然后通過(guò)虛擬機(jī)解釋成機(jī)器碼到硬件執(zhí)行。
10)Java是編譯型語(yǔ)言還是解釋型的語(yǔ)言?
既不是完全編譯型,也不是完全解釋型,是半編譯半解釋的。第3章Java程序的基本結(jié)構(gòu) 1)
Java語(yǔ)言區(qū)分大小寫嗎?
區(qū)分,不管是數(shù)據(jù)還是標(biāo)識(shí)符或者關(guān)鍵字都區(qū)分大小寫,例如public不能寫成Public,“abc”不能寫成“ABC”,int i不能寫成INT I等等。2)main方法是作什么用處的? 這是程序的入口方法,是由虛擬機(jī)自動(dòng)調(diào)用的。
3)語(yǔ)句必須用分號(hào)結(jié)束嗎? 必須的,但是代碼塊{}可以用分號(hào)結(jié)束,也可以不用分號(hào)結(jié)束
4)
Java中有幾種注釋,各自的功能
有三種:
單行注釋//:加在行首只能注釋一行 多行注釋/* */:注釋多行,但不能嵌套使用
文檔注釋/***/:用于生成HTML形式的文檔,需要配合javadoc命令實(shí)現(xiàn) 5)Java語(yǔ)言的數(shù)據(jù)類型是強(qiáng)類型還是弱類型? 是強(qiáng)類型,意味著每一個(gè)變量都必須明確聲明數(shù)據(jù)類型。6)
Java語(yǔ)言中數(shù)據(jù)類型的劃分?有什么區(qū)別? 分成基本類型和引用類型兩大類。
基本類型:有8種,只能存儲(chǔ)單一的值,不以對(duì)象的形式存在引用類型:除了基本類型之外其他的都是引用類型,能夠存儲(chǔ)復(fù)雜數(shù)據(jù)類型,以對(duì)象的形式存在 7)
基本類型都有哪8種類型? 布爾類型:boolean 占1字節(jié) 字符類型:char 占2字節(jié)
整型:byte 占1字節(jié) short 占2字節(jié) int 占4字節(jié) long 占8字節(jié)
浮點(diǎn)型:float 占4字節(jié)double 占8字節(jié) 8)
布爾值可不可以用0或者非0數(shù)代替?
不可以,布爾值只能是true和false,不能使用數(shù)字,這和C語(yǔ)言是不一樣的。9)
直接寫個(gè)整數(shù)10默認(rèn)是什么類型的?
整型的直接量例如10,100等默認(rèn)的數(shù)據(jù)類型都是int型 10)如何讓一個(gè)整型的直接量變成long型的? 在直接量后面加大寫L后者小寫l,例如10L 11)整型數(shù)據(jù)在程序中直接使用可以使用什么進(jìn)制? 10進(jìn)制,8進(jìn)制,16進(jìn)制,但不能使用二進(jìn)制 12)浮點(diǎn)運(yùn)算在Java中有沒(méi)有誤差? 有誤差,所以精密運(yùn)算請(qǐng)使用BigDecimal類 13)直接寫一個(gè)3.14的直接量是什么數(shù)據(jù)類型的?
是double型,如果想表示是float的3.14必須寫成3.14F或者3.14f,double型的3.14也可以寫成3.14D 14)char型采取的是什么類型的字符集?
是Unicode全球統(tǒng)一編碼,支持任何世界上官方的語(yǔ)言中的字符
15)常見(jiàn)的轉(zhuǎn)義字符有哪些? 轉(zhuǎn)義序列 名稱 b 退格 t 制表 n 換行 r
回車
” 雙引號(hào) ’ 單引號(hào) 反斜杠
16)常見(jiàn)的Unicode字符對(duì)應(yīng)的編碼?
大寫的A到Z是對(duì)應(yīng)65到90,小寫的a到z是對(duì)應(yīng)97到122,字符0到9是對(duì)應(yīng)48到57
17)空字符是不是用’’(兩個(gè)并列的單引號(hào))來(lái)表示? 不是,空字符用’u0000’來(lái)表示,兩個(gè)并列的單引號(hào)什么也不是。
18)點(diǎn),分號(hào),花括號(hào)的各自的作用?
點(diǎn)的作用有兩個(gè):一個(gè)是使用類或?qū)ο笾械某蓡T,用對(duì)象.成員,再一個(gè)就是包名和子包名之間的分隔符,例如頂層包名.子包名 分號(hào)的作用是表示語(yǔ)句結(jié)束 花括號(hào)的作用是代表一個(gè)語(yǔ)句塊
19)語(yǔ)句和關(guān)鍵字之間可以有任意的空白嗎? 可以的,例如System.out.println(100);就是正確的語(yǔ)句,但是關(guān)鍵字本身不能加空白或換行
20)標(biāo)識(shí)符是什么?
標(biāo)識(shí)符就是指在程序中給包,類,接口,方法,變量起的名字 21)標(biāo)識(shí)符有什么起名規(guī)則? 1. 應(yīng)以字母、下劃線、美元符開(kāi)頭 2. 后跟字母、下劃線、美元符或數(shù)字 3. 不能用關(guān)鍵字和保留字
4. 嚴(yán)格區(qū)分大小寫 5. 名稱長(zhǎng)度沒(méi)有限制 22)中文的變量名可以嗎?
是可以的,例如 int 數(shù)字 = 10;這個(gè)語(yǔ)句是正確的。因?yàn)閖ava中采取Unicode字符集,所以任何的Unicode中的字符都可以作為標(biāo)識(shí)符的名稱,但考慮字符集的支持問(wèn)題推薦還是使用英文字母命名。
23)關(guān)鍵字和保留字有區(qū)別嗎?
在1.5后沒(méi)有區(qū)別,都被稱作關(guān)鍵字,但是1.5之前認(rèn)為關(guān)鍵字是在Java中有特殊用途的不允許編程人員擅自改作其他用途,而保留字是在Java中沒(méi)有特殊用途但不允許編程人員擅自改作其他用途,按此說(shuō)法goto和const應(yīng)該是此意義上的保留字。
24)true,false,null可以用作標(biāo)識(shí)符命名嗎?
不可以,這3個(gè)雖然不是關(guān)鍵字,但都是有特殊用途的值,也不能作為標(biāo)識(shí)符命名
25)一條聲明語(yǔ)句可以聲明多個(gè)變量嗎? 可以的,例如以下聲明都是正確的int i;int i,j;int i = 10,j;int i,j = 10;
int i = 10,j = 20;
26)變量在沒(méi)有賦值的情況下可以使用嗎?
不可以,變量沒(méi)有賦值使用會(huì)報(bào)出變量未初始化的編譯錯(cuò)誤。27)常量有什么特點(diǎn)?
在聲明變量的時(shí)候加上final修飾符即為常量,表示這個(gè)變量只能被賦一次值。
28)算數(shù)運(yùn)算符有哪些? 基本算數(shù)運(yùn)算符有+-* / % ++--
29)單目運(yùn)算符,雙目運(yùn)算符,三目運(yùn)算符都是什么意思? 其實(shí)也有叫一元運(yùn)算符,雙元操作符,三元操作符的,指的是
有幾個(gè)操作數(shù)形成一個(gè)完整表達(dá)式,例如++就是一個(gè)單目運(yùn)算符,只需要一個(gè)操作數(shù)就可以形成表達(dá)式,像i++,而+運(yùn)算符就是雙目運(yùn)算符,需要兩個(gè)操作數(shù)形成表達(dá)式,例如5 + 3,還有三目運(yùn)算符,例如5 > 3 ? 0 :-1
30)++和--放在前面和放在后面有什么區(qū)別?
如果是在一個(gè)表達(dá)式中,那++放后面表示先運(yùn)算表達(dá)式,然后再進(jìn)行自增運(yùn)算,如果在一個(gè)表達(dá)式中,++放前面,則表示先進(jìn)行自增運(yùn)算然后在運(yùn)算表達(dá)式。--同樣道理。例如: int i = 10;int j = i ++;//先進(jìn)行賦值運(yùn)算然后再進(jìn)行自增運(yùn)算j的結(jié)果是10
int i = 10;
int j = ++ i;//先進(jìn)行自增運(yùn)算然后再進(jìn)行賦值運(yùn)算
j的結(jié)果是11
31)-5 % 2等于幾,5 %-2等于幾?
-5 % 2等于-1,5%-2等于1,運(yùn)算得到是正數(shù)還是負(fù)數(shù)取決于第一個(gè)操作數(shù)的符號(hào) 32)5 / 2 結(jié)果是不是2.5?
不是,是2,因?yàn)?和2都是int類型,所以不可能得到double型的結(jié)果。
33)比較運(yùn)算符有哪些?
有><>=<===!= 六項(xiàng)基本比較運(yùn)算 34)任何數(shù)據(jù)類型都可以使用> < >= <=運(yùn)算符嗎?
不是所有數(shù)據(jù)類型,例如true>false這個(gè)表達(dá)式就是編譯錯(cuò)誤,布爾類型和引用類型的表達(dá)式只能用==和!=兩個(gè)比較運(yùn)算,例如”abc” <= ”xyz” 這個(gè)表達(dá)式也是編譯錯(cuò)誤的 35)’a’ > ’b’這個(gè)表達(dá)式編譯正確嗎?
編譯正確,’a’和’b’是字符類型,內(nèi)部用Unicode編碼表示的話a是97,b是98,所以實(shí)際上比較的是97>98,結(jié)果為false 36)邏輯運(yùn)算符有哪些?
有 &邏輯與,|邏輯或,!邏輯非,^ 異或,&& 短路與,||短路或
37)邏輯與,邏輯或和短路與,短路或有什么區(qū)別? 邏輯與和短路與的區(qū)別是: ?
如果是邏輯與&,不管第一個(gè)表達(dá)式是true還是false,都會(huì)執(zhí)行第二個(gè)表達(dá)式,例如a > b & x < y,即使a > b為false,也會(huì)執(zhí)行x > y ?
如果是短路與&&,如果第一個(gè)表達(dá)式為false,將不會(huì)執(zhí)行第二個(gè)表達(dá)式
例如a > b && x < y,如果a > b為false,就不會(huì)執(zhí)行x > y
以此類推,邏輯或和短路或的區(qū)別是:
? 如果是邏輯或|,不管第一個(gè)表達(dá)式是true還是false,都會(huì)執(zhí)行第二個(gè)表達(dá)式 ?
如果是短路或||,如果第一個(gè)表達(dá)式為true,將不會(huì)執(zhí)行
第二個(gè)表達(dá)式
38)與或非三個(gè)邏輯運(yùn)算符的優(yōu)先級(jí)是怎么排列的? “非”優(yōu)先級(jí)最高,“與”其次,“或”優(yōu)先級(jí)最低 39)原碼,反碼,補(bǔ)碼分別是什么意思? ?
原碼:將數(shù)字轉(zhuǎn)換為二進(jìn)制,第一位為符號(hào)位,正數(shù)為0,負(fù)數(shù)為1
例如:12的原碼是00001100-12的原碼是10001100 ?
反碼:正數(shù)的反碼和原碼相同,負(fù)數(shù)的反碼將原碼符號(hào)位之外的位逐位取反
例如:12的反碼是00001100-12的反碼是11110011 ?
補(bǔ)碼:正數(shù)的補(bǔ)碼和原碼相同,負(fù)數(shù)的補(bǔ)碼將反碼加1 例如:12的補(bǔ)碼是00001100-12的補(bǔ)碼是11110100 最后強(qiáng)調(diào)一點(diǎn),計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)用補(bǔ)碼形式來(lái)存儲(chǔ)。40)位運(yùn)算符都有哪些?
&與 |或 ^異或 ~非 >>右移 <<左移 >>>無(wú)符號(hào)右移 41)1<<35怎么理解?
1是int類型是32位,所以需要把35%32=3,所以事實(shí)上是和執(zhí)行1<<3等價(jià)的42)數(shù)據(jù)類型轉(zhuǎn)換需要遵循什么原則?
小類型向大類型轉(zhuǎn)換,是自動(dòng)轉(zhuǎn)換的,或者說(shuō)隱式轉(zhuǎn)換的 大類型向小類型轉(zhuǎn)換,是需要強(qiáng)制轉(zhuǎn)換的,或者說(shuō)顯式轉(zhuǎn)換例如:byte b = 1;
short s = b;//自動(dòng)轉(zhuǎn)換
b =(byte)s;//強(qiáng)制轉(zhuǎn)換
43)byte b = 10這個(gè)語(yǔ)句是正確的,為什么10是int型比byte大還不需要強(qiáng)制轉(zhuǎn)換呢?
因?yàn)樵趈ava中做了特殊處理,其中規(guī)定byte,short,char類型可以直接賦予int類型的直接量,例如: byte b = 10;short s = 10;char c = 10;
以上賦值語(yǔ)句都是正確的。
但是不能超出超出類型的范圍,例如以下賦值就是錯(cuò)誤的: byte b = 128;
如果超出范圍,必須得作強(qiáng)制轉(zhuǎn)換,例如以下語(yǔ)句是正確的: byte b =(byte)128;
需要強(qiáng)調(diào)的是,必須是int類型的直接量,以下語(yǔ)句就是錯(cuò)誤的: byte b = 10L;
10L不是int類型的直接量。
44)byte b =(byte)300;強(qiáng)制轉(zhuǎn)換后的結(jié)果是44,是按照什么規(guī)律得出來(lái)的?
是先把300轉(zhuǎn)換成二進(jìn)制,然后根據(jù)byte類型的大小截取了后8個(gè)位
300的補(bǔ)碼是00000000 00000000 00000001 00101100
b的結(jié)果是:00000000 00000000 00000001 00101100 結(jié)果為44 45)byte b =(byte)true;這個(gè)轉(zhuǎn)換成立嗎?
不成立,布爾值和數(shù)字是不兼容的,不能作任何轉(zhuǎn)換。
46)int i =(int)“100”;這個(gè)轉(zhuǎn)換成立嗎?
不成立,引用類型和基本類型是不能直接強(qiáng)制轉(zhuǎn)換的,需要用包裝類的方法來(lái)轉(zhuǎn)換。
47)char型和short型哪個(gè)比較大?
不能說(shuō)哪個(gè)大,哪個(gè)小,這兩個(gè)類型char的取值是從0~65535,而short類型的取值是-32768~32767,這個(gè)兩個(gè)類型之間的轉(zhuǎn)換都需要強(qiáng)制轉(zhuǎn)換。
48)字符串是不是基本類型?
不是,String是java.lang包中的一個(gè)類,是引用類型的,8種基本類型中沒(méi)有一個(gè)是String類型。49)空字符串用什么來(lái)表示?
用””(兩個(gè)并列的雙引號(hào))表示,代表0個(gè)長(zhǎng)度的字符串對(duì)象。50)String s = “”;和String s = null;有什么區(qū)別?
第一個(gè)表示s被賦值,指向了一個(gè)字符串對(duì)象,第二個(gè)表示s沒(méi)有指向任何對(duì)象實(shí)例,是真空
51)兩個(gè)字符串用什么運(yùn)算符可以連成一個(gè)字符串? 用+運(yùn)算符,例如”abc” + “xyz”最后的結(jié)果就是“abcxyz” 52)數(shù)學(xué)運(yùn)算符加法和字符串連接符都是+,怎么區(qū)分? 是通過(guò)運(yùn)算符兩邊的操作數(shù)來(lái)判斷的,如果兩邊的操作數(shù)都是數(shù)字型的基本類型,則進(jìn)行數(shù)學(xué)運(yùn)算,如果兩邊的操作數(shù)有一個(gè)是字符串,則把另一個(gè)操作數(shù)也轉(zhuǎn)換為則進(jìn)行字符串連接運(yùn)算。例如:+ 4 的結(jié)果是9 “5” + 4的結(jié)果是54
53)判斷字符串內(nèi)容相同用什么方法?
用equals方法判斷內(nèi)容相同,==只能判斷引用是否相同 54)提供用戶輸入使用哪個(gè)類 使用javav.util.Scanner類
55)if語(yǔ)句可以用if(-1)形式判斷嗎? 不可以,數(shù)字不能代替布爾值
56)if語(yǔ)句和循環(huán)語(yǔ)句的花括號(hào)什么時(shí)候可以省略?
當(dāng)執(zhí)行的語(yǔ)句只有一句的時(shí)候 57)switch語(yǔ)句有哪些規(guī)則?
表達(dá)式expr的返回值必須是下述幾種類型之一:int, byte, char, short或枚舉常量;
case子句中的值必須是常量,且所有case子句中的值應(yīng)是不同的,也必須是下述幾種類型之一:int, byte, char, short或枚舉常量
default子句是任選的;
break語(yǔ)句用來(lái)在執(zhí)行完一個(gè)case分支后使程序跳出switch語(yǔ)句塊;
58)對(duì)于退出循環(huán)break和continue有什么區(qū)別? break是退出整個(gè)循環(huán)
continue是退出當(dāng)前循環(huán)繼續(xù)下一次循環(huán) 59)聲明數(shù)組創(chuàng)建數(shù)組的方法? 以下聲明都是合法的: int [] a;int a[];String[] a;
以下創(chuàng)建數(shù)組對(duì)象都是合法的: int[] a = new int[3];int[] a = {1,2,3};int[] a = new int[] {1,2,3};
60)int[] x和String[] s這兩個(gè)數(shù)組對(duì)象,哪個(gè)是基本類型,哪個(gè)是引用類型?
兩個(gè)都是數(shù)組對(duì)象,都是引用類型的61)數(shù)組元素下標(biāo)最小是多少,最大是多少,超出范圍會(huì)怎么樣?
最小是0,最大是數(shù)組元素個(gè)數(shù)減一,超出范圍將會(huì)出現(xiàn)下標(biāo)越界異常
62)得到數(shù)組長(zhǎng)度用length屬性還是length()方法? 是length屬性,得到字符串長(zhǎng)度才有l(wèi)ength方法
63)聲明int[][] a = new int[3][],a是一個(gè)二維數(shù)組,a[0]本身
是什么類型的?
二維數(shù)組的元素都是一維數(shù)組,a[0]是int[]類型的 64)數(shù)組的大小一經(jīng)創(chuàng)建可不可以改變大小了? 不可以,數(shù)組是定長(zhǎng)的,一經(jīng)創(chuàng)建就不能再改變大小了 65)可以把2個(gè)int型,3個(gè)double型,4個(gè)String型的值放到一個(gè)數(shù)組中嗎?
不可以,數(shù)組的元素類型必須是相同類型的。66)java中的多維數(shù)組必須是要形成矩陣排列嗎? 不一定,也可以是不規(guī)則的。67)操作數(shù)組比較方便的實(shí)用類?
java.util.Arrays類提供了很多關(guān)于數(shù)組的實(shí)用方法。第4章對(duì)象和類 1)OOP是什么意思? Object Oriented Programming(面向?qū)ο缶幊?
2)
類和對(duì)象的區(qū)別?
類:對(duì)象的藍(lán)圖,生成對(duì)象的模板,是對(duì)一類事物的描述,是抽象的概念上的定義
對(duì)象:對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱為實(shí)例 3)
類之間的3種關(guān)系? 依賴關(guān)系(uses-a)聚集關(guān)系(has-a)繼承關(guān)系(is-a)4)
一個(gè)java源文件可以寫多個(gè)類嗎?
可以,但必須只能有一個(gè)公有類,并且文件名和公有類的類名相同。5)類中有哪些成員?
有屬性(數(shù)據(jù)域),方法,構(gòu)造器(構(gòu)造方法)
6)
構(gòu)造方法和普通方法的區(qū)別?
構(gòu)造方法沒(méi)有返回值,方法名必須和類名相同,需要用new語(yǔ)句調(diào)用構(gòu)造方法。7)
普通方法可不可以也類名作為方法名?
是可以的,因?yàn)檎{(diào)用普通方法的語(yǔ)法和調(diào)用構(gòu)造器的語(yǔ)法不一樣。8)
一個(gè)構(gòu)造器調(diào)用另外一個(gè)構(gòu)造器需要用什么語(yǔ)法? 用this()語(yǔ)法調(diào)用另外一個(gè)重載構(gòu)造器,需要注意的是調(diào)用語(yǔ)句必須是構(gòu)造器中的第一句 9)
什么時(shí)候虛擬機(jī)會(huì)自動(dòng)添加一個(gè)默認(rèn)構(gòu)造器?
當(dāng)類中沒(méi)有顯式定義任何構(gòu)造器的時(shí)候,虛擬機(jī)會(huì)自動(dòng)添加一個(gè)無(wú)參的構(gòu)造器
10)實(shí)例成員和靜態(tài)成員的區(qū)別?
實(shí)例成員:是屬于對(duì)象實(shí)例的,用對(duì)象.成員名稱語(yǔ)法調(diào)用 靜態(tài)成員:和對(duì)象實(shí)例無(wú)關(guān),是屬于類本身的,用類名.成員名稱語(yǔ)法調(diào)用
11)靜態(tài)初始化塊statci{}的執(zhí)行時(shí)機(jī)是什么時(shí)候? 在類被加載的時(shí)候,僅執(zhí)行一次。
12)靜態(tài)方法可不可以直接調(diào)用同一個(gè)類中的非靜態(tài)方法? 不可以,靜態(tài)方法不能直接調(diào)用一個(gè)非靜態(tài)成員,需要用對(duì)象調(diào)用。
13)包是什么?
包實(shí)際上就是物理上的文件夾,可以把類放到不同的包中。14)把一個(gè)類放到包中,需要在類中加上什么語(yǔ)句? 需要加上包聲明package語(yǔ)句,必須寫在源文件的第一句。15)什么時(shí)候需要導(dǎo)入類?用什么語(yǔ)句?
當(dāng)使用的類和當(dāng)前類并不在同一個(gè)包中的時(shí)候,用import語(yǔ)句導(dǎo)入。
16)默認(rèn)包中的類可以導(dǎo)入嗎?
不可以,不在默認(rèn)包中的類無(wú)法使用默認(rèn)包中的類。17)java中哪個(gè)包中的類是自動(dòng)導(dǎo)入的? java.lang包
18)什么叫做完整類名? 頂層包名.子包名.類名
19)靜態(tài)導(dǎo)入語(yǔ)句有什么作用?
在使用類中的靜態(tài)成員的時(shí)候前面不需要加類名前綴。
20)局部變量和全局變量的區(qū)別? 區(qū)別 局部變量 全局變量
聲明位置 方法或塊內(nèi)部 方法外類內(nèi)部 訪問(wèn)權(quán)限修飾符 沒(méi)有訪問(wèn)權(quán)限 有訪問(wèn)權(quán)限
默認(rèn)值 沒(méi)有默認(rèn)值
有默認(rèn)值
使用形式 直接使用 對(duì)象調(diào)用
作用域
在方法或語(yǔ)句塊內(nèi)部 整個(gè)類
生命周期 進(jìn)入方法或語(yǔ)句塊創(chuàng)建退出方法或語(yǔ)句塊銷毀 隨著對(duì)象的創(chuàng)建而創(chuàng)建隨著對(duì)象的銷毀而銷毀
21)賦值語(yǔ)句賦給目標(biāo)的是值還是引用?
如果是基本類型則賦的是值本身,引用類型則賦的是引用地址 第5章繼承和多態(tài) 1)類的繼承是誰(shuí)繼承誰(shuí)?
是子類繼承了父類,子類也稱為派生類,父類也稱為超類或基
類 2)子類繼承了父類的什么東西?
子類可以繼承父類的數(shù)據(jù)域(屬性),方法,但構(gòu)造器不能繼
承 3)
私有成員能被子類繼承嗎?
能繼承,但是由于訪問(wèn)權(quán)限的控制,在子類中不能直接使用父類的私有成員 4)
Object是什么類?
這個(gè)所有類的根類,任何類如果沒(méi)有寫顯式的繼承語(yǔ)句,默認(rèn)都是直接繼承Object類的 5)java中是單繼承還是多繼承?
是單繼承,一個(gè)子類只能有一個(gè)父類 6)
訪問(wèn)權(quán)限修飾符有幾種,訪問(wèn)的范圍又是多大? 有四種:
private:私用 只能在被類中被訪問(wèn) default:默認(rèn) 只能被同一個(gè)包中的類訪問(wèn)
protected:受保護(hù)的 只能被同一個(gè)包中的類和不同包中的子類
訪問(wèn)
public:公有 可以被任何類訪問(wèn) 7)
覆蓋方法的規(guī)則有哪些?
子類覆蓋方法和父類被覆蓋方法的方法返回類型,方法名稱,參數(shù)列表必須相同
子類覆蓋方法的訪問(wèn)權(quán)限必須大于等于父類的方法的訪問(wèn)權(quán)限
方法覆蓋只能存在于子類和父類之間
子類覆蓋方法不能比父類被覆蓋方法拋出更多異常 8)
參數(shù)列表是否相同從哪幾方面看?
從三方面看:參數(shù)個(gè)數(shù),類型和順序,需要注意的是參數(shù)的名字不相同是無(wú)所謂的 9)
覆蓋方法的規(guī)則有哪些? 方法名相同
方法的參數(shù)類型,個(gè)數(shù),順序至少有一項(xiàng)不同 方法的返回類型和修飾符均不受限制
10)可變長(zhǎng)參數(shù)的聲明格式是什么?實(shí)際上是什么類型的? 類型 ? 變量,實(shí)際上是一個(gè)一維數(shù)組 11)this和super是作什么用處的?
this:本身代表當(dāng)前的對(duì)象引用,可以用this.成員名稱調(diào)用當(dāng)前對(duì)象的屬性和方法,如果屬性和局部變量重名,可以用this.屬性名和局部變量區(qū)分開(kāi)。也可以用this()語(yǔ)法調(diào)用本類重載構(gòu)造器。
super:本事是一個(gè)特殊關(guān)鍵字,可以用super.成員名稱調(diào)用從父類繼承的屬性和方法,也可以用super()語(yǔ)法調(diào)用父類構(gòu)造器。
12)super代表子類中的父類對(duì)象引用嗎?
不,這個(gè)錯(cuò)誤的說(shuō)法,super不代表任何對(duì)象引用,僅僅是一個(gè)關(guān)鍵字
13)什么時(shí)候子類構(gòu)造器會(huì)自動(dòng)調(diào)用父類無(wú)參構(gòu)造器? 當(dāng)子類構(gòu)造器中沒(méi)有任何顯式構(gòu)造器調(diào)用的時(shí)候,即既沒(méi)有this()調(diào)用也沒(méi)有super()調(diào)用的時(shí)候
14)一個(gè)父類類型的引用變量可以引用一個(gè)子類的實(shí)例嗎? 可以,這個(gè)引用變量是一個(gè)多態(tài)對(duì)象 15)多態(tài)對(duì)象有什么特點(diǎn)?
多態(tài)對(duì)象只能使用父類的成員,但如果多態(tài)對(duì)象使用了被子類覆蓋的方法,則會(huì)動(dòng)態(tài)綁定使用子類的成員,稱為虛擬方法調(diào)用
16)引用類型之間的類型轉(zhuǎn)換需要遵循哪些規(guī)則? 自動(dòng)轉(zhuǎn)換:從子類到父類的類型可以自動(dòng)轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換:從父類到子類的類型要強(qiáng)制轉(zhuǎn)換 無(wú)繼承關(guān)系的類型轉(zhuǎn)換是非法的 17)instanceof操作符是作什么用處的?
可以判斷一個(gè)對(duì)象的類型是否是某一個(gè)類的類型或子類,也可以判斷這個(gè)對(duì)象的類型是否是一個(gè)接口的實(shí)現(xiàn)類 18)toString方法什么時(shí)候會(huì)自動(dòng)被調(diào)用?
在打印語(yǔ)句中傳入引用類型的對(duì)象或者對(duì)象和字符串作連接時(shí)
19)默認(rèn)的equals方法實(shí)現(xiàn)的是比較內(nèi)容還是比較引用地址?
在Object中是比較引用地址。
20)覆蓋equals方法和hashCode方法有什么規(guī)則? 必須保證當(dāng)兩個(gè)對(duì)象equals比較為true的時(shí)候,返回的hashCode相同,當(dāng)比較為false的時(shí)候,返回的hashCode不同21)java中有幾個(gè)包裝類?
有8個(gè)包裝類,正好對(duì)應(yīng)8種基本數(shù)據(jù)類型。
分別是:Boolean Byte Short Integer Long Character Float Double 22)裝箱和拆箱分別是什么意思?
裝箱指的是把基本類型包裝成包裝類的引用類型 拆箱指的是把包裝類形式的引用類型轉(zhuǎn)換為基本類型 例如:
Integer objInt = new Integer(10);//裝箱
int i = objInt.intValue();
//拆箱
23)JDK1.4和1.5的裝箱和拆箱有什么區(qū)別?
自動(dòng)拆裝箱,例如: Integer intObj = 10;//自動(dòng)裝箱 int i = intObj + 5;//自動(dòng)拆箱
24)final修飾符如何使用,使用了final修飾符有什么特點(diǎn)? final修飾符可以修飾類,方法,變量 final類為最終類,不能被子類繼承 final方法為最終方法,不能被子類覆蓋 final變量為常量,只能賦一次值
25)abstract修飾符如何使用,使用了abstract修飾符有什么特點(diǎn)?
abstract修飾符可以修飾類和方法 abstract類為抽象類,是不能創(chuàng)建對(duì)象的abstract方法為抽象方法,只有方法的聲明,沒(méi)有具體的實(shí)現(xiàn) 需要注意的是:
有抽象方法的類一定是抽象類 抽象類不一定有抽象方法
抽象類也有構(gòu)造器,但不能創(chuàng)建對(duì)象實(shí)例 26)abstract不能和哪些修飾符配合使用? 不能和private,static,final一起使用 27)可以在非抽象方法中調(diào)用抽象方法嗎? 可以,模板方法設(shè)計(jì)模式就是典型的這種調(diào)用 第6章 泛型程序設(shè)計(jì) 1)泛型的特點(diǎn)是什么? 主要特點(diǎn)是類型參數(shù)化,后期綁定數(shù)據(jù)類型 2)泛型支持基本類型嗎?
不支持,只支持引用類型 3)如果沒(méi)有傳入類型參數(shù),默認(rèn)是什么類型? 默認(rèn)是Object類型
4)泛型方法有什么特點(diǎn)?
將泛型參數(shù)聲明在方法中,調(diào)用方法的時(shí)候綁定泛型 5)
泛型類聲明泛型參數(shù)的時(shí)候,
么意思?
表示綁定的類型必須是A類型后者是A類型的子類或?qū)崿F(xiàn)類 第7章 接口和內(nèi)部類
1)聲明一個(gè)接口的關(guān)鍵字是什么? interface關(guān)鍵字
2)
接口中的成員有什么特點(diǎn)?
數(shù)據(jù)域必須是(public static final修飾)公有靜態(tài)常量 方法必須是(public abstract修飾)公有抽象 沒(méi)有構(gòu)造方法 3)接口能創(chuàng)建對(duì)象實(shí)例嗎? 不能,接口沒(méi)有構(gòu)造器,不能創(chuàng)建對(duì)象
4)
接口和類的關(guān)系?
接口和類之間是實(shí)現(xiàn)關(guān)系,一個(gè)類用implements語(yǔ)句實(shí)現(xiàn)了某接口,這個(gè)類被稱為接口的實(shí)現(xiàn)類,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,一個(gè)類實(shí)現(xiàn)了某接口,必須覆蓋這個(gè)接口中的所以方法,否則這個(gè)類必須是個(gè)抽象類 5)
接口和接口的關(guān)系?
接口和接口之間是繼承關(guān)系,一個(gè)接口用extends繼承另外一個(gè)接口,稱為這個(gè)接口的子接口。一個(gè)接口可以繼承多個(gè)父接口 6)
內(nèi)部類如何定義?
一個(gè)類聲明在另一個(gè)類的里面,這個(gè)類就被稱為內(nèi)部類,而外面的類被稱為外部類 7)
內(nèi)部類可以分成幾種?
實(shí)例內(nèi)部類:聲明在方法外邊沒(méi)有static修飾符 靜態(tài)內(nèi)部類:聲明在方法外邊有static修飾符 局部?jī)?nèi)部類:聲明在方法里邊 8)
如何創(chuàng)建實(shí)例內(nèi)部類的對(duì)象實(shí)例? 需要用外部類的對(duì)象來(lái)創(chuàng)建 例如: class A {class B {
}
}
如果像創(chuàng)建B類的實(shí)例,則必須用以下語(yǔ)句: A a = new A();A.B b = a.new B();9)
如何在實(shí)例內(nèi)部類中訪問(wèn)外部類的成員?
在實(shí)例內(nèi)部類中可以直接使用外部類的成員,不需要?jiǎng)?chuàng)建外部類的對(duì)象實(shí)例,但是如果在內(nèi)部類中的成員名稱屏蔽隱藏了外部類的成員(即外部類和內(nèi)部類的成員名相同),則需要用“外部類名.this.成員名”訪問(wèn)外部類成員 第8章異常處理
1)異常的對(duì)象的根類是哪個(gè)類? 是Throwable類
2)
Throwable類有哪兩個(gè)分支?
分成Error類和Excepion類兩個(gè)分支 Error類表示嚴(yán)重錯(cuò)誤
Exception類表示可以在程序中處理的錯(cuò)誤 3)
Exception類有哪兩個(gè)分支?
分成運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(已檢查異常)運(yùn)行時(shí)異常編譯不檢查,在運(yùn)行時(shí)才會(huì)發(fā)生異常
已檢查異常編譯時(shí)就會(huì)作檢查,不處理異常則通不過(guò)編譯 4)如果在try塊中發(fā)生異常,那么程序?qū)?huì)跳轉(zhuǎn)到哪? 會(huì)跳轉(zhuǎn)到catch語(yǔ)句塊 5)catch語(yǔ)句可以用父類類型捕獲子類異常嗎? 因?yàn)橛卸鄳B(tài)特點(diǎn),是可以的6)處理異常代碼finally語(yǔ)句會(huì)在什么時(shí)候執(zhí)行? finally代碼在任何時(shí)候都會(huì)執(zhí)行,不管有沒(méi)有發(fā)生異常。7)
如何聲明已檢查異常,由誰(shuí)來(lái)處理這個(gè)異常? 用throws語(yǔ)句來(lái)聲明一個(gè)已檢查異常,由方法的調(diào)用者來(lái)處理這個(gè)異常 8)
如何拋出一個(gè)異常? 用throw語(yǔ)句拋出
9)如何創(chuàng)建一個(gè)自定義的異常類? 創(chuàng)建一個(gè)類,只要讓它繼承任何一個(gè)現(xiàn)有的異常類就可以了 10)覆蓋方法對(duì)于異常有什么要求? 覆蓋方法不能比父類方法拋出更多異常 第9章反射,代理,標(biāo)注
1)
獲得一個(gè)類型的Class對(duì)象有哪幾種途徑?
方法1:對(duì)象.getClass()方法2:類型名.class 方法3:Class.forName()2)
反射相關(guān)的類型都有哪些? Class 代表一個(gè)運(yùn)行時(shí)類 Field 代表一個(gè)類的屬性 Method 代表一個(gè)類的方法 Constructor 代筆一個(gè)類的構(gòu)造器 3)
如何聲明一個(gè)自定義標(biāo)注? [<修飾符>] @interface <標(biāo)注名>{ 返回值方法名稱(); 返回值方法名稱(); ?? } 例如:
public @interface MyComment { int id();String info();} 4)
java有幾個(gè)內(nèi)置標(biāo)注? 有3個(gè)
@Override——用于修飾此方法覆蓋了父類的方法,而非重載。@Deprecated——用于修飾已經(jīng)過(guò)時(shí)的方法。
@SuppressWarnings——用于通知Java編譯器禁止特定的警告。第10章 java常用類 1)
字符串String是可變類還是不可變類?
是不可變類,一經(jīng)創(chuàng)建就不能修改其內(nèi)容了 2)
字符串的常用方法有哪些? charAt方法:可以返回指定位置的字符 substring方法:可以截取子字符串 length方法:返回字符串長(zhǎng)度 indexOf方法:查找子串的位置 lastIndexOf方法:反向搜索字串的位置 replaceAll方法:替換字符串 split方法:分解字符串
toLowerCase, toUpperCase方法:字符串大小寫轉(zhuǎn)換 3)StringBuffer類和String類有什么區(qū)別? StringBuffer是可變類,String是不可變類
4)StringBuffer類和StringBuilder類有什么區(qū)別? StringBuffer類是線程安全的,StringBuilder類是線程不安全的5)Math類主要提供了哪些方法?
Math類提供了大量的和數(shù)學(xué)運(yùn)算相關(guān)的靜態(tài)方法 6)Set集合和List集合共同的父接口是什么? 是Collection集合7)
Set集合和List集合有什么區(qū)別? Set: Collection的子接口,不記錄元素的保存順序,且不允許有重復(fù)元素
List: Collection的子接口,記錄元素的保存順序,且允許有重復(fù)元素 8)
ArrayList和LinkedList有什么不同?
ArrayList 的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object[],所以從概念上
講它更像數(shù)組
LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,所以它更象一個(gè)鏈表 結(jié)構(gòu),所以它們?cè)谛阅苌嫌泻艽蟮牟顒e。ArrayList 隨機(jī)訪問(wèn)比較塊,但插入和刪除元素比較慢 LinkedList但插入和刪除元素比較快,但隨機(jī)訪問(wèn)比較慢 9)
HashTable和HashMap有什么不同?
HashTable是線程安全的,HashMap是線程不安全的10)Vector和ArrayList有什么不同? Vector是線程安全的ArrayList是線程不安全的 第11章 IO流 1)
流分成哪兩類?
按照單位劃分分成字節(jié)流和字符流。按輸入輸出分成輸入流和輸出流 2)
和文件流相關(guān)的有那幾個(gè)類? FileInputStream文件輸入字節(jié)流 FileOutputStream文件輸出字節(jié)流 FileReader文件輸入字符流 FileWriter文件輸出字符流 3)
文件流操作應(yīng)該用字節(jié)流還是字符流? 如果是純文本文件應(yīng)該用字符流 如果是二進(jìn)制文件應(yīng)該用字節(jié)流 4)
文件操作用哪個(gè)類? 用java.io.File類 第12章 線程 1)
創(chuàng)建一個(gè)線程類的兩種方式? 繼承Thread類 實(shí)現(xiàn)Runnable接口 2)線程體應(yīng)該放在哪個(gè)方法里面? run方法 3)啟動(dòng)新的線程用什么方法?
用start方法
4)一個(gè)線程對(duì)象能夠用start多次啟動(dòng)嗎? 不可以,一個(gè)線程方法只能start一次
5)線程有哪幾種主要狀態(tài)? 有四種,分別是:新生狀態(tài),可運(yùn)行狀態(tài),阻塞狀態(tài),死亡狀
態(tài) 6)
線程的同步需要用什么方法? 舊的方法是用synchronized關(guān)鍵字
新的方法是用ReentrantLock類的lock和unlock方法
第五篇:java基礎(chǔ)總結(jié)(筆記)
一、基礎(chǔ)知識(shí):
1、JVM、JRE和JDK的區(qū)別:
JVM(Java Virtual Machine):java虛擬機(jī),用于保證java的跨平臺(tái)的特性。
java語(yǔ)言是跨平臺(tái),jvm不是跨平臺(tái)的。
JRE(Java Runtime Environment):java的運(yùn)行環(huán)境,包括jvm+java的核心類庫(kù)。
JDK(Java Development Kit):java的開(kāi)發(fā)工具,包括jre+開(kāi)發(fā)工具
2、環(huán)境變量path和classpath的作用是什么?
(1)path是配置Windows可執(zhí)行文件的搜索路徑,即擴(kuò)展名為.exe的程序文件所在的目錄,用于指定DOS窗口命令的路徑。
(2)Classpath是配置class文件所在的目錄,用于指定類搜索路徑,JVM就是通過(guò)它來(lái)尋找該類的class類文件的。
3、變量有什么用?為什么要定義變量?什么時(shí)候用?
答:變量的作用:用來(lái)存儲(chǔ)數(shù)據(jù)。
為什么要定義變量:用來(lái)不斷的存放同一類型的常量,并可以重復(fù)使用
4、&和&&的區(qū)別? 答:(1)&&會(huì)出現(xiàn)短路,如果可以通過(guò)第一個(gè)表達(dá)式判斷出整個(gè)表達(dá)式的結(jié)果,則不繼續(xù)后面表達(dá)式的運(yùn)算;
只能操作boolean類型數(shù)據(jù);
(2)&不會(huì)出現(xiàn)短路,將整個(gè)表達(dá)式都運(yùn)算。既可以操作boolean數(shù)據(jù)還可以操作數(shù)。
5、標(biāo)示符命名規(guī)則:
由數(shù)字(0-9),大小寫英文字母,以及_和$組成。
不能以數(shù)字開(kāi)頭。
不能使用關(guān)鍵字來(lái)自定義命名。
6、數(shù)據(jù)類型:
(1)基本數(shù)據(jù)類型(4類8種):
整數(shù)類型:byte、short、int、long
浮點(diǎn)數(shù)類型:float、double
字符類型:char
布爾類型:boolean(ture false)(2)引用數(shù)據(jù)類型:
類
接口
數(shù)組
7、類型轉(zhuǎn)換
精度從高到低
double float long int short(char)byte
(1)自動(dòng)類型轉(zhuǎn)換
將一個(gè)低精度---?高精度
(2)強(qiáng)制類型轉(zhuǎn)換
將一個(gè)高精度---?低精度(精度會(huì)下降)
8、java語(yǔ)言的三種技術(shù)架構(gòu)
J2EE:企業(yè)版
是為開(kāi)發(fā)企業(yè)環(huán)境下的應(yīng)用程序提供的一套解決方案。
該技術(shù)體系中包含的技術(shù)如 Servlet、Jsp等,主要針對(duì)于Web應(yīng)用程序開(kāi)發(fā)。
J2SE:標(biāo)準(zhǔn)版 是為開(kāi)發(fā)普通桌面和商務(wù)應(yīng)用程序提供的解決方案。
該技術(shù)體系是其他兩者的基礎(chǔ),可以完成一些桌面應(yīng)用程序的開(kāi)發(fā)。
比如Java版的掃雷。
J2ME:小型版
是為開(kāi)發(fā)電子消費(fèi)產(chǎn)品和嵌入式設(shè)備提供的解決方案。
該技術(shù)體系主要應(yīng)用于小型電子消費(fèi)類產(chǎn)品,如手機(jī)中的應(yīng)用程序等。
9、java的跨平臺(tái)性:
通過(guò)Java語(yǔ)言編寫的應(yīng)用程序在不同的系統(tǒng)平臺(tái)上都可以運(yùn)行。
跨平臺(tái)的原因:
只要在需要運(yùn)行java應(yīng)用程序的操作系統(tǒng)上,先安裝一個(gè)Java虛擬機(jī)(JVM Java Virtual Machine)即可。
由JVM來(lái)負(fù)責(zé)Java程序在該系統(tǒng)中的運(yùn)行。
10、有符號(hào)數(shù)據(jù)的表示法(次重點(diǎn))原碼,反碼(原碼取反),補(bǔ)碼(反碼+1)。
11、函數(shù)
定義:函數(shù)就是定義在類中的具有特定功能的一段獨(dú)立小程序。
特點(diǎn):
定義函數(shù)可以將功能代碼進(jìn)行封裝
便于對(duì)該功能進(jìn)行復(fù)用
函數(shù)只有被調(diào)用才會(huì)被執(zhí)行
函數(shù)的出現(xiàn)提高了代碼的復(fù)用性
對(duì)于函數(shù)沒(méi)有具體返回值的情況,返回值類型用關(guān)鍵字void表示,那么該函數(shù)中的return語(yǔ)句如果在最后一行可以省略不寫。
函數(shù)的應(yīng)用兩個(gè)明確:
明確要定義的功能最后的結(jié)果是什么?
明確在定義該功能的過(guò)程中,是否需要未知內(nèi)容參與運(yùn)算
12、重載:
概念:在同一個(gè)類中,允許存在一個(gè)以上的同名函數(shù),只要它們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。
特點(diǎn):與返回值類型無(wú)關(guān),只看參數(shù)列表(參數(shù)類型以及參數(shù)個(gè)數(shù))。好處:方便于閱讀,優(yōu)化了程序設(shè)計(jì)。
13、數(shù)組:
概念:同一種數(shù)據(jù)類型的集合。
好處:可以自動(dòng)給數(shù)組中的元素從0開(kāi)始編號(hào),方便操作這些元素。
14、內(nèi)存結(jié)構(gòu):
棧內(nèi)存:用于存儲(chǔ)局部變量,當(dāng)數(shù)據(jù)使用完,所占空間會(huì)自動(dòng)釋放。
堆內(nèi)存:數(shù)組和對(duì)象,通過(guò)new建立的實(shí)例都存放在堆內(nèi)存中。
方法區(qū):靜態(tài)成員、構(gòu)造函數(shù)、常量池、線程池
本地方法區(qū):window系統(tǒng)占用
寄存器:
二、面向?qū)ο?/p>
1、面向?qū)ο笏枷耄?1)概述:面向?qū)ο笫窍鄬?duì)于面向過(guò)程而言的,面向過(guò)程強(qiáng)調(diào)的是功能,面向?qū)ο髲?qiáng)調(diào)的是將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備功能的對(duì)象;
(2)思想特點(diǎn):
A:是符合人們思考習(xí)慣的一種思想;
B:將復(fù)雜的事情簡(jiǎn)單化了;
C:將程序員從執(zhí)行者變成了指揮者;
比如我要達(dá)到某種結(jié)果,我就尋找能幫我達(dá)到該結(jié)果的功能的對(duì)象,如我要洗衣服我就買洗衣機(jī),至于怎么洗我不管。
(3)特征:
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式
繼承: 多個(gè)類中存在相同屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類中,那么多個(gè)類無(wú)需再定義
這些屬性和行為,只要繼承那個(gè)類即可。
多態(tài): 一個(gè)對(duì)象在程序不同運(yùn)行時(shí)刻代表的多種狀態(tài),父類或者接口的引用指向子類對(duì)象
2、類和對(duì)象:
類:對(duì)現(xiàn)實(shí)世界中某類事物的描述,是抽象的,概念上的定義。
對(duì)象:事物具體存在的個(gè)體。3:成員變量和局部變量的區(qū)別(重點(diǎn))(1)作用域
成員變量:針對(duì)整個(gè)類有效。
局部變量:只在某個(gè)范圍內(nèi)有效。(一般指的就是方法,語(yǔ)句體內(nèi))(2)存儲(chǔ)位置
成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失,存儲(chǔ)在堆內(nèi)存中。
局部變量:在方法被調(diào)用,或者語(yǔ)句被執(zhí)行的時(shí)候存在,存儲(chǔ)在棧內(nèi)存中。
當(dāng)方法調(diào)用完,或者語(yǔ)句結(jié)束后,就自動(dòng)釋放。
(3)初始值
成員變量:有默認(rèn)初始值。
局部變量:沒(méi)有默認(rèn)初始值,使用前必須賦值。
4、匿名對(duì)象
(1)匿名對(duì)象就是沒(méi)有名字的對(duì)象。是對(duì)象的一種簡(jiǎn)寫形式。
(2)應(yīng)用場(chǎng)景
A:只調(diào)用一次類中的方法。
B:可以作為實(shí)際參數(shù)在方法傳遞中使用
5、封裝:
指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式;比如電腦機(jī)箱、筆記本等
好處:
將變化隔離;
方便使用;
提高復(fù)用性;
提高安全性
6、關(guān)鍵字private:封裝在代碼中的體現(xiàn)
(1)私有的意思,權(quán)限修飾符
(2)用來(lái)修飾成員變量和成員函數(shù)
(3)用private修飾的成員只在本類中有效
(4)私有是封裝的一種體現(xiàn)
7、構(gòu)造方法:
(1)特點(diǎn):
方法名與類名相同
沒(méi)有返回類型
沒(méi)有返回值
(2)作用:構(gòu)造函數(shù)是用于創(chuàng)建對(duì)象,并對(duì)其進(jìn)行初始化賦值,對(duì)象一建立就自動(dòng)調(diào)用相對(duì)應(yīng)的構(gòu)造函數(shù),(3)構(gòu)造方法的注意事項(xiàng):
A:如果一個(gè)自定義類沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)默認(rèn)給出一個(gè)無(wú)參構(gòu)造方法。
B:如果一個(gè)自定義類提供了構(gòu)造方法,那么,系統(tǒng)將不再給出無(wú)參構(gòu)造方法。
這個(gè)時(shí)候,你可以不使用無(wú)參構(gòu)造方法。
如果你想使用,那么,就必須手動(dòng)給出無(wú)參構(gòu)造方法。
建議:一般情況下,我們的自定義類都要手動(dòng)給出無(wú)參構(gòu)造方法。
(4)構(gòu)造方法和成員方法的區(qū)別
A:格式區(qū)別
構(gòu)造方法和類名相同,并且沒(méi)有返回類型,也沒(méi)有返回值。
普通成員方法可以任意起名,必須有返回類型,可以沒(méi)有返回值。
B:作用區(qū)別
構(gòu)造方法用于創(chuàng)建對(duì)象,并進(jìn)行初始化值。
普通成員方法是用于完成特定功能的。
C:調(diào)用區(qū)別
構(gòu)造方法是在創(chuàng)建對(duì)象時(shí)被調(diào)用的,一個(gè)對(duì)象建立,只調(diào)用一次相應(yīng)構(gòu)造函數(shù)
普通成員方法是由創(chuàng)建好的對(duì)象調(diào)用,可以調(diào)用多次
8、構(gòu)造代碼塊:
(1)作用:給對(duì)象進(jìn)行初始化,對(duì)象一建立就執(zhí)行,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行
(2)構(gòu)造代碼塊和構(gòu)造函數(shù)的區(qū)別:
構(gòu)造代碼塊是給所有不同對(duì)象的共性進(jìn)行統(tǒng)一初始化
構(gòu)造函數(shù)是給對(duì)應(yīng)的對(duì)象進(jìn)行初始化
9、this關(guān)鍵字
(1)this關(guān)鍵字代表本類對(duì)象的一個(gè)引用,誰(shuí)調(diào)用this所在的方法,this就代表誰(shuí)
(2)this的使用場(chǎng)景
A:用于區(qū)分同名成員變量和局部變量;
B:在定義函數(shù)時(shí),該函數(shù)內(nèi)部要用到調(diào)用該函數(shù)的對(duì)象時(shí),因?yàn)榇藭r(shí)對(duì)象還沒(méi)建立,故this代表此對(duì)象
B:構(gòu)造函數(shù)間調(diào)用
**這個(gè)時(shí)候,this(參數(shù))必須作為第一條語(yǔ)句存在。
10、Person p = new Person();在內(nèi)存中做了哪些事情。
(1)將Person.class文件加載進(jìn)內(nèi)存中。(2)如果p定義在主方法中,那么,就會(huì)在棧空間開(kāi)辟一個(gè)變量空間p。
(3)在堆內(nèi)存給對(duì)象分配空間。
(4)對(duì)對(duì)象中的成員進(jìn)行默認(rèn)初始化。
(5)對(duì)對(duì)象中的成員進(jìn)行顯示初始化。
(6)調(diào)用構(gòu)造代碼塊對(duì)對(duì)象進(jìn)行初始化。(如果沒(méi)有就不執(zhí)行)(7)調(diào)用構(gòu)造方法對(duì)對(duì)象進(jìn)行初始化。對(duì)象初始化完畢。
(8)將對(duì)象的內(nèi)存地址賦值給p變量,讓p變量指向該對(duì)象。
11、static關(guān)鍵字:
(1)靜態(tài)的意思,用來(lái)修飾成員變量和成員函數(shù)
(2)靜態(tài)的特點(diǎn):
隨著類的加載而加載
優(yōu)先于對(duì)象存在 對(duì)所有對(duì)象共享
可以被類名直接調(diào)用
(3)靜態(tài)的注意事項(xiàng)
A:靜態(tài)方法只能訪問(wèn)靜態(tài)成員
為什么:因?yàn)殪o態(tài)的內(nèi)容是隨著類的加載而加載,它是先進(jìn)內(nèi)存的。
B:靜態(tài)方法中不能使用this,super關(guān)鍵字
C:主方法是靜態(tài)的public static void main(String[] args)
public:公共的意思,是最大權(quán)限修飾符。
static:由于jvm調(diào)用main方法的時(shí)候,沒(méi)有創(chuàng)建對(duì)象。
只能通過(guò)類名調(diào)用。所以,main必須用static修飾。
void:由于main方法是被jvm調(diào)用,不需要返回值。用void修飾。
main:main是主要的意思,所以jvm采用了這個(gè)名字。是程序的入口。
String[]:字符串?dāng)?shù)組
args:數(shù)組名
在運(yùn)行的時(shí)候,通過(guò)java命令給args數(shù)組賦值。
格式:java MainTest hello world itcast(4)靜態(tài)變量和成員變量的區(qū)別
A:調(diào)用方式
靜態(tài)變量也稱為類變量,可以直接通過(guò)類名調(diào)用。也可以通過(guò)對(duì)象名調(diào)用。
這個(gè)變量屬于類。
成員變量也稱為實(shí)例變量,只能通過(guò)對(duì)象名調(diào)用。這個(gè)變量屬于對(duì)象。
B:存儲(chǔ)位置
靜態(tài)變量存儲(chǔ)在方法區(qū)長(zhǎng)中的靜態(tài)區(qū)。
成員變量存儲(chǔ)在堆內(nèi)存。
C:生命周期
靜態(tài)變量隨著類的加載而存在,隨著類的消失而消失。生命周期長(zhǎng)。
成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失。
D:與對(duì)象的相關(guān)性
靜態(tài)變量是所有對(duì)象共享的數(shù)據(jù)。
成員變量是每個(gè)對(duì)象所特有的數(shù)據(jù)。
(5)靜態(tài)的優(yōu)點(diǎn)和弊端
優(yōu)點(diǎn):
對(duì)對(duì)象的共享數(shù)據(jù)進(jìn)行單獨(dú)空間的存儲(chǔ),節(jié)省內(nèi)存,沒(méi)有必要每個(gè)對(duì)象都存儲(chǔ)一份
可直接被類名調(diào)用
弊端:
生命周期過(guò)長(zhǎng),隨著類的消失而消失
訪問(wèn)出現(xiàn)權(quán)限,即靜態(tài)雖好但只能訪問(wèn)靜態(tài)
(6)什么使用使用靜態(tài)呢?
A:當(dāng)所有對(duì)象共享某個(gè)數(shù)據(jù)的時(shí)候,就把這個(gè)成員變量定義為靜態(tài)修飾的。
B:當(dāng)某個(gè)方法沒(méi)有訪問(wèn)該類中的非靜態(tài)成員,就可以把這個(gè)方法定義為靜態(tài)修飾。
靜態(tài)的生命周期比較長(zhǎng),所以一般不推薦使用。
(7)靜態(tài)代碼塊
A:它只執(zhí)行一次,它比main還先執(zhí)行。
B:執(zhí)行順序
靜態(tài)代碼塊--構(gòu)造代碼塊--構(gòu)造方法
12、制作API(次重點(diǎn))API(全拼):Application Program Interface 應(yīng)用程序編程接口。
(1)類中的內(nèi)容需要用文檔注釋。
(2)使用JDKbin目錄下的javadoc工具。
格式:javadoc-d 目錄-author-version ArrayTool.java
13、單例設(shè)計(jì)模式:
(1)設(shè)計(jì)模式:
解決某類問(wèn)題行之有效的方法,是一種思想,是規(guī)律的總結(jié)
(2)用來(lái)保證某個(gè)類在內(nèi)存中只有一個(gè)對(duì)象
(3)保證唯一性的思想及步驟
**為了避免其他程序建立該類對(duì)象,先禁止其他程序建立該類對(duì)象,即將構(gòu)造函數(shù)私有化
**為了其他程序訪問(wèn)到該類對(duì)象,須在本類中創(chuàng)建一個(gè)該類私有對(duì)象
**為了方便其他程序訪問(wèn)到該類對(duì)象,可對(duì)外提供一個(gè)公共訪問(wèn)方式
比如API中的Runtime類就是單例設(shè)計(jì)模式。
(4)單例設(shè)計(jì)模式的兩種方式
A:餓漢式 當(dāng)類加載的時(shí)候,就創(chuàng)建對(duì)象。
class Student
{
private Student(){}
private static final Student s = new Student();
public static Student getInstance()
{
return s;
}
}
B:懶漢式 當(dāng)使用的使用,才去創(chuàng)建對(duì)象。
class Student
{
private Student(){}
private static final Student s = null;
public static Student getInstance()
{
if(s==null)
{
//線程1就進(jìn)來(lái)了,線程2就進(jìn)來(lái)了。
s = new Student();
}
return s;
}
} 餓漢式和懶漢式的區(qū)別:
**
餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對(duì)象;
懶漢式則是類才加載進(jìn)內(nèi)存的時(shí)候,對(duì)象還沒(méi)有存在,只有調(diào)用了getInstance()方法時(shí),對(duì)象才開(kāi)始創(chuàng)建。
**
懶漢式是延遲加載,如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問(wèn)題,解決線程安全問(wèn)題
可以加同步來(lái)解決。但是加了同步之后,每一次都要比較鎖,效率就變慢了,所以可以加雙重判斷來(lái)提高程序效率。
注:開(kāi)發(fā)常用餓漢式,因?yàn)轲I漢式簡(jiǎn)單安全。懶漢式多線程的時(shí)候容易發(fā)生問(wèn)題
14、Math類的使用(重點(diǎn))(1)數(shù)學(xué)操作類:該類沒(méi)有構(gòu)造函數(shù),方法均為靜態(tài)的(2)掌握內(nèi)容
A:成員變量
**E:比任何其他值都更接近e(即自然對(duì)數(shù)的底數(shù))的double值。
**PI:比任何其他值都更接近pi(即圓的周長(zhǎng)與直徑之比)的double值。
B:成員方法
**static double abs(double a)
返回 double 值的絕對(duì)值。返回絕對(duì)值
**static double ceil(double a)
返回最小的(最接近負(fù)無(wú)窮大)double 值,該值大于等于參數(shù),并等于某個(gè)整數(shù)。
**static double floor(double a)
返回最大的(最接近正無(wú)窮大)double 值,該值小于等于參數(shù),并等于某個(gè)整數(shù)。
**max:返回兩個(gè)值中較大的那個(gè)
**min:返回兩個(gè)值中較小的那個(gè)
**static long round(double a)返回最接近參數(shù)的 long。
static int round(float a)返回最接近參數(shù)的 int。
**static double random()
返回帶正號(hào)的 double 值,該值大于等于 0.0 且小于 1.0。
**static double pow(double a, double b)
返回第一個(gè)參數(shù)的第二個(gè)參數(shù)次冪的值。
**static double sqrt(double a)
返回正確舍入的 double 值的正平方根。
15、Random類的使用(重點(diǎn))(1)產(chǎn)生隨機(jī)數(shù)的類
(2)掌握內(nèi)容
A:構(gòu)造方法
**Random()創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。
**Random(long seed)使用單個(gè) long 種子創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。
B:成員方法
**int nextInt()返回下一個(gè)偽隨機(jī)數(shù),它是此隨機(jī)數(shù)生成器的序列中均勻分布的 int 值。
**int nextInt(int n)返回一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
16、Scanner類的使用
(1)可以獲取從鍵盤的輸入數(shù)據(jù)
(2)掌握內(nèi)容
構(gòu)造方法:
Scanner(InputStream source)構(gòu)造一個(gè)新的 Scanner,它生成的值是從指定的輸入流掃描的。
如:Scanner sc = new Scanner(System.in);
方法摘要
sc.nextInt();獲取整型數(shù)據(jù)
sc.nextLine();獲取字符串?dāng)?shù)據(jù)
17、繼承(重點(diǎn))(1)把很多類的相同特征和行為進(jìn)行抽取,用一個(gè)類來(lái)描述。讓多個(gè)類和這個(gè)類產(chǎn)生一個(gè)關(guān)系。
這樣的話,多個(gè)類就可以省略很多代碼。這個(gè)關(guān)系就是繼承。java中用extends關(guān)鍵字表示。
(2)繼承的體系結(jié)構(gòu)
A:多個(gè)具體的對(duì)象,不斷的向上抽取共享的內(nèi)容,最終形成了一個(gè)體系。這個(gè)體系叫做繼承體系。
B:繼承體系的學(xué)習(xí)和使用原則
**學(xué)習(xí)頂層的內(nèi)容。因?yàn)樗钦麄€(gè)體系的共性內(nèi)容。
**創(chuàng)建子類使用。也就是使用底層的具體對(duì)象。
(3)繼承的特點(diǎn):
A:java中只能單繼承,沒(méi)有多繼承。
B:java可以有多重(層)繼承。
(4)繼承的好處:
繼承的出現(xiàn)提高了代碼的復(fù)用性。
繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。
(5)子父類中的成員關(guān)系
A:成員變量
在子類方法中使用一個(gè)變量時(shí):
首先,在方法的局部變量中找這個(gè)變量,有則使用。
否則,在本類中找成員變量,有則使用。
否則,在父類中找成員變量,有則使用。
否則,報(bào)錯(cuò)。
B:成員方法
用子類對(duì)象使用一個(gè)方法時(shí)。
首先,在子類中找這個(gè)方法,有則使用。
否則,在父類中找這個(gè)方法,有則使用。
否則,報(bào)錯(cuò)。
重寫和重載的區(qū)別?
重載:在同一類中。方法名相同,參數(shù)列表不同。重載可以改變返回類型。
重寫:在不同類中(子父類中)。
方法聲明相同(返回類型,方法名,參數(shù)列表均相同)。
重寫需要注意:
**子類方法的訪問(wèn)權(quán)限要大于等于父類方法的訪問(wèn)權(quán)限。
**靜態(tài)只能重寫靜態(tài)。但是這種情況一般不會(huì)出現(xiàn)。
構(gòu)造方法
**子類的實(shí)例化過(guò)程
***子類創(chuàng)建對(duì)象時(shí),會(huì)先去創(chuàng)建父類的對(duì)象。
默認(rèn)是去調(diào)用父類的無(wú)參構(gòu)造方法。
***子類構(gòu)造方法中,第一行默認(rèn)是super()
***為什么子類中第一行會(huì)默認(rèn)有super()
因?yàn)樗^承父類的成員使用,使用前這些成員必須初始化,而他們是父類的成員,所以,必須通過(guò)父類進(jìn)行初始化。
所以,會(huì)先創(chuàng)建一個(gè)父類的對(duì)象。
**當(dāng)父類沒(méi)有無(wú)參構(gòu)造方法時(shí)
必須使用this或者super調(diào)用其他的構(gòu)造方法。
(6)this和super的區(qū)別
this:代表本類對(duì)象的引用。
super:代表父類的存儲(chǔ)空間。
18、final關(guān)鍵字(重點(diǎn))(1)最終的意思,可以用于修飾類,方法,變量。(2)final修飾的類不能被繼承。
final修飾的方法不能被重寫。
final修飾的變量是一個(gè)常量。只能被賦值一次。
內(nèi)部類只能訪問(wèn)被final修飾的局部變量。
19、抽象類(重點(diǎn))(1)多個(gè)類有相同的方法聲明,但是方法體不一樣。這個(gè)時(shí)候,我們考慮把方法聲明進(jìn)行抽取。
讓子類繼承后,自己去實(shí)現(xiàn)方法體。沒(méi)有方法體的方法,我們需要用抽象標(biāo)志下。
抽象的關(guān)鍵字是:abstract。
(2)抽象類:
該方法稱為抽象方法,包含抽象方法的類就是抽象類。
(3)抽象類的特點(diǎn):
A:抽象類和抽象方法都要用abstract進(jìn)行修飾
B:抽象類不能被實(shí)例化
C:抽象類中不一定有抽象方法,但是,有抽象方法的類一定是抽象類。
(4)抽象類中數(shù)據(jù)的特點(diǎn)
A:成員變量
抽象類中可以有變量,也可以有常量。
B:成員方法
抽象類中可以有抽象方法,也可以有非抽象方法。
C:構(gòu)造方法
抽象類是一個(gè)類,所以,它有構(gòu)造方法。
雖然本身不能實(shí)例化。但是可以給子類實(shí)例化使用。
(5)抽象類中的問(wèn)題
A:抽象類中是否有構(gòu)造方法?能不能被實(shí)例化?如果不能,為什么有構(gòu)造方法?
抽象類有構(gòu)造方法。
抽象類不能被實(shí)例化。
抽象類中的構(gòu)造方法供子類實(shí)例化調(diào)用。
B:抽象關(guān)鍵字abstract不可以和哪些關(guān)鍵字共存?
**private:
私有內(nèi)容子類繼承不到,所以,不能重寫。
但是abstract修飾的方法,要求被重寫。兩者沖突。
**final
final修飾的方法不能被重寫。
而abstract修飾的方法,要求被重寫。兩者沖突。
**static
假如一個(gè)抽象方法能通過(guò)static修飾,那么這個(gè)方法,就可以直接通過(guò)類名調(diào)用。
而抽象方法是沒(méi)有方法體的,這樣的調(diào)用無(wú)意義。所以,不能用static修飾。
C:抽象類中可不可以沒(méi)有抽象方法?如果可以,這樣的類有什么用嗎?
抽象類可以沒(méi)有抽象方法。
抽象類中沒(méi)有抽象方法的作用,只是為了不讓別的類建立該抽象類對(duì)象。這個(gè)在awt中有體現(xiàn)。20、接口interface(1)當(dāng)一個(gè)類中的方法都是抽象的時(shí)候,java提供了另一種表示方式,叫接口。
用interface關(guān)鍵字表示。類與接口關(guān)系用implements表示。
(2)接口的成員特點(diǎn)
A:成員變量
是常量,默認(rèn)修飾 public static final
B:成員方法
都是抽象的,默認(rèn)修飾 public abstract
(3)關(guān)系
A:類與類的關(guān)系
是繼承關(guān)系。類與類只能單繼承,可以多重繼承。
B:類和接口的關(guān)系
是實(shí)現(xiàn)關(guān)系。類可以多實(shí)現(xiàn)接口。
類在繼承一個(gè)類的同時(shí),可以實(shí)現(xiàn)多個(gè)接口。
C:接口和接口的關(guān)系
是繼承關(guān)系。接口可以多繼承接口。
(4)接口的特點(diǎn)
A:是對(duì)外暴露的規(guī)則
B:是功能的擴(kuò)展
C:接口的出現(xiàn)降低耦合性。
耦合(類與類之間的關(guān)系)
內(nèi)聚(類完成功能的能力)
編程規(guī)范:低耦合,高內(nèi)聚。
D:接口可以多實(shí)現(xiàn)。如:CPU和主板、筆記本的USB插口、插座
(5)接口和抽象類的區(qū)別
A:抽象類只能被單繼承
接口可以多實(shí)現(xiàn),接口的出現(xiàn)避免了多繼承的局限性。
B:抽象類中的數(shù)據(jù)特點(diǎn):
成員變量:可以是變量,也可以是常量
成員方法:可以是抽象方法,也可以是非抽象方法
構(gòu)造方法:有構(gòu)造方法
接口中的數(shù)據(jù)特點(diǎn):
成員變量:是常量。默認(rèn)修飾 public static final
成員方法:都是抽象方法。都有默認(rèn)修飾 public abstract
構(gòu)造方法:沒(méi)有構(gòu)造方法
C:抽象類中定義的是繼承體系中的共性功能。
接口中定義的是繼承體系中的擴(kuò)展功能。
D:抽象類被繼承是“is a”關(guān)系:xx是yy的一種
接口被實(shí)現(xiàn)是“l(fā)ike a”關(guān)系:xx像yy的一種
21、多態(tài):
(1)同一個(gè)對(duì)象,在程序不同時(shí)刻的多種運(yùn)行狀態(tài)。舉例:動(dòng)物,狗是狗,狗是動(dòng)物。水(氣態(tài),液態(tài),固態(tài))(2)多態(tài)前提
A:存在著繼承或者實(shí)現(xiàn)關(guān)系
B:有方法的重寫
C:父類(接口)引用指向子類(實(shí)現(xiàn))對(duì)象
(3)多態(tài)的好處和弊端:
好處:多態(tài)的存在提高了程序的擴(kuò)展性和后期可維護(hù)性
弊端:雖然可以預(yù)先使用,但是只能訪問(wèn)父類中已有的功能,運(yùn)行的是后期子類的功能內(nèi)容。
不能預(yù)先使用子類中定義的特有功能。
(4)多態(tài)中對(duì)象調(diào)用成員的特點(diǎn)
Fu f = new Zi();
A:成員變量
編譯看左邊,運(yùn)行看左邊
B:成員方法
編譯看左邊,運(yùn)行看右邊
C:靜態(tài)方法
編譯看左邊,運(yùn)行看左邊
(5)多態(tài)的思想
指揮同一批對(duì)象做事情。舉例:帶兵打仗,下課等。
22、instanceof關(guān)鍵字
A:用于判斷某個(gè)對(duì)象是否是某種類型。
B:格式
對(duì)象名 instanceof 子類(實(shí)現(xiàn))名
23、Object類:
(1)是所有類的根類,超類。
java中提供的類以及我們自定義的類都直接或者間接的繼承自O(shè)bject類。
(2)Object類中的方法
A:void finalize()
當(dāng)垃圾回收器確定不存在對(duì)該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法。
B:Class getClass()
獲取對(duì)象的字節(jié)碼文件的描述類,后面再講反射的時(shí)候還會(huì)在說(shuō)這個(gè)類。
String name = s.getClass().getName();
C:int hashCode()
獲取對(duì)象的哈希值。其實(shí)就是對(duì)象的內(nèi)存地址值十進(jìn)制表示
D:String toString()
返回對(duì)象的字符串表示。
表示格式:
getClass().getName()+“@”+Integer.toHexString(hashCode());
一般我們輸出對(duì)象名的時(shí)候,其實(shí)底層調(diào)用的就是該對(duì)象的toString()方法。
這種返回沒(méi)有意義,所以,我們會(huì)重寫這個(gè)方法,顯示類的成員變量信息。
E:boolean equals(Object obj)
用于比較兩個(gè)對(duì)象的地址值是否相同。
我們獲取對(duì)象后,比較它的地址值意義不大。所以也會(huì)對(duì)這個(gè)方法進(jìn)行重寫。
重寫要完成什么功能,是根據(jù)需求定的。(3)==和equals的用法:
A:==怎么用?
**可以用于比較基本數(shù)據(jù)類型,比較的就是基本數(shù)據(jù)類型的值是否相等。
**可以用于比較引用數(shù)據(jù)類型,比較的是對(duì)象的地址值是否相等。
B:equals怎么用?
equals只能用于比較引用數(shù)據(jù)類型的。
**Object提供的equals是用于比較對(duì)象地址值是否相同。
**自定義類中,如果重寫了equals方法,那么就是按照你自己的需求來(lái)比較的。
24、package關(guān)鍵字
(1)包:其實(shí)就是文件夾。用于區(qū)分不同包下相同的類名。
(2)好處:
A:對(duì)類文件進(jìn)行分類管理。
B:給類提供了多層命名空間
aaa.Demo
bbb.Demo
C:寫在程序文件的第一行。
D:包也是一種封裝形式。
25、import關(guān)鍵字
(1)導(dǎo)入包的關(guān)鍵字
(2)格式:
import 包名;(3)注意:
A:一個(gè)程序文件中只有一個(gè)package,可以有多個(gè)import。
B:用來(lái)導(dǎo)包中的類,不導(dǎo)入包中的包。
C:通常寫import mypack.Demo,明確自己使用的類。
(4)關(guān)鍵字的順序
類,包,導(dǎo)包這些關(guān)鍵的順序。
包--> 到包--> 類
26、不同修飾符可以修飾哪些內(nèi)容
本類中 同一個(gè)包中 不同包中的子類中 不同包中
private OK
默認(rèn)
OK Ok
protected OK Ok
OK public OK Ok
OK
Ok
類 構(gòu)造方法 成員變量 成員方法
private
OK OK OK 默認(rèn)
Ok Ok Ok OK protected OK OK Ok public
Ok Ok OK OK static
OK Ok final Ok
OK OK abstract Ok
OK
一般格式:
成員變量:
權(quán)限修飾符+static/final+數(shù)據(jù)類型+成員變量名
public static final int NUM = 10;
成員方法:
權(quán)限修飾符+static/final/abstract+返回類型+方法名
27、內(nèi)部類(次重點(diǎn))(1)把一個(gè)類定義在某個(gè)類中的,這個(gè)類就被稱為內(nèi)部類,內(nèi)置類,嵌套類。
(2)訪問(wèn)特點(diǎn):
A:內(nèi)部類可以直接訪問(wèn)外部類中的成員,因?yàn)閮?nèi)部類持有外部類的引用,格式為:外部類名.this
B:外部類要想訪問(wèn)內(nèi)部類的成員,必須創(chuàng)建對(duì)象訪問(wèn)。
(3)內(nèi)部類的訪問(wèn)格式:
A:當(dāng)內(nèi)部類定義在外部類的成員位置,而且非私有,則可以在其他外部類中直接建立內(nèi)部類對(duì)象
格式:外部類名.內(nèi)部類名
變量名 = new 外部類對(duì)象.內(nèi)部類對(duì)象
如:Outer.Inner in = new Outer().new Inner()
B:當(dāng)內(nèi)部類在外部類成員位置,且被static修飾時(shí)
**外部其他類可直接訪問(wèn)靜態(tài)內(nèi)部類的非靜態(tài)成員
格式:new 外部類名.內(nèi)部類名().內(nèi)部類成員
如:new Outer.Inner().function();
**外部其他類可直接訪問(wèn)靜態(tài)內(nèi)部類的靜態(tài)成員
格式:new 外部類名.內(nèi)部類名.內(nèi)部類成員
如:new Outer.Inner.function();(4)什么使用時(shí)候內(nèi)部類呢?
假如有A類和B類,A類想直接訪問(wèn)B類的成員,B類訪問(wèn)A類成員的時(shí)候,需要?jiǎng)?chuàng)建A類對(duì)象進(jìn)行訪問(wèn),這個(gè)時(shí)候,就可以把A類定義為B類的內(nèi)部類。
(5)內(nèi)部類的位置
A:成員位置
**可以被private修飾(Body,Heart)
**可以被static修飾。(它訪問(wèn)的外部類的成員必須是靜態(tài)的)
B:局部位置
**可以直接訪問(wèn)外部類中的成員,因?yàn)檫€持有外部類的持用
也可以直接訪問(wèn)局部成員,但是局部成員要用final修飾。
注意:局部?jī)?nèi)部類不能用private和static修飾
(6)通過(guò)class文件我們就可以區(qū)分是否帶有內(nèi)部類,以及內(nèi)部類的位置
Outer$Inner:成員內(nèi)部類
Outer$1Inner:局部?jī)?nèi)部類
28、匿名內(nèi)部類(局部?jī)?nèi)部類的簡(jiǎn)寫)(重點(diǎn))
(1)前提:繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口
(注意不要弄混匿名內(nèi)部類的前提和多態(tài)的前提)
(2)格式:
new 父類名或者接口名()
{
重寫父類方法或者實(shí)現(xiàn)接口中的方法。
也可以自定義其他方法。
};
(3)什么時(shí)候定義匿名內(nèi)部類?
匿名內(nèi)部類只是為了簡(jiǎn)化書(shū)寫,匿名內(nèi)部類有局限,通常定義匿名內(nèi)部類時(shí),該類方法不超過(guò)3個(gè)
(4)匿名內(nèi)部類的好處和弊端:
好處:簡(jiǎn)化代碼書(shū)寫
弊端:
不能直接調(diào)用自己的特有方法
不能執(zhí)行強(qiáng)轉(zhuǎn)換動(dòng)作
如果該類里面方法較多,不允許使用匿名內(nèi)部類
29、模板設(shè)計(jì)模式:
在定義功能時(shí),功能的一部分是確定的,有一部分是不確定的,而且確定的部分在使用不確定的部分,可將不確定的部分暴露出去,由該類的子類去完成。
如:求一段程序的運(yùn)行時(shí)間例子。30、異常
(1)程序運(yùn)行過(guò)程中的不正常現(xiàn)象就叫異常。
(2)導(dǎo)致程序運(yùn)行不正常的現(xiàn)象有很多,所以,就有很多的異常對(duì)象。
而這些異常對(duì)象存在著共性的內(nèi)容,所以,可以不斷的進(jìn)行抽取。最終形成了異常的體系結(jié)構(gòu)。
異常體系的根類是:Throwable
Throwable:
|--Error:重大的問(wèn)題,我們處理不了。也不需要編寫代碼處理。比如說(shuō)內(nèi)存溢出。
|--Exception:一般性的錯(cuò)誤,是需要我們編寫代碼進(jìn)行處理的。
|--RuntimeException:運(yùn)行時(shí)異常,這個(gè)我們也不需要處理。
其實(shí)就是為了讓他在運(yùn)行時(shí)出問(wèn)題,然后我們回來(lái)修改代碼。
(3)異常的分類
異常有兩種:
編譯時(shí)被檢測(cè)異常:
該異常在編譯時(shí),如果沒(méi)有處理(沒(méi)有拋也沒(méi)有try),編譯失敗。
該異常被標(biāo)識(shí),代表這可以被處理。
運(yùn)行時(shí)異常(編譯時(shí)不檢測(cè))
在編譯時(shí),不需要處理,編譯器不檢查。
該異常的發(fā)生,建議不處理,讓程序停止。需要對(duì)代碼進(jìn)行修正。
(4)異常體系的特點(diǎn):
異常體系中的所有類及其子類對(duì)象都具備可拋性。也就是說(shuō)可以被throw和throws關(guān)鍵字所操作。
(5)main方法是如何處理異常的。
A:在main里面編寫代碼進(jìn)行處理
B:交給jvm自己進(jìn)行處理。采用的是jvm的默認(rèn)處理方式。
其實(shí)就是相當(dāng)于調(diào)用了異常對(duì)象的printStackTrace()方法。
(6)Throwable類的學(xué)習(xí)
getMessage():獲取異常信息,返回字符串。
toString():獲取異常類名和異常信息,返回字符串。
printStackTrace():獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。
(7)異常的處理·
A:try...catch...finally
基本格式:
try
{
可能出現(xiàn)異常的代碼
}
catch(異常對(duì)象)
{
異常處理代碼
}
finally
{
釋放資源
}
變形格式:
try...catch
try...catch...catch...try...catch...catch...finally
**多個(gè)異常同時(shí)被捕獲的時(shí)候,記住一個(gè)原則:
先逮小的,再逮大的。
**finally:永遠(yuǎn)被執(zhí)行,除非退出jvm。System.exit(0);
面試題2個(gè)。
***:final,finally,finalize區(qū)別。
final是最終的意思。它可以用于修飾類,成員變量,成員方法。
它修飾的類不能被繼承,它修飾的變量時(shí)常量,它修飾的方法不能被重寫。
finally:是異常處理里面的關(guān)鍵字。
它其中的代碼永遠(yuǎn)被執(zhí)行。特殊情況:在執(zhí)行它之前jvm退出。System.exit(0);
finalize:是Object類中的一個(gè)方法。
它是于垃圾回收器調(diào)用的方式。
***:假如catch中有return語(yǔ)句,finally里中的代碼會(huì)執(zhí)行嗎?
是在return前,還是在return后呢?
會(huì),在return前執(zhí)行finally里面的代碼。
(8)Exception和RuntimeException的區(qū)別
A:Exception:一般性的錯(cuò)誤,是需要我們編寫代碼進(jìn)行處理的。
B:RuntimeException:運(yùn)行時(shí)異常,這個(gè)我們也不需要處理。
其實(shí)就是為了讓他在運(yùn)行時(shí)出問(wèn)題,然后我們回來(lái)修改代碼。
在用throws拋出一個(gè)的時(shí)候,如果這個(gè)異常是屬于RuntimeException的體系的時(shí)候,我們?cè)谡{(diào)用的地方可以不用處理。(RuntimeException和RuntimeException的子類)
在用throws拋出一個(gè)的時(shí)候,如果這個(gè)異常是屬于Exception的體系的時(shí)候,我們?cè)谡{(diào)用的地方必須進(jìn)行處理或者繼續(xù)拋出。
(9)自定義異常
定義類繼承Exception或者RuntimeException
1,為了讓該自定義類具備可拋性。
2,讓該類具備操作異常的共性方法。
class MyExcepiton extends Exception
{
MyExcepiton(){}
MyExcepiton(String message)
{
super(message);
}
}
class MyException extends RuntimeException
{
MyExcepiton(){}
MyExcepiton(String message)
{
super(message);
}
}(10)throws和throw的區(qū)別
A:有throws的時(shí)候可以沒(méi)有throw。
有throw的時(shí)候,如果throw拋的異常是Exception體系,那么必須有throws在方法上聲明。
B:throws用于方法的聲明上,其后跟的是異常類名,后面可以跟多個(gè)異常類,之間用逗號(hào)隔開(kāi)
throw用于方法體中,其后跟的是一個(gè)異常對(duì)象名
三、多線程:
1、進(jìn)程和線程:
進(jìn)程:正在進(jìn)行的程序。每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序,該順序是一個(gè)執(zhí)行路徑,或者叫一個(gè)控制單元。
線程:進(jìn)程內(nèi)部的一條執(zhí)行路徑或者一個(gè)控制單元。
兩者的區(qū)別:
一個(gè)進(jìn)程至少有一個(gè)線程
進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存;
2、jvm多線程的啟動(dòng)是多線程嗎?
java的虛擬機(jī)jvm啟動(dòng)的是單線程,就有發(fā)生內(nèi)存泄露的可能,而我們使用java程序沒(méi)出現(xiàn)這樣的問(wèn)題,也就是jvm啟動(dòng)至少有兩個(gè)線程,一個(gè)執(zhí)行java程序,一個(gè)執(zhí)行垃圾回收。所以是多線程。
2、多線程的優(yōu)勢(shì):
解決了多部分同時(shí)運(yùn)行的問(wèn)題,提高效率
3、線程的弊端:
線程太多會(huì)導(dǎo)致效率的降低,因?yàn)榫€程的執(zhí)行依靠的是CPU的來(lái)回切換。
4、什么叫多線程:
一個(gè)進(jìn)程中有多個(gè)線程,稱為多線程。
5、實(shí)現(xiàn)多線程的方法:
實(shí)現(xiàn)多線程可以通過(guò)繼承Thread類和實(shí)現(xiàn)Runnable接口。
(1)繼承Thread
定義一個(gè)類繼承Thread類
復(fù)寫Thread類中的public void run()方法,將線程的任務(wù)代碼封裝到run方法中
直接創(chuàng)建Thread的子類對(duì)象,創(chuàng)建線程
調(diào)用start()方法,開(kāi)啟線程(調(diào)用線程的任務(wù)run方法)
//另外可以通過(guò)Thread的getName()獲取線程的名稱。
(2)實(shí)現(xiàn)Runnable接口;
定義一個(gè)類,實(shí)現(xiàn)Runnable接口;
覆蓋接口的public void run()的方法,將線程的任務(wù)代碼封裝到run方法中;
創(chuàng)建Runnable接口的子類對(duì)象
將Runnabl接口的子類對(duì)象作為參數(shù)傳遞給Thread類的構(gòu)造函數(shù),創(chuàng)建Thread類對(duì)象
(原因:線程的任務(wù)都封裝在Runnable接口子類對(duì)象的run方法中。
所以要在線程對(duì)象創(chuàng)建時(shí)就必須明確要運(yùn)行的任務(wù))。
調(diào)用start()方法,啟動(dòng)線程。
兩種方法區(qū)別:
(1)實(shí)現(xiàn)Runnable接口避免了單繼承的局限性
(2)繼承Thread類線程代碼存放在Thread子類的run方法中
實(shí)現(xiàn)Runnable接口線程代碼存放在接口的子類的run方法中;
在定義線程時(shí),建議使用實(shí)現(xiàn)Runnable接口,因?yàn)閹缀跛卸嗑€程都可以使用這種方式實(shí)現(xiàn)
6、創(chuàng)建線程是為什么要復(fù)寫run方法?
Thread類用于描述線程。Thread類定義了一個(gè)功能,用于存儲(chǔ)線程要運(yùn)行的代碼,該存儲(chǔ)功能就是run方法。
7、start()和run方法有什么區(qū)別?
調(diào)用start方法方可啟動(dòng)線程,而run方法只是thread的一個(gè)普通方法,調(diào)用run方法不能實(shí)現(xiàn)多線程;
Start()方法:
start方法用來(lái)啟動(dòng)線程,實(shí)現(xiàn)了多線程運(yùn)行,這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的 代碼。通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程,這時(shí)此線程處于就緒(可運(yùn)行)狀態(tài),并沒(méi)有運(yùn)行,一旦得到cpu時(shí)間片(執(zhí)行權(quán)),就開(kāi)始執(zhí)行run()方法,這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容,Run方法運(yùn)行結(jié)束,此線程隨即終止。
Run()方法:
run()方法只是Thread類的一個(gè)普通方法,如果直接調(diào)用Run方法,程序中依然只有主線程這一個(gè)線程,其程序執(zhí)行路徑還是只有一條,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒(méi)有達(dá)到多線程的目的。
8、線程的幾種狀態(tài):
新建:new一個(gè)Thread對(duì)象或者其子類對(duì)象就是創(chuàng)建一個(gè)線程,當(dāng)一個(gè)線程對(duì)象被創(chuàng)建,但是沒(méi)有開(kāi)啟,這個(gè)時(shí)候,只是對(duì)象線程對(duì)象開(kāi)辟了內(nèi)存空間和初始化數(shù)據(jù)。
就緒:新建的對(duì)象調(diào)用start方法,就開(kāi)啟了線程,線程就到了就緒狀態(tài)。
在這個(gè)狀態(tài)的線程對(duì)象,具有執(zhí)行資格,沒(méi)有執(zhí)行權(quán)。
運(yùn)行:當(dāng)線程對(duì)象獲取到了CPU的資源。
在這個(gè)狀態(tài)的線程對(duì)象,既有執(zhí)行資格,也有執(zhí)行權(quán)。
凍結(jié):運(yùn)行過(guò)程中的線程由于某些原因(比如wait,sleep),釋放了執(zhí)行資格和執(zhí)行權(quán)。
當(dāng)然,他們可以回到運(yùn)行狀態(tài)。只不過(guò),不是直接回到。
而是先回到就緒狀態(tài)。
死亡:當(dāng)線程對(duì)象調(diào)用的run方法結(jié)束,或者直接調(diào)用stop方法,就讓線程對(duì)象死亡,在內(nèi)存中變成了垃圾。
9、sleep()和wait()的區(qū)別:
(1)這兩個(gè)方法來(lái)自不同的類,sleep()來(lái)自Thread類,和wait()來(lái)自O(shè)bject類。
(2)sleep是Thread的靜態(tài)類方法,誰(shuí)調(diào)用的誰(shuí)去睡覺(jué),即使在a線程里調(diào)用了b的sleep方法,實(shí)際上還是a去睡覺(jué),要讓b線程睡覺(jué)要在b的代碼中調(diào)用sleep。而wait()是Object類的非靜態(tài)方法
(3)sleep()釋放資源不釋放鎖,而wait()釋放資源釋放鎖;
(4)使用范圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
10、多線程安全問(wèn)題:
(1)原因:當(dāng)程序的多條語(yǔ)句在操作線程共享數(shù)據(jù)時(shí)(如買票例子中的票就是共享資源),由于線程的隨機(jī)性導(dǎo)致
一個(gè)線程對(duì)多條語(yǔ)句,執(zhí)行了一部分還沒(méi)執(zhí)行完,另一個(gè)線程搶奪到cpu執(zhí)行權(quán)參與進(jìn)來(lái)執(zhí)行,此時(shí)就導(dǎo)致共享數(shù)據(jù)發(fā)生錯(cuò)誤。比如買票例子中打印重票和錯(cuò)票的情況。
(2)解決方法:對(duì)多條操作共享數(shù)據(jù)的語(yǔ)句進(jìn)行同步,一個(gè)線程在執(zhí)行過(guò)程中其他線程不可以參與進(jìn)來(lái)
11、Java中多線程同步是什么?
同步是用來(lái)解決多線程的安全問(wèn)題的,在多線程中,同步能控制對(duì)共享數(shù)據(jù)的訪問(wèn)。如果沒(méi)有同步,當(dāng)一個(gè)線程在 修改一個(gè)共享數(shù)據(jù)時(shí),而另外一個(gè)線程正在使用或者更新同一個(gè)共享數(shù)據(jù),這樣容易導(dǎo)致程序出現(xiàn)錯(cuò)誤的結(jié)果。
12、什么是鎖?鎖的作用是什么? 鎖就是對(duì)象
鎖的作用是保證線程同步,解決線程安全問(wèn)題。
持有鎖的線程可以在同步中執(zhí)行,沒(méi)有鎖的線程即使獲得cpu執(zhí)行權(quán),也進(jìn)不去。
13、同步的前提:(1)必須保證有兩個(gè)以上線程
(2)必須是多個(gè)線程使用同一個(gè)鎖,即多條語(yǔ)句在操作線程共享數(shù)據(jù)
(3)必須保證同步中只有一個(gè)線程在運(yùn)行
14、同步的好處和弊端
好處:同步解決了多線程的安全問(wèn)題
弊端:多線程都需要判斷鎖,比較消耗資源
15、同步的兩種表現(xiàn)形式:
(1)同步代碼塊:
可以指定需要獲取哪個(gè)對(duì)象的同步鎖,使用synchronized的代碼塊同樣需要鎖,但他的鎖可以是任意對(duì)象
考慮到安全問(wèn)題,一般還是使用同一個(gè)對(duì)象,相對(duì)來(lái)說(shuō)效率較高。
注意:
**雖然同步代碼快的鎖可以使任何對(duì)象,但是在進(jìn)行多線程通信使用同步代碼快時(shí),必須保證同步代碼快的鎖的對(duì)象和,否則會(huì)報(bào)錯(cuò)。
**同步函數(shù)的鎖是this,也要保證同步函數(shù)的鎖的對(duì)象和調(diào)用wait、notify和notifyAll的對(duì)象是
同一個(gè)對(duì)象,也就是都是this鎖代表的對(duì)象。
格式:
synchronized(對(duì)象)
{
需同步的代碼;
}(2)同步函數(shù)
同步方法是指進(jìn)入該方法時(shí)需要獲取this對(duì)象的同步鎖,在方法上使用synchronized關(guān)鍵字,使用this對(duì)象作為鎖,也就是使用了當(dāng)前對(duì)象,因?yàn)殒i住了方法,所以相對(duì)于代碼塊來(lái)說(shuō)效率相對(duì)較低。
注:靜態(tài)同步函數(shù)的鎖是該方法所在的類的字節(jié)碼文件對(duì)象,即類名.class文件
格式:
修飾詞 synchronized 返回值類型 函數(shù)名(參數(shù)列表)
{
需同步的代碼;
}
在jdk1.5后,用lock鎖取代了synchronized,個(gè)人理解也就是對(duì)同步代碼塊做了修改,并沒(méi)有提供對(duì)同步方法的修改,主要還是效率問(wèn)題吧。
16、多線程的單例設(shè)計(jì)模式:保證某個(gè)類中內(nèi)存中只有一個(gè)對(duì)象
(1)餓漢式:
class Single
{
private Single(){}//將構(gòu)造函數(shù)私有化,不讓別的類建立該類對(duì)象
private static final Single s=new Single();//自己建立一個(gè)對(duì)象
public static Single getInstance()//提供一個(gè)公共訪問(wèn)方式
{
return s;
}
}(2)懶漢式:
class Single
{
private Single(){}
private static Single s;
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
} 餓漢式和懶漢式的區(qū)別:
**
餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對(duì)象;
懶漢式則是類加載進(jìn)內(nèi)存的時(shí)候,對(duì)象還沒(méi)有存在,只有調(diào)用了getInstance()方法時(shí),對(duì)象才開(kāi)始創(chuàng)建。
**
懶漢式是延遲加載,如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問(wèn)題,解決線程安全問(wèn)題
可以加同步來(lái)解決。但是加了同步之后,每一次都要比較鎖,效率就變慢了,所以可以加雙重判斷來(lái)提高程序效率。
如將上述懶漢式的Instance函數(shù)改成同步:
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
}
}
return s;
}
17、死鎖
兩個(gè)線程對(duì)兩個(gè)同步對(duì)象具有循環(huán)依賴時(shí),就會(huì)發(fā)生死鎖。即同步嵌套同步,而鎖卻不同。
18、wait()、sleep()、notify()、notifyAll()wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程(一般是最先開(kāi)始等待的線程),而且不是按優(yōu)先級(jí)。
Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)。
18、為什么wait()、notify()、notifyAll()這些用來(lái)操作線程的方法定義在Object類中?
(1)這些方法只存在于同步中;
(2)使用這些方法時(shí)必須要指定所屬的鎖,即被哪個(gè)鎖調(diào)用這些方法;
(3)而鎖可以是任意對(duì)象,所以任意對(duì)象調(diào)用的方法就定義在Object中。
19、多線程間通訊:
多線程間通訊就是多個(gè)線程在操作同一資源,但是操作的動(dòng)作不同.(1)為什么要通信
多線程并發(fā)執(zhí)行的時(shí)候, 如果需要指定線程等待或者喚醒指定線程, 那么就需要通信.比如生產(chǎn)者消費(fèi)者的問(wèn)題,生產(chǎn)一個(gè)消費(fèi)一個(gè),生產(chǎn)的時(shí)候需要負(fù)責(zé)消費(fèi)的進(jìn)程等待,生產(chǎn)一個(gè)后完成后需要喚醒負(fù)責(zé)消費(fèi)的線程,同時(shí)讓自己處于等待,消費(fèi)的時(shí)候負(fù)責(zé)消費(fèi)的線程被喚醒,消費(fèi)完生產(chǎn)的產(chǎn)品后又將等待的生產(chǎn)線程喚醒,然后使自己線程處于等待。這樣來(lái)回通信,以達(dá)到生產(chǎn)一個(gè)消費(fèi)一個(gè)的目的。
(2)怎么通信
在同步代碼塊中, 使用鎖對(duì)象的wait()方法可以讓當(dāng)前線程等待, 直到有其他線程喚醒為止.使用鎖對(duì)象的notify()方法可以喚醒一個(gè)等待的線程,或者notifyAll喚醒所有等待的線程.多線程間通信用sleep很難實(shí)現(xiàn),睡眠時(shí)間很難把握。
20、Lock和Condition 實(shí)現(xiàn)提供比synchronized方法和語(yǔ)句可獲得的更廣泛的鎖的操作,可支持多個(gè)相關(guān)的Condition對(duì)象
Lock是個(gè)接口
鎖是控制多個(gè)線程對(duì)共享數(shù)據(jù)進(jìn)行訪問(wèn)的工具。
JDK1.5中提供了多線程升級(jí)的解決方案:
將同步synchonized替換成了顯示的Lock操作,將Object中的wait、notify、notifyAll替換成了Condition對(duì)象。
該對(duì)象可以Lock鎖進(jìn)行獲取
Lock的方法摘要:
void lock()獲取鎖。
Condition newCondition()返回綁定到此 Lock 實(shí)例的新 Condition 實(shí)例。
void unlock()釋放鎖。
Condition方法摘要:
void await()造成當(dāng)前線程在接到信號(hào)或被中斷之前一直處于等待狀態(tài)。
void signal()喚醒一個(gè)等待線程。
void signalAll()喚醒所有等待線程。
21、停止線程:
stop方法已經(jīng)過(guò)時(shí),如何停止線程?
停止線程的方法只有一種,就是run方法結(jié)束。如何讓run方法結(jié)束呢?
開(kāi)啟多線程運(yùn)行,運(yùn)行代碼通常是循環(huán)體,只要控制住循環(huán),就可以讓run方法結(jié)束,也就是結(jié)束線程。
特殊情況:當(dāng)線程屬于凍結(jié)狀態(tài),就不會(huì)讀取循環(huán)控制標(biāo)記,則線程就不會(huì)結(jié)束。
為解決該特殊情況,可引入Thread類中的Interrupt方法結(jié)束線程的凍結(jié)狀態(tài);
當(dāng)沒(méi)有指定的方式讓凍結(jié)線程恢復(fù)到運(yùn)行狀態(tài)時(shí),需要對(duì)凍結(jié)進(jìn)行清除,強(qiáng)制讓線程恢復(fù)到運(yùn)行狀態(tài)
22、interrupt: void interrupt()中斷線程:
中斷狀態(tài)將被清除,它還將收到一個(gè) InterruptedException
22、守護(hù)線程(后臺(tái)線程)setDaemon(boolean on):將該線程標(biāo)記為守護(hù)線程或者用戶線程。
當(dāng)主線程結(jié)束,守護(hù)線程自動(dòng)結(jié)束,比如圣斗士星矢里面的守護(hù)雅典娜,在多線程里面主線程就是雅典娜,守護(hù)線程就是圣斗士,主線程結(jié)束了,守護(hù)線程則自動(dòng)結(jié)束。
當(dāng)正在運(yùn)行的線程都是守護(hù)線程時(shí),java虛擬機(jī)jvm退出;所以該方法必須在啟動(dòng)線程前調(diào)用;
守護(hù)線程的特點(diǎn):
守護(hù)線程開(kāi)啟后和前臺(tái)線程共同搶奪cpu的執(zhí)行權(quán),開(kāi)啟、運(yùn)行兩者都沒(méi)區(qū)別,但結(jié)束時(shí)有區(qū)別,當(dāng)所有前臺(tái)線程都結(jié)束后,守護(hù)線程會(huì)自動(dòng)結(jié)束。
23、多線程join方法:
void join()等待該線程終止。
void join(long millis)等待該線程終止的時(shí)間最長(zhǎng)為 millis 毫秒。
throws InterruptedException
特點(diǎn):當(dāng)A線程執(zhí)行到B線程的join方法時(shí),A就會(huì)等待B線程都執(zhí)行完,A才會(huì)執(zhí)行
作用: join可以用來(lái)臨時(shí)加入線程執(zhí)行;
24、多線程優(yōu)先級(jí):yield()方法
yield():暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程
setPriority(int newPriority):更改線程優(yōu)先級(jí)
int getPriority()返回線程的優(yōu)先級(jí)。
String toString()返回該線程的字符串表示形式,包括線程名稱、優(yōu)先級(jí)和線程組
(1)MAX_PRIORITY:最高優(yōu)先級(jí)(10級(jí))(1)Min_PRIORITY:最低優(yōu)先級(jí)(1級(jí))(1)Morm_PRIORITY:默認(rèn)優(yōu)先級(jí)(5級(jí))
25、什么是ThreadLocal類,怎么使用它?
ThreadLocal類提供了線程局部(thread-local)變量。是一個(gè)線程級(jí)別的局部變量,并非“本地線程”。
ThreadLocal 為每個(gè)使用該變量的線程,提供了一個(gè)獨(dú)立的變量副本,每個(gè)線程修改副本時(shí)不影響其它線程對(duì)象的副本
下面是線程局部變量(ThreadLocal variables)的關(guān)鍵點(diǎn):
一個(gè)線程局部變量(ThreadLocal variables)為每個(gè)線程方便地提供了一個(gè)單獨(dú)的變量。
ThreadLocal 實(shí)例通常作為靜態(tài)的私有的(private static)字段出現(xiàn)在一個(gè)類中,這個(gè)類用來(lái)關(guān)聯(lián)一個(gè)線程。
當(dāng)多個(gè)線程訪問(wèn) ThreadLocal 實(shí)例時(shí),每個(gè)線程維護(hù) ThreadLocal 提供的獨(dú)立的變量副本。
常用的使用可在 DAO 模式中見(jiàn)到,當(dāng) DAO 類作為一個(gè)單例類時(shí),數(shù)據(jù)庫(kù)鏈接(connection)被每一個(gè)線程獨(dú)立的維護(hù),互不影響。(基于線程的單例)
26、什么時(shí)候拋出InvalidMonitorStateException異常?為什么?
調(diào)用 wait()/notify()/notifyAll()中的任何一個(gè)方法時(shí),如果當(dāng)前線程沒(méi)有獲得該對(duì)象的鎖,那么就會(huì)拋出 IllegalMonitorStateException 的異常
也就是說(shuō)程序在沒(méi)有執(zhí)行對(duì)象的任何同步塊或者同步方法時(shí),仍然嘗試調(diào)用 wait()/notify()/notifyAll()時(shí)。由于該異常是 RuntimeExcpetion 的子類,所以該異常不一定要捕獲(盡管你可以捕獲只要你愿意
作為 RuntimeException,此類異常不會(huì)在 wait(),notify(),notifyAll()的方法簽名提及。
27、在靜態(tài)方法上使用同步時(shí)會(huì)發(fā)生什么事?
同步靜態(tài)方法時(shí)會(huì)獲取該類的“Class”對(duì)象,所以當(dāng)一個(gè)線程進(jìn)入同步的靜態(tài)方法中時(shí),線程監(jiān)視器獲取類本身的對(duì)象鎖,其它線程不能進(jìn)入這個(gè)類的任何靜態(tài)同步方法。
它不像實(shí)例方法,因?yàn)槎鄠€(gè)線程可以同時(shí)訪問(wèn)不同實(shí)例同步實(shí)例方法。
28、當(dāng)一個(gè)同步方法已經(jīng)執(zhí)行,線程能夠調(diào)用對(duì)象上的非同步實(shí)例方法嗎?
可以,一個(gè)非同步方法總是可以被調(diào)用而不會(huì)有任何問(wèn)題。
實(shí)際上,Java 沒(méi)有為非同步方法做任何檢查,鎖對(duì)象僅僅在同步方法或者同步代碼塊中檢查。
如果一個(gè)方法沒(méi)有聲明為同步,即使你在使用共享數(shù)據(jù)Java照樣會(huì)調(diào)用,而不會(huì)做檢查是否安全,所以在這種情況下要特別小心。一個(gè)方法是否聲明為同步取決于臨界區(qū)訪問(wèn)(critial section access),如果方法不訪問(wèn)臨界區(qū)(共享資源或者數(shù)據(jù)結(jié)構(gòu))就沒(méi)必要聲明為同步的。
29、在一個(gè)對(duì)象上兩個(gè)線程可以調(diào)用兩個(gè)不同的同步實(shí)例方法嗎?
不能,因?yàn)橐粋€(gè)對(duì)象已經(jīng)同步了實(shí)例方法,線程獲取了對(duì)象的對(duì)象鎖。
所以只有執(zhí)行完該方法釋放對(duì)象鎖后才能執(zhí)行其它同步方法。30、什么是線程餓死,什么是活鎖?
線程餓死和活鎖雖然不像死鎖一樣是常見(jiàn)的問(wèn)題,但是對(duì)于并發(fā)編程的設(shè)計(jì)者來(lái)說(shuō)就像一次邂逅一樣。
當(dāng)所有線程阻塞,或者由于需要的資源無(wú)效而不能處理,不存在非阻塞線程使資源可用。
JavaAPI 中線程活鎖可能發(fā)生在以下情形:
當(dāng)所有線程在程序中執(zhí)行 Object.wait(0),參數(shù)為 0 的 wait 方法。
程序?qū)l(fā)生活鎖直到在相應(yīng)的對(duì)象上有線程調(diào)用 Object.notify()或者 Object.notifyAll()。
當(dāng)所有線程卡在無(wú)限循環(huán)中。
四、集合框架
1:String類:字符串(重點(diǎn))(1)多個(gè)字符組成的一個(gè)序列,叫字符串。
生活中很多數(shù)據(jù)的描述都采用的是字符串的。而且我們還會(huì)對(duì)其進(jìn)行操作。
所以,java就提供了這樣的一個(gè)類供我們使用。
(2)創(chuàng)建字符串對(duì)象
A:String():無(wú)參構(gòu)造
**舉例:
String s = new String();
s = “hello”;
sop(s);
B:String(byte[] bys):傳一個(gè)字節(jié)數(shù)組作為參數(shù) *****
**舉例
byte[] bys = {97,98,99,100,101};
String s = new String(bys);
sop(s);
C:String(byte[] bys,int index,int length):把字節(jié)數(shù)組的一部分轉(zhuǎn)換成一個(gè)字符串 *****
**舉例
byte[] bys = {97,98,99,100,101};
String s = new String(bys,1,2);
sop(s);
D:String(char[] chs):傳一個(gè)字符數(shù)組作為參數(shù) *****
**舉例
char[] chs = {'a','b','c','d','e'};
String s = new String(chs);
sop(s);
E:String(char[] chs,int index,int length):把字符數(shù)組的一部分轉(zhuǎn)換成一個(gè)字符串 *****
**舉例
char[] chs = {'a','b','c','d','e'};
String s = new String(chs,1,2);
sop(s);
F:String(String str):把一個(gè)字符串傳遞過(guò)來(lái)作為參數(shù)
char[] chs = {'a','b','c','d','e'};
String ss = new String(s);
sop(ss);
G:直接把字符串常量賦值給字符串引用對(duì)象(最常用)*****
**舉例
String s = “hello”;
sop(s);(3)面試題
A:請(qǐng)問(wèn)String s = new String(“hello”);創(chuàng)建了幾個(gè)對(duì)象。
兩個(gè)。一個(gè)“hello”字符串對(duì)象,在方法區(qū)的常量池;一個(gè)s對(duì)象,在棧內(nèi)存。
B:請(qǐng)寫出下面的結(jié)果
String s1 = new String(“abc”);
Strign s2 = new String(“abc”);
String s3 = “abc”;
String s4 = “abc”;
sop(s1==s2);//false
sop(s1==s3);//false
sop(s3==s4);//true
C:字符串對(duì)象一旦被創(chuàng)建就不能被改變。
指的是字符串常量值不改變。(4)字符串中各種功能的方法
A:判斷
**** boolean equals(Object anObject):判斷兩個(gè)字符串的內(nèi)容是否相同,復(fù)寫了Object的方法
**** boolean equalsIgnoreCase(String anotherString):判斷兩個(gè)字符串的內(nèi)容是否相同,不區(qū)分大小寫
**** boolean contains(String s):判斷一個(gè)字符串中是否包含另一個(gè)字符串
注意:判斷字符串是否包含特殊字符.直接表示為str.contains(“.”)
boolean endsWith(String suffix):測(cè)試此字符串是否以指定的后綴結(jié)束
boolean startsWith(String suffix):測(cè)試此字符串是否以指定的前綴開(kāi)始
boolean isEmpty():測(cè)試字符串是否為空
B:獲取
***** int length():返回此字符串的長(zhǎng)度
***** char charAt(int index):返回指定索引處的 char值
***** int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引。
int indexOf(int ch, int fromIndex):返回在此字符串中第一次出現(xiàn)指定字符處的索引,從指定的索引開(kāi)始搜索。
int indexOf(String str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次
出現(xiàn)處的索引,從指定的索引開(kāi)始。
*** int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出現(xiàn)處的索引。
int lastIndexOf(int ch, int fromIndex)
返回指定字符在此字符串中最后一次出現(xiàn)處的索引,從指定的索引處開(kāi)始進(jìn)行反向搜索。
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引。
int lastIndexOf(String str, int fromIndex)
返回指定子字符串在此字符串中最后一次出現(xiàn)處的索引,從指定的索引開(kāi)始反向搜索。
***** String substring(int beginIndex)(注意:該方法substring的String是小寫!!)
返回一個(gè)新的字符串,它是此字符串的一個(gè)子字符串。
String substring(int beginIndex, int endIndex)(注意該方法的String是小寫!!)
返回一個(gè)新字符串,它是此字符串的一個(gè)子字符串,包含頭不包含尾。
C:轉(zhuǎn)換
***** byte[] getBytes():(很常用!)從字符串到字節(jié)數(shù)組的方法
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
將字符從此字符串復(fù)制到目標(biāo)字符數(shù)組。
***** char[] toCharArray():(很常用!)從字符串到字符數(shù)組的方法
**** static String copyValueOf(char[] data)
返回指定數(shù)組中表示該字符序列的 String。
static String copyValueOf(char[] data, int offset, int count)
返回指定數(shù)組中表示該字符序列的 String。
***** static String valueOf(數(shù)據(jù)類型):把該數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成字符串。
*** String toLowerCase():把字符串轉(zhuǎn)換成小寫
String toUpperCase():把字符串轉(zhuǎn)換成大寫
*** 字符串的連接
String concat(String str):將指定字符串連接到此字符串的結(jié)尾。
D:替換
String replace(char oldChar, char newChar):用新字符替換舊字符(替換所有)
String replace(String target, String replacement):用新的子串換舊串
E:分割
String[] split(String regex):根據(jù)指定的字符串把一個(gè)字符串分割成一個(gè)字符串?dāng)?shù)組
F:
String trim():去除字符串的前后空格
G:
int compareTo(String anotherString)
按字典順序比較兩個(gè)字符串。
int compareToIgnoreCase(String str)
按字典順序比較兩個(gè)字符串,不考慮大小寫。
(5)練習(xí)
1:模擬登錄,給三次機(jī)會(huì),并提示還有幾次.默認(rèn)的用戶名和密碼為admin。區(qū)分大小寫。
自己從鍵盤輸入用戶名和密碼。
2:給定一個(gè)字符串統(tǒng)計(jì),統(tǒng)計(jì)大寫字母,小寫字母,數(shù)字出現(xiàn)的個(gè)數(shù).***注意:不包括特殊字符
從鍵盤輸入一個(gè)不包含特殊字符的字符串(只有26個(gè)字母和0-9組成)。
3:給定一個(gè)字符串,把它變成首字母大寫,其他字母小寫的字符串.從鍵盤輸入一個(gè)字符串,全部26個(gè)字母組成的。
4:子串在整串中出現(xiàn)的次數(shù)。
也就是說(shuō):獲取一個(gè)字符串中,指定的字串在該字符串中出現(xiàn)的次數(shù).例如:
“nbasdnbafllgnbahjnbakqqqqlnba” 在這個(gè)字符串中,多有個(gè)nba.5:對(duì)字符串中字符進(jìn)行自然順序排序。
“basckd”-->“abcdks”
先留做思考內(nèi)容:
6:兩個(gè)字符串的最大相同子串。
兩個(gè)字符串的最大相同子串。
比如:
“sadabcdfghjkl”
werabcdtyu“
2:StringBuffer(1)字符串的緩沖區(qū),是一個(gè)容器。
(2)它和String的區(qū)別
它是緩沖區(qū)可變長(zhǎng)度的。
(3)構(gòu)造方法
StringBuffer()構(gòu)造一個(gè)其中不帶字符的字符串緩沖區(qū),初始容量為 16 個(gè)字符。
StringBuffer(int num)構(gòu)造一個(gè)不帶字符,但具有指定初始容量的字符串緩沖區(qū)。
StringBuffer(String str)構(gòu)造一個(gè)字符串緩沖區(qū),并將其內(nèi)容初始化為指定的字符串內(nèi)容。
(4)常用方法
A:增加數(shù)據(jù)
**append :添加各種類型的數(shù)據(jù)
**insert : 在容器指定位置插入各種類型的數(shù)據(jù)。
B:刪除數(shù)據(jù)
**deleteCharAt : 刪除指定位置的字符
**delete 還可以用于清空StringBuffer的緩沖區(qū)
C:替換
**replace
D:獲取
**charAt
E:長(zhǎng)度和容量
**length()元素的個(gè)數(shù)
**capacity 元素的理論值
F:獲取元素的位置
**indexOf
**lastIndexOf
G:截取
**substring(int start)
**substring(int start,int end)
H:反轉(zhuǎn)
**reverse(5)字符串和StringBuffer的轉(zhuǎn)換
String-->StringBuffer通過(guò)構(gòu)造:
如:StringBuffer sb = new StringBuffer(String str)
StringBuffer--String通過(guò)toString方法
如:StringBuffer sb = new StringBuffer();
sb.toString();
3:StringBuilder 和StringBuffer的功能是一樣的,但是有區(qū)別:
StringBuffer(JDK1.0)是線程安全的。
StringBuilder(JDK1.5)不保證線程安全。一般來(lái)說(shuō),我們寫的程序都是單線程的,所以,用StringBuilder,效率高。
JDK版本的升級(jí)原則:
A:提高效率
B:提高安全性
C:簡(jiǎn)化書(shū)寫
4:基本數(shù)據(jù)類型的對(duì)象包裝類
(1)為了更方便的操作每個(gè)基本數(shù)據(jù)類型,java對(duì)其提供了很多的屬性和方法供我們使用。
(2)用途:
**將基本數(shù)據(jù)類型封裝成對(duì)象的好處在于可以在對(duì)象中定義更多的功能操作該數(shù)據(jù)。
**常用的操作之一:用于基本數(shù)據(jù)類型與字符串之間的轉(zhuǎn)換。
A:方便操作
B:用于和字符串進(jìn)行相互轉(zhuǎn)換
(3)基本數(shù)據(jù)類型和對(duì)象類型的對(duì)應(yīng)
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character(4)構(gòu)造方法
字段摘要:
static int MAX_VALUE 值為 2^31-1 的常量,它表示 int 類型能夠表示的最大值
static int MIN_VALUE 值為-2^31 的常量,它表示 int 類型能夠表示的最小值
static Class
Integer(int value)構(gòu)造一個(gè)新分配的Integer對(duì)象,它表示指定的int值。
Inreger(String s)注意:s必須是純數(shù)字的字符串。否則會(huì)有異常NumberFormatException
(5)幾個(gè)常用的方法
Integer.toBinaryString();
以二進(jìn)制(基數(shù) 2)無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式。
Integer.toOctalString();
以八進(jìn)制(基數(shù) 8)無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式。
Integer.toHexString();
以十六進(jìn)制(基數(shù) 16)無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式。
static int Integer.parseInt(String s)將字符串參數(shù)作為有符號(hào)的十進(jìn)制整數(shù)進(jìn)行解析,字符串必須是int型范圍內(nèi)的數(shù)字字符串
static int Integer.parseInt(String s,int basic)
使用第二個(gè)參數(shù)指定的基數(shù),將字符串參數(shù)解析為有符號(hào)的整數(shù).字符串必須是int型范圍內(nèi)的數(shù)字字符串
short shortValue()以short類型返回該Integer的值。
int intValue()以int類型返回該Integer的值。
static Integer valueOf(int num)返回一個(gè)表示指定的 int 值的 Integer 實(shí)例。
static Integer valueOf(String s)返回保存指定的String的值的Integer對(duì)象。
static Integer valueOf(String s, int radix)
返回一個(gè)Integer對(duì)象,該對(duì)象中保存了用第二個(gè)參數(shù)提供的基數(shù)進(jìn)行
解析時(shí)從指定的String中提取的值。
(6)類型轉(zhuǎn)換
int--Integer
int num = 20;
A:Integer i = new Integer(num);
B:Integer i = Integer.valueOf(num);
Integer--int
Integer i = new Integer(20);
A:int num = i.intValue();
int--String
int num = 20;
A:String s = String.valueOf(num);
B:String s = ”“+num;
C:String s = Integer.toString(num);
String--int
String s = ”20“;
A:int num = Integer.parseInt(s);
B:Integer i = new Integer(s);或者Integer i = Integer.valueOf(s);
int num = i.intValue();
6、集合框架:
(1)為什么出現(xiàn)集合類?
面向?qū)ο髮?duì)事物的體現(xiàn)都是以對(duì)象的形式,為了方便對(duì)多個(gè)對(duì)象的操作,就對(duì)對(duì)象進(jìn)行存儲(chǔ)。
集合就是存儲(chǔ)對(duì)象最常用的一種方式.(2)數(shù)組和集合都是容器,兩者有何不同?
**數(shù)組長(zhǎng)度固定,而集合長(zhǎng)度是可變的**數(shù)組值可以存儲(chǔ)對(duì)象,還可以存儲(chǔ)基本數(shù)據(jù)類型;而集合只能存儲(chǔ)對(duì)象
**數(shù)組存儲(chǔ)數(shù)據(jù)類型是固定的,而集合存儲(chǔ)的數(shù)據(jù)類型不固定
(3)集合類的特點(diǎn):
集合只能存儲(chǔ)對(duì)象
集合的長(zhǎng)度是可變的 集合可以存儲(chǔ)不同類型的對(duì)象
(4)集合類框架(重要!!要分清幾種容器間的區(qū)別):
**Collection:頂層接口
|--->List:列表,元素是有序的(元素帶角標(biāo)索引),可以有重復(fù)元素,可以有null元素。
|--->ArrayList(JDK1.2):底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是查詢速度快(因?yàn)閹Ы菢?biāo)),但是增刪速度稍慢,因?yàn)楫?dāng)元素多時(shí),增刪一個(gè)元素則所有元素的角標(biāo)都得改變
線程不同步。默認(rèn)長(zhǎng)度是10,當(dāng)超過(guò)長(zhǎng)度時(shí),按50%延長(zhǎng)集合長(zhǎng)度。
|--->LinkedList(JDK1.2):底層數(shù)據(jù)結(jié)構(gòu)式鏈表數(shù)據(jù)結(jié)構(gòu)(即后面一個(gè)元素記錄前一個(gè)),特點(diǎn):查詢速度慢,因?yàn)槊總€(gè)元素只知道前面一個(gè)元素,但增刪速度快
因?yàn)樵卦俣啵鰟h一個(gè),只要讓其前后的元素重新相連即可
線程是不同步的。
|--->Vector(JDK1.0):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組數(shù)據(jù)結(jié)構(gòu).特點(diǎn)是查詢和增刪速度都很慢。
默認(rèn)長(zhǎng)度是10,當(dāng)超過(guò)長(zhǎng)度時(shí),按100%延長(zhǎng)集合長(zhǎng)度。
線程同步。
(Vector功能跟ArrayList功能一模一樣,已被ArrayList替代)
**List使用注意!
|--->ArrayList:
(1)當(dāng)往ArrayList里面存入元素沒(méi)什么要求時(shí),即只要求有序就行時(shí);
(2)當(dāng)往ArrayList里面存入元素要求不重復(fù)時(shí),比如存入學(xué)生對(duì)象,當(dāng)同名同姓時(shí)
視為同一個(gè)人,則不往里面存儲(chǔ)。則定義學(xué)生對(duì)象時(shí),需復(fù)寫equals方法
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
return false;
Student stu =(Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age;
}
則往ArrayList集合通過(guò)add存入學(xué)生對(duì)象時(shí),集合底層自己會(huì)調(diào)用學(xué)生類的equals方法,判斷重復(fù)學(xué)生則不存入。
注:對(duì)于List集合,無(wú)論是add、contains、還是remove方法,判斷元素是否相同,都是通過(guò)復(fù)寫equals方法來(lái)判斷!
|--->LinkedList
(1)LinkLedist的特有方法:
boolean offerFirst(E e)在此列表的開(kāi)頭插入指定的元素。
boolean offerLast(E e)在此列表末尾插入指定的元素。
E peekFirst()獲取但不移除此列表的第一個(gè)元素;如果此列表為空,則返回 null。
E peekLast()獲取但不移除此列表的最后一個(gè)元素;如果此列表為空,則返回 null。
E pollFirst()獲取并移除此列表的第一個(gè)元素;如果此列表為空,則返回 null。
E pollLast()獲取并移除此列表的最后一個(gè)元素;如果此列表為空,則返回 null。
(2)通過(guò)LinkLedist的特有方法,可以實(shí)現(xiàn)某些數(shù)據(jù)特殊方式的存取,比如堆棧和隊(duì)列。
一般情況下,使用哪種List接口下的實(shí)現(xiàn)類呢?
如果要求增刪快,考慮使用LinkedList
如果要求查詢快,考慮使用ArrayList
如果要求線程安全,考慮使用Vector。
|--->Set:集合,元素是無(wú)序的(因?yàn)闆](méi)有索引),元素不可以重復(fù)。可以有null元素。
|--->HashSet(JDK1.2):底層數(shù)據(jù)結(jié)構(gòu)是哈希表、存取速度快、元素唯
一、線程不同步。
保證性元素唯一的原理:
先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true
(往HashSet里面存的自定義元素要復(fù)寫hashCode和equals方法,以保證元素的唯一性!)
|--->TreeSet:底層數(shù)據(jù)結(jié)構(gòu)式二叉樹(shù)。可以對(duì)Set集合中的元素進(jìn)行排序。元素有序、線程不同步。
保證元素唯一性的依據(jù):compareTo方法return 0
TreeSet排序的第一種方式:讓元素自身具備比較性,比如八種基本數(shù)據(jù)類型或則字符串,實(shí)現(xiàn)Compareble接口,覆蓋compareTo方法,此方式是元素的自然順序
TreeSet排序的第一種方式:當(dāng)元素自身不具備比較性(比如存儲(chǔ)學(xué)生對(duì)象時(shí))或者具備的比較性不是我們所需要的比較性時(shí)(比如想字符串的長(zhǎng)度排序),此時(shí)就需要讓集合自身具備自定義的比較性。
那如何讓集合自身具備比較性呢?可在集合初始化時(shí),就讓集合具備比較方式。即定義一個(gè)類,實(shí)現(xiàn)Comparator接口,覆蓋compare方法。
**Set集合使用注意事項(xiàng):
(1)HashSet:
通過(guò)new的方式往HashSet里面存的元素的hashCode都不同,但通常我們定義對(duì)象,比如學(xué)生對(duì)象時(shí),雖然是new的兩個(gè)學(xué)生對(duì)象,但是當(dāng)他們name和age一樣時(shí),我們認(rèn)為是
同一個(gè)對(duì)象,所以為了保證元素的唯一性,我們通常在往HashSet集合里面存儲(chǔ)元素時(shí),在定義對(duì)象的類中通常復(fù)寫hashCode和equals方法。
public int hashCode()
{
return name.hashCode()+age*39;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
return false;
Student stu =(Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age;
}
HashSet是如何保證元素唯一性的呢?
**如果兩元素的hashCode值不同,則不會(huì)調(diào)用equals方法
**如果兩元素的hashCode值相同,則繼續(xù)判斷equals是否返回true;
**hashCode和equals方法雖然定義在自定義對(duì)象類里面,但不是我們手動(dòng)調(diào)用
而是往HashSet集合里面存儲(chǔ)元素的時(shí)候,集合底層自己調(diào)用hashCode和equals
它自己拿對(duì)象去判斷,自己判斷兩元素是否是同一個(gè)元素。
(2)TreeSet:
TreeSet要求往里面存的元素具備比較性,否則會(huì)報(bào)錯(cuò)。
TreeSet排序的第一種方式:讓元素自身具備比較性
定義對(duì)象類,實(shí)現(xiàn)Compareble接口,復(fù)寫compareTo方法,此方式是元素的自然順序
class Student implements Comparable
{
private String name;
private int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException(”不是學(xué)生對(duì)象!“);
Student stu =(Student)obj;
int num = this.age-stu.age;
if(num==0)
return this.name.compareTo(stu.name);
return num;
}
}
TreeSet排序的第一種方式:讓集合具備比較性
當(dāng)元素自身不具備比較性(比如存儲(chǔ)學(xué)生對(duì)象時(shí))或者具備的 比較性不是我們所需要的比較性時(shí)(比如想字符串的長(zhǎng)度排序),此時(shí)就需要讓集合自身具備自定義的比較性。
那如何讓集合自身具備比較性呢?可在集合初始化時(shí),就讓集合具備比較方式。即定義一個(gè)類,實(shí)現(xiàn)Comparator接口,覆蓋compare方法。
class StringLengthComparator implements Comparator
{
public int compare(Object obj1,Object obj2)
{
String s1 =(String)obj1;
String s2 =(String)obj2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;
}
}
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StringLengthComparator());
ts.add(”addfg“);
ts.add(”dfg“);
ts.add(”agtuug“);
ts.add(”vgjkg“);
sop(ts);
}
}
基本數(shù)據(jù)類型或字符串對(duì)象均實(shí)現(xiàn)了Comparable接口,故同種類型基本數(shù)據(jù)間具備比較性,即自然順序。
**Map:頂層接口,該集合存儲(chǔ)的是鍵值對(duì),而且鍵是唯一的,Map和Set很像,Set集合底層就是使用了Map集合。
Map集合沒(méi)有迭代器,要取出元素必須先將Map集合轉(zhuǎn)換成Set集合才能遍歷元素
|--->HashTable(JDK1.0):
底層是哈希表數(shù)據(jù)結(jié)構(gòu);
不可以使用null鍵和null值;
用作鍵的對(duì)象必須實(shí)現(xiàn)hashCode和equals方法來(lái)保證鍵的唯一性
線程同步,效率低
|--->HashMap(JDK1.2):
底層是哈希表數(shù)據(jù)結(jié)構(gòu);
允許使用null鍵和null值;
線程不同步,效率高;
保證元素唯一性的:
原理:先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true
(往HashSet里面存的自定義元素要復(fù)寫hashCode和equals方法,以保證元素的唯一性!)
class Student {
private String name;
private int age;
public Student(String name, int age){
super();
this.name = name;
this.age = age;} public int getAge(){
return age;} public void setAge(int age){
this.age = age;} public String getName(){
return name;} public void setName(String name){
this.name = name;}
@Override public int hashCode(){
return name.hashCode()+age*34;} @Override public boolean equals(Object obj){
if(!(obj instanceof Student))
return false;
Student stu =(Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age;} public class HashMapDemo1 { public static void main(String[] args){
Map
hmap.put(new Student(”001“,20), ”beijing“);
hmap.put(new Student(”002“,25), ”hebei“);
hmap.put(new Student(”003“,50), ”hainan“);
hmap.put(new Student(”001“,20), ”beijing“);
System.out.println(hmap.size());
Set
Iterator
while(it.hasNext()){
Student stu = it.next();
String addr = hmap.get(stu);
System.out.println(stu.getName()+”..“+stu.getAge()+”::“+addr);
}
}
}
|--->TreeMap(JDK1.0):
底層是二叉樹(shù)結(jié)構(gòu);
允許使用null鍵和null值;
線程不同步;
可以給Map集合中的鍵進(jìn)行排序.TreeMap排序的第一種方式:讓元素自身具備比較性,比如八種基本數(shù)據(jù)類型或則字符串,實(shí)現(xiàn)Compareble接口,覆蓋compareTo方法,此方式是元素的自然順序
TreeMap排序的第一種方式:當(dāng)元素自身不具備比較性(比如存儲(chǔ)學(xué)生對(duì)象時(shí))或者具備的比較性不是我們所需要的比較性時(shí)(比如想字符串的長(zhǎng)度排序),此時(shí)就需要讓集合自身具備自定義的比較性。
那如何讓集合自身具備比較性呢?可在集合初始化時(shí),就讓集合具備比較方式。即定義一個(gè)類,實(shí)現(xiàn)Comparator接口,覆蓋compare方法。
class Student implements Comparable
private String name;
private int age;
public Student(String name, int age){
super();
this.name = name;
this.age = age;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public int compareTo(Student stu){
int num = new Integer(this.age).compareTo(new Integer(stu.age));
if(num==0)
return this.name.compareTo(stu.name);
return num;
}
}
public class HashMapDemo1 {
public static void main(String[] args){
Map
tmap.put(new Student(”001“,20), ”beijing“);
tmap.put(new Student(”002“,25), ”hebei“);
tmap.put(new Student(”003“,50), ”hainan“);
tmap.put(new Student(”001“,20), ”beijing“);
System.out.println(tmap.size());
Set
Iterator
while(it1.hasNext()){
Student stu = it1.next();
String addr = tmap.get(stu);
System.out.println(stu.getName()+”..“+stu.getAge()+”::“+addr);
}
}
}
**Iterator:對(duì)collection進(jìn)行迭代的迭代器.迭代器取代了Enumeration。
迭代器和枚舉的區(qū)別:
迭代器允許調(diào)用者利用定義良好的語(yǔ)義在迭代期間從迭代器所指向的collection移除元素
方法名稱得到了改進(jìn),簡(jiǎn)化書(shū)寫
**LisIterator:系列表迭代器,允許程序員按任一方向遍歷列表、迭代期間修改列表
**Comparable:此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體自然排序。使元素具備比較性
**Comparator:強(qiáng)行對(duì)某個(gè)對(duì)象collection進(jìn)行整體排序的比較函數(shù),使集合具備比較性
**Collections:此類完全由在 collection 上進(jìn)行操作或返回 collection 的靜態(tài)方法組成。
**Arrays:此類包含用來(lái)操作數(shù)組(比如排序和搜索)的各種靜態(tài)方法
7、集合類各容器方法:
**接口Collection方法摘要(沒(méi)有構(gòu)造方法)
a)添加:
i.boolean add(E e)
j.boolean addAll(Collection c)b)刪除:
i.void clear():清空容器
j.boolean remove(Objec object):
k.boolean removeAll(Collection c): c)判斷:
i.boolean contains(Object object):判斷是否包含此元素
j.boolean containsAll(Collection c):判斷是否包含一堆元素
k.boolean equals(Object object):比較此collection與指定對(duì)象是否相等
m.boolean isEmpty():判斷是否集合為空
d)獲取:
h.Iterator iterator():取出
i.int hashCode():返回此collection的哈希值
j.int size():返回此collection中元素的個(gè)數(shù)
k.boolean retainAll(Collection c):取交集
m.Object toArray():返回此collection中所有元素的數(shù)組
n.T[] toArray(T[] a):返回包含此collection中所有元素的數(shù)值。*****List集合子類及其方法
(1)List接口是Collection接口的一個(gè)子接口。
(2)List接口中的元素有如下特點(diǎn)(對(duì)角標(biāo)的操作都是特有方法,因?yàn)橛行?:
A:元素有序(存儲(chǔ)順序和取出順序一致)
B:元素可以重復(fù)
(3)List接口中的特有方法
A:add(int index,Object obj):在指定位置加入元素
B:remove(int index):移除指定位置的元素
C:set(int index,Object obj):修改指定位置的元素
D:get(int index):獲取指定位置的元素
E:indexOf(Object obj):獲取指定元素的位置
F:subList(int start,int end):從一個(gè)大的List中截取一個(gè)小的List
G:listIterator():返回一個(gè)List接口特有的迭代器(1)、ArrayList:
|--->構(gòu)造方法摘要:(少用,不是重點(diǎn))ArrayList():構(gòu)造一個(gè)初始容量為 10 的空列表。
ArrayList(Collection extends E> c): 構(gòu)造一個(gè)包含指定 collection 的元素的列表,ArrayList(int initialCapacity): 構(gòu)造一個(gè)具有指定初始容量的空列表。
|--->方法摘要:
|--->添加:
boolean add(E e): 將指定的元素添加到此列表的尾部。
void add(int index, E element): 將指定的元素插入此列表中的指定位置。
boolean addAll(Collection extends E> c):按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部
boolean addAll(int index, Collection extends E> c): 從指定的位置開(kāi)始,將指定 collection
中的所有元素插入到此列表中。|--->刪除:
void clear(): 移除此列表中的所有元素。
E remove(int index): 移除此列表中指定位置上的元素。
boolean remove(Object o): 移除此列表中首次出現(xiàn)的指定元素(如果存在)。
protected void removeRange(int fromIndex, int toIndex):
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
boolean removeAll(Collection> c): 從列表中移除指定 collection 中包含的其所有元素
|--->獲取:
E get(int index): 返回此列表中指定位置上的元素。
int indexOf(Object o): 返回此列表中首次出現(xiàn)的指定元素的索引,或如果此列表不包含元素,則返回-1。
int lastIndexOf(Object o)返回此列表中最后一次出現(xiàn)的指定元素的索引,或如果此列表不包含索引,則返回-1。
public List
和 toIndex(不包括)之間的部分視圖。
Iterator
ListIterator
|--->修改:(特有方法!)
E set(int index, E element): 用指定的元素替代此列表中指定位置上的元素。
(2)LinkedList: |--->構(gòu)造方法摘要:
LinkedList(): 構(gòu)造一個(gè)空列表。
LinkedList(Collection extends E> c): 構(gòu)造一個(gè)包含指定 collection 中的元素的列表,這些元素按其 collection 的迭代器返回的順序排列。
|--->方法摘要:(特有的)
|--->添加
void addFirst(E e): 將指定元素插入此列表的開(kāi)頭。
void addLast(E e): 將指定元素添加到此列表的結(jié)尾。
|--->獲取元素,但不刪除元素
E get(int index): 返回此列表中指定位置處的元素。
E getFirst(): 返回此列表的第一個(gè)元素。
E getLast(): 返回此列表的最后一個(gè)元素。
|--->獲取元素且刪除元素
E remove(): 獲取并移除此列表的頭(第一個(gè)元素)。
E remove(int index): 移除此列表中指定位置處的元素。
boolean remove(Object o): 從此列表中移除首次出現(xiàn)的指定元素(如果存在)。
E removeFirst(): 移除并返回此列表的第一個(gè)元素。
E removeLast(): 移除并返回此列表的最后一個(gè)元素。
|--->修改
E set(int index, E element)將此列表中指定位置的元素替換為指定的元素。
(3)Vector |--->構(gòu)造方法摘要:
Vector(): 構(gòu)造一個(gè)空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10,其標(biāo)準(zhǔn)容量增量為零。
Vector(Collection extends E> c): 構(gòu)造一個(gè)包含指定 collection 中的元素的向量,這些元素按其 collection 的迭代器返回元素的順序排列。
|--->方法摘要:
|--->添加:
boolean add(E e): 將指定元素添加到此向量的末尾。
void add(int index, E element): 在此向量的指定位置插入指定的元素。
boolean addAll(Collection extends E> c):
將指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的順序添加這些元素。
boolean addAll(int index, Collection extends E> c): 在指定位置將指定 Collection 中的所有元素插入到此向量中。
|--->獲取:
Enumeration
Vector特有的取出方式:
枚舉和迭代器很像,其實(shí)枚舉和迭代器是一樣的,只是因?yàn)槊杜e的名稱和方法的名稱
名字都過(guò)長(zhǎng),所以枚舉被迭代器取代了。
|--->枚舉Enumeration的方法摘要:
boolean hasMoreElements(): 測(cè)試此枚舉是否包含更多的元素。
E nextElement(): 如果此枚舉對(duì)象至少還有一個(gè)可提供的元素,則返回此枚舉的下一個(gè)元素。
*****Set集合子類及其方法
(1)HashSet:它不保證set的迭代順序;特別是它不保證該順序恒久不變.此類允許使用null元素。
|--->構(gòu)造方法:
HashSet()構(gòu)造一個(gè)新的空 set,其底層 HashMap 實(shí)例的默認(rèn)初始容量是 16,加載因子是 0.75。
HashSet(Collection extends E> c)構(gòu)造一個(gè)包含指定 collection 中的元素的新 set。
|--->方法摘要:
boolean add(E e)如果此 set 中尚未包含指定元素,則添加指定元素。
void clear()從此 set 中移除所有元素。
Object clone()返回此 HashSet 實(shí)例的淺表副本:并沒(méi)有復(fù)制這些元素本身。
boolean contains(Object o)如果此 set 包含指定元素,則返回 true。
boolean isEmpty()如果此 set 不包含任何元素,則返回 true。
Iterator
boolean remove(Object o)如果指定元素存在于此 set 中,則將其移除。
int size()返回此 set 中的元素的數(shù)量(set 的容量)。
(2)TreeSet:使用元素的自然順序?qū)υ剡M(jìn)行排序,或者根據(jù)創(chuàng)建 set 時(shí)提供的 Comparator 進(jìn)行排序.|--->構(gòu)造方法:
TreeSet()構(gòu)造一個(gè)新的空 set,該set根據(jù)其元素的自然順序進(jìn)行排序。
TreeSet(Collection extends E> c)
構(gòu)造一個(gè)包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進(jìn)行排序。
TreeSet(Comparator super E> comparator)構(gòu)造一個(gè)新的空 TreeSet,它根據(jù)指定比較器進(jìn)行排序。
|--->方法摘要:
添加:
boolean add(E e)將指定的元素添加到此 set(如果該元素尚未存在于 set 中)。
boolean addAll(Collection extends E> c)將指定 collection 中的所有元素添加到此 set 中。
刪除:
void clear()移除此 set 中的所有元素。
boolean remove(Object o)將指定的元素從 set 中移除(如果該元素存在于此 set 中)。
E pollFirst()獲取并移除第一個(gè)(最低)元素;如果此 set 為空,則返回 null。
E pollLast()獲取并移除最后一個(gè)(最高)元素;如果此 set 為空,則返回 null。
獲取:
Iterator
E first()返回此 set 中當(dāng)前第一個(gè)(最低)元素。
E last()返回此 set 中當(dāng)前最后一個(gè)(最高)元素。
int size()返回 set 中的元素?cái)?shù)(set 的容量)。
判斷:
boolean isEmpty()如果此 set 不包含任何元素,則返回 true。
boolean contains(Object o)如果此 set 包含指定的元素,則返回 true。
**Map:將鍵映射到值的對(duì)象。Map集合沒(méi)有迭代器!Map集合特點(diǎn):該集合存儲(chǔ)鍵值對(duì)。而且鍵是唯一的。
|--->方法摘要:
|--->添加:
V put(K key, V value)將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作)。
void putAll(Map extends K,? extends V> m)從指定映射中將所有映射關(guān)系復(fù)制到此映射中
|--->刪除:
void clear()從此映射中移除所有映射關(guān)系(可選操作)。
V remove(Object key)如果存在一個(gè)鍵的映射關(guān)系,則將其從此映射中移除(可選操作)。
|--->判斷
boolean containsKey(Object key)如果此映射包含指定鍵的映射關(guān)系,則返回 true。
boolean containsValue(Object value)如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則返回 true。
boolean isEmpty()如果此映射未包含鍵-值映射關(guān)系,則返回 true。
|--->獲取
int size()返回此映射中的鍵-值映射關(guān)系數(shù)。
Collection
重點(diǎn):Map集合沒(méi)有迭代器,以下是Map的兩種取出方式:
第一種:Set
返回此映射中包含的鍵的Set視圖,將Map集合中所有的鍵存入Set集合,然后再通過(guò)Set集合的 迭代器取出所有的鍵,再根據(jù)get方法獲取每個(gè)鍵的值;
第二種:Set
返回此映射中包含的映射關(guān)系的Set視圖,將Map集合中的映射關(guān)系存入到Set集合中,這個(gè)映射關(guān)系的數(shù)據(jù)類型是Map.entry,再通過(guò)Map.Entry類的方法再要取出關(guān)系里面的鍵和值
Map.Entry的方法摘要:
boolean equals(Object o)比較指定對(duì)象與此項(xiàng)的相等性。
K getKey()返回與此項(xiàng)對(duì)應(yīng)的鍵。
V getValue()返回與此項(xiàng)對(duì)應(yīng)的值。
int hashCode()返回此映射項(xiàng)的哈希碼值。
V setValue(V value)用指定的值替換與此項(xiàng)對(duì)應(yīng)的值(特有!!)。
8、Map集合和Collection集合的區(qū)別?
1,Map中一次存儲(chǔ)是鍵值對(duì)。
Collection中一次存儲(chǔ)是單個(gè)元素。
2,Map的存儲(chǔ)使用的put方法。
Collection存儲(chǔ)使用的是add方法。
3,Map集合沒(méi)有迭代器,Map的取出,是將Map轉(zhuǎn)成Set,在使用迭代器取出。
Collection取出,使用就是迭代器。
4,如果對(duì)象很多,必須使用集合存儲(chǔ)。
如果元素存在著映射關(guān)系,可以優(yōu)先考慮使用Map存儲(chǔ)或者用數(shù)組,如果沒(méi)有映射關(guān)系,可以使用Collection存儲(chǔ)。
8、迭代器:Iterator(Map集合沒(méi)有迭代器)(1)迭代器就是取出集合元素的方式
(2)迭代器的作用
因?yàn)槊總€(gè)集合中元素的取出方式都不一樣,于是就把元素的取出方式進(jìn)行抽取,并定義在集合內(nèi)部,這樣取出方式就可以直接訪問(wèn)集合內(nèi)部的元素;
而每個(gè)容器的數(shù)據(jù)結(jié)構(gòu)不同,所以取出動(dòng)作的細(xì)節(jié)也不一樣,但是有共性內(nèi)容:判斷和取出。
那么就將共性內(nèi)容進(jìn)行抽取,從而形成了接口Iterater(3)獲取迭代器的方法:
Iterator
Iterator
(3)迭代器方法:
boolean hasNext()如果仍有元素可以迭代,則返回 true。
E next()返回迭代的下一個(gè)元素。
void remove()從迭代器指向的collection中移除迭代器返回的最后一個(gè)元素(可選操作)。
9、列表迭代器:ListIterator(1)List集合特有的迭代器ListIterator是Iterator的子接口,在迭代時(shí),不可以通過(guò)集合對(duì)象的 方法操作集合中的元素,因?yàn)闀?huì)發(fā)生ConcurrentModificationException(當(dāng)方法檢測(cè)到對(duì)象的并發(fā)修改,但不允許這種修改時(shí),拋出此異常)(2)Iterator方法有限,只能對(duì)元素進(jìn)行判斷、取出和刪除的操作
ListIterator可以對(duì)元素進(jìn)行添加和修改動(dòng)作等。
(3)獲取列表迭代器方法:
ListIterator
ListIterator
返回此列表中的元素的列表迭代器(按適當(dāng)順序),從列表中指定位置開(kāi)始。
(4)列表迭代器方法:
void add(E e)將指定的元素插入列表(可選操作)。
boolean hasPrevious()如果以逆向遍歷列表,列表迭代器有多個(gè)元素,則返回 true。
int nextIndex()返回對(duì) next 的后續(xù)調(diào)用所返回元素的索引。
E previous()返回列表中的前一個(gè)元素。
int previousIndex()返回對(duì) previous 的后續(xù)調(diào)用所返回元素的索引。
void set(E e)用指定元素替換 next 或 previous 返回的最后一個(gè)元素(可選操作)。
10、堆棧和隊(duì)列
堆棧:先進(jìn)后出,比如杯子里的水
隊(duì)列:先進(jìn)先出,比如水管的水
11、集合類各種容器的使用注意細(xì)節(jié):
(1)迭代器:
**迭代器的next方法是自動(dòng)向下取元素,要避免出現(xiàn)NoSuchElementException。
也就是在迭代循環(huán)中調(diào)用一次next方法一次就要hasNext判斷一次,比如語(yǔ)句
sop(it.next()+”..."+it.next())會(huì)發(fā)生上述異常。
**迭代器的next方法返回值類型是Object,所以要記得類型轉(zhuǎn)換,應(yīng)用泛型后就不用強(qiáng)轉(zhuǎn)
(2)List集合:
**List集合里面的元素因?yàn)槭菐Ы菢?biāo),所以List集合里面的元素都是有序的,另外List集合可以包含重復(fù)元素,也可以包含null。
**List集合有迭代器Iterator,還有一個(gè)特有迭代器列表ListIterator
**List集合中判斷元素是否相同都是用equals方法,無(wú)論contains、remove都依賴equals方法
比如往ArrayList集合里面存放學(xué)生,同名同年齡視為同一個(gè)人,此時(shí)就需要在學(xué)生類復(fù)寫Object類
里面的equals方法(非常重要!!要注意!)(3)Set集合:
**Set接口里面存放的是元素是無(wú)序的,不可以有重復(fù)元素,可以包含null
**Set集合只有一種取出方式,就是迭代器Iterator
**Set集合功能和Collection是一致的,沒(méi)有特殊方法
|--->HashSet:
**集合里面存放的元素是無(wú)序的,唯一的 **底層數(shù)據(jù)結(jié)構(gòu)是哈希表,哈希表結(jié)構(gòu)的數(shù)據(jù)都是無(wú)序的,哈希表結(jié)構(gòu)的操作效率都高效
**線程不同步
**保證元素唯一性的原理是:通過(guò)復(fù)寫hashCode和equals方法
****如果兩元素的hashCode值相同,則繼續(xù)判斷兩元素equals是否為真
****如果兩元素的hashCode值不同,則不會(huì)調(diào)用equals方法。
**當(dāng)我們往HashSet集合存放自定義的元素時(shí)(比如學(xué)生對(duì)象),通常都要復(fù)寫hashCode和equals方法,而且hashCode和equals方法不通過(guò)我們調(diào)用,HashSet集合底層內(nèi)部自己調(diào)用,自己拿元素去比較
|--->TreeSet
**TreeSet集合可以對(duì)存放的元素進(jìn)行排序,彌補(bǔ)了Set集合元素?zé)o序的缺點(diǎn),且元素是唯一的 **底層數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù),二叉樹(shù)結(jié)構(gòu)都是有序的 **線程不同步
**TreeSet集合要求往集合里存放的元素自身具備比較性,否則會(huì)報(bào)錯(cuò)
**TreeSet集合保證元素唯一性的依據(jù)是:通過(guò)compareTo或者compare方法中的來(lái)保證元素的唯一性。
TreeSet排序的第一種方式:讓元素自身具備比較性,定義元素類實(shí)現(xiàn)Compareble接口,覆蓋compare方法,此方式是元素的自然順序。
TreeSet排序的第二種方式:讓集合具備比較性
當(dāng)元素自身不具備比較性或者具備的比較性不是
我們所需要的比較性時(shí),此時(shí)就需要讓集合具備自定義的比較性。
那如何讓集合自身具備比較性呢?
可在集合初始化時(shí),就讓集合具備比較方式。
即定義一個(gè)類,實(shí)現(xiàn)Comparator接口,覆蓋compare方法。
注:
**判斷元素唯一時(shí),當(dāng)主要條件一樣時(shí),判斷次要條件
**兩種排序方式都在時(shí),以比較器為主!!
(4)Map集合:
|--Hashtable
底層是哈希表結(jié)構(gòu)
線程安全的,并且鍵和值不能為null。
|--HashMap
底層是哈希表結(jié)構(gòu)
線程不安全的,鍵和值可以為null。
|--LinkedHashMap
底層是鏈表和哈希表
線程不安全
|--TreeMap
底層是二叉樹(shù)
線程不安全的
12、如果你想將一組對(duì)象按一定順序存取,在不考慮并發(fā)訪問(wèn)的情況下會(huì)使用____C_____ ,反之則會(huì)使用____A_____;如果你想存儲(chǔ)一組無(wú)序但唯一的對(duì)象,你會(huì)使用___B______;
如果你想按關(guān)鍵字對(duì)對(duì)象進(jìn)行存取,在不考慮并發(fā)訪問(wèn)的情況下會(huì)使用___D______ ,反之則會(huì)使用_____E____。A.Vector B.HashSet C.ArrayList D.HashMap E.Hashtable
13、泛型:
(1)為什么會(huì)出現(xiàn)泛型?
因?yàn)榧洗娣诺臄?shù)據(jù)類型不固定,故往集合里面存放元素時(shí),存在安全隱患,如果在定義集合時(shí),可以想定義數(shù)組一樣指定數(shù)據(jù)類型,那么就可以解決該類安全問(wèn)題。
JDK1.5后出現(xiàn)了泛型,用于解決集合框架的安全問(wèn)題。
泛型是一個(gè)類型安全機(jī)制。
(2)泛型定義格式:通過(guò)<>來(lái)定義要操作的引用數(shù)據(jù)類型
ArrayList
**將運(yùn)行時(shí)期出現(xiàn)的ClassCastException(類型轉(zhuǎn)換異常)問(wèn)題轉(zhuǎn)移到編譯時(shí)期;
**避免了強(qiáng)制轉(zhuǎn)換的麻煩
(4)什么時(shí)候定義泛型?
泛型在集合框架中很常見(jiàn),只要見(jiàn)到<>就要定義泛型。其實(shí)<>就是用來(lái)接收類型的。
當(dāng)使用集合時(shí),將集合中要存儲(chǔ)的數(shù)據(jù)類型作為參數(shù)傳遞到<>中即可
(5)泛型的形式
**泛型類:即自定義泛型類
A:當(dāng)類中要操作的引用數(shù)據(jù)類型不確定時(shí),早起定義Object來(lái)完成擴(kuò)展,現(xiàn)在定義泛型來(lái)完成B:局限性:泛型類定義的泛型,在整個(gè)類中有效,如果該泛型類的方法被調(diào)用,當(dāng)泛型類的對(duì)象明確要操作的類型后,所有要操作的類型就被固定。
**泛型方法:泛型放在返回值前面,修飾符的后面
A:為了避免泛型類的局限性,讓不同方法可以操作不同的類型,而且類型還不確定,則可以將泛型定義在方法上
B:特殊之處:靜態(tài)方法不可以反問(wèn)類上定義的泛型
如果靜態(tài)方法操作的應(yīng)用數(shù)據(jù)類型不確定,可以講泛型定義在靜態(tài)方法上
**泛型接口:
當(dāng)泛型定義在接口上時(shí),則子類中要指定實(shí)現(xiàn)接口類型,同時(shí)還可以子類也可以定義為泛型類
(6)泛型的高級(jí)應(yīng)用:?通配符
**當(dāng)指定兩種泛型的集合,則迭代時(shí)也要定義兩種泛型的迭代器,麻煩,此時(shí)可通過(guò)將迭代器的泛型
改為?,如Iterator> it=al.iterator();
**兩種泛型限定
向上限定: ? extends E;E可以接收E類型或者E的子類
向下限定: ? super E;E可以接收E類型或者E的父類
14、高級(jí)for循環(huán)
(1)JDK1.5新特性,代替迭代器使用時(shí)的不爽,簡(jiǎn)化書(shū)寫,底層原理是迭代器凡是支持迭代器的都支持高級(jí)for循環(huán)
高級(jí)for循環(huán),只用于集合和數(shù)組的遍歷,集合只能用Collection不能用Map集合 只能把Map集合轉(zhuǎn)化成Set集合,才能用for循環(huán)。
(2)格式
for(數(shù)據(jù)類型 變量名:被遍歷的集合(Collection)或者數(shù)組)
{
}
(3)局限性:
必須要有遍歷的目標(biāo)
對(duì)集合或者數(shù)組進(jìn)行遍歷時(shí),只能獲取集合元素,不能對(duì)集合元素進(jìn)行操作
迭代器除了遍歷,還可以進(jìn)行remove操作集合中的元素
列表迭代器還可以在遍歷過(guò)程中進(jìn)行增刪改查的操作
(4)傳統(tǒng)for循環(huán)和高級(jí)for循環(huán)的區(qū)別
高級(jí)for循環(huán)有一個(gè)局限性,就是必須要有遍歷的目標(biāo)(集合或者數(shù)組)
遍歷數(shù)組時(shí)建議使用傳統(tǒng)for循環(huán),因?yàn)榭梢远x角標(biāo),比如打印100次helloworld時(shí)用傳統(tǒng)for循環(huán)方便
15、可變參數(shù)
(1)數(shù)組的可變參數(shù)
格式:
int...arr(3)方法的可變參數(shù)
格式:
public static void show(String str,int...arr)
{
}
注意:可變參數(shù)一定要放在參數(shù)列表的最后面
16、靜態(tài)導(dǎo)入:
**import static java.util.Arrays.* 導(dǎo)入的是Arrays這個(gè)類中所有的靜態(tài)方法
**當(dāng)類名重名時(shí),需要制定具體的報(bào)名
**當(dāng)方法重名時(shí),需要制定具體所屬的對(duì)象或者類
17、Collections類:
(1)此類完全由在 collection 上進(jìn)行操作或返回 collection 的靜態(tài)方法組成。
(2)靜態(tài)方法摘要:
static
將所有指定元素添加到指定 collection 中。
static
使用指定元素替換指定列表中的所有元素。
static
使用另一個(gè)值替換列表中出現(xiàn)的所有某一指定值。
static void reverse(List> list)
反轉(zhuǎn)指定列表中元素的順序。
static
返回一個(gè)比較器,它強(qiáng)行逆轉(zhuǎn)實(shí)現(xiàn)了 Comparable 接口的對(duì)象 collection 的自然順序
static
返回一個(gè)比較器,它強(qiáng)行逆轉(zhuǎn)指定比較器的順序。
(3)Collections類特牛的方法:
集合有一個(gè)共同的缺點(diǎn),那就是線程不安全,被多線程操作時(shí),容易出現(xiàn)問(wèn)題,雖然可以自己加鎖
但是麻煩。Collections提供特牛的方法,就是給它一個(gè)不同步的集合,它返回一個(gè)同步的安全的集合static
返回指定 collection 支持的同步(線程安全的)collection。
static
返回指定列表支持的同步(線程安全的)列表。
static
返回由指定映射支持的同步(線程安全的)映射。
static
返回指定 set 支持的同步(線程安全的)set。
static
返回指定有序映射支持的同步(線程安全的)有序映射。
static
返回指定有序 set 支持的同步(線程安全的)有序 set。
18、Arrays類:
此類包含用來(lái)操作數(shù)組(比如排序和搜索)的各種方法。里面都是靜態(tài)方法。
如果指定數(shù)組引用為 null,則此類中的方法都會(huì)拋出 NullPointerException。
(1)靜態(tài)方法摘要:
static
返回一個(gè)受指定數(shù)組支持的固定大小的列表。
注意:
A:該方法將一個(gè)數(shù)組變成集合后,不可以使用集合的增刪方法,因?yàn)閿?shù)組的長(zhǎng)度是固定的!
如果增刪,則發(fā)生UnsupportedOprationException(不支持操作異常)
B:如果數(shù)組中的元素都是基本數(shù)據(jù)類型,則該數(shù)組變成集合時(shí),會(huì)將該數(shù)組作為集合的一個(gè)
元素出入集合C:如果數(shù)組中的元素都是對(duì)象,如String,那么數(shù)組變成集合后,數(shù)組中的元素就直接轉(zhuǎn)成集合中的元素
19、數(shù)組變集合以及集合變數(shù)組的對(duì)比:
(1)數(shù)組變集合:
方法:static
好處:可以使用集合的思想和方法操作數(shù)組中的元素,數(shù)組是一個(gè)對(duì)象,但是數(shù)組中的功能很少
(2)集合變數(shù)組:
方法:Collction中的toArray方法
好處:可以限定對(duì)集合元素的操作,防止對(duì)集合的元素進(jìn)行增刪,因?yàn)閿?shù)組長(zhǎng)度是固定的。
20、Collections類和Arrays類的使用。(重點(diǎn))A:Collections
排序
二分查找
發(fā)轉(zhuǎn)
B:Arrays
把數(shù)組變成字符串輸出
排序
二分查找
21、System:
(1)描述系統(tǒng)信息的類
(2)該類沒(méi)有構(gòu)造方法,該類的方法和屬性都是靜態(tài)的(3)字段摘要:
static InputStream in “標(biāo)準(zhǔn)”輸入流。
static PrintStream out “標(biāo)準(zhǔn)”輸出流。
(4)方法摘要:
static void exit(int status)終止當(dāng)前正在運(yùn)行的 Java 虛擬機(jī)。
static void gc()運(yùn)行垃圾回收器。
static Properties getProperties()確定當(dāng)前的系統(tǒng)屬性
static String getProperty(String key)獲取指定鍵指示的系統(tǒng)屬性。
static String getProperty(String key, String def)獲取用指定鍵描述的系統(tǒng)屬性。
static void setIn(InputStream in)重新分配“標(biāo)準(zhǔn)”輸入流。
static void setOut(PrintStream out)重新分配“標(biāo)準(zhǔn)”輸出流。
static void setProperties(Properties props)將系統(tǒng)屬性設(shè)置為 Properties 參數(shù)。
static String setProperty(String key, String value)設(shè)置指定鍵指示的系統(tǒng)屬性。
22、Runtime:(1)每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。