java 基礎(chǔ)篇知識(shí)資料_第1頁(yè)
java 基礎(chǔ)篇知識(shí)資料_第2頁(yè)
java 基礎(chǔ)篇知識(shí)資料_第3頁(yè)
java 基礎(chǔ)篇知識(shí)資料_第4頁(yè)
java 基礎(chǔ)篇知識(shí)資料_第5頁(yè)
已閱讀5頁(yè),還剩125頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

java基礎(chǔ)篇

1.數(shù)據(jù)類(lèi)型

整型:intshortlongbyte

浮點(diǎn)型:floatdouble

char類(lèi)型:表示單個(gè)字符,用單引號(hào)括起來(lái)

Boolean類(lèi)型:判定邏輯條件,false/true

2.變量與常量

變量:變化的值在java9中不能當(dāng)做變量名

首先變量聲明:每一個(gè)變量都有一個(gè)類(lèi)型

變量初始化:用賦值語(yǔ)句對(duì)變量進(jìn)行顯示初始化

常量:固定不變的用關(guān)鍵字final指示常量。

Final:表示只能被賦值一次

Staticfinal:設(shè)置一個(gè)類(lèi)常量(位于main方法的外部)

3.static與final的區(qū)別:

Static作用:方便在沒(méi)有創(chuàng)建對(duì)象的條件下調(diào)用變量或方法。可以修

飾成員方法,成員變量,編寫(xiě)static代碼優(yōu)化程序性能(形成靜態(tài)代碼

塊優(yōu)化程序性能,并且只會(huì)在類(lèi)加載的時(shí)候執(zhí)行一次),

Final:final類(lèi)(最終類(lèi))不可以繼承,沒(méi)有子類(lèi)。

final方法不能被子類(lèi)的方法覆蓋,但可以繼承。

Final不能修飾構(gòu)造方法。

4.靜態(tài)常量:類(lèi)中可以共享數(shù)據(jù)。

5.檢測(cè)字符串是否相等:s.equals⑴檢測(cè)s和t是否相等

第1頁(yè)共130頁(yè)

equalsIgnoreCase不用區(qū)分大小寫(xiě)來(lái)檢測(cè)字符串是否相等。

6.==與equals的區(qū)別:

,==,對(duì)于基本類(lèi)型和引用類(lèi)型是不相同的

基本類(lèi)型:==表示的是值是否相同

引用類(lèi)型:==表示的是引用是否相同

Equals:本質(zhì)上是==但是通過(guò)string和Integer對(duì)equals方法的重寫(xiě),

變成了值的比較。

7.數(shù)組

聲明數(shù)組:類(lèi)型□名字

數(shù)組的拷貝:int[]copiedLucky=Arrays.copyof(Lucky,Lucky.lengyh)

8.JDK與JRE的區(qū)別:

JDK:java開(kāi)發(fā)工具包,提供java的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境

JRE:java運(yùn)行環(huán)境,為java運(yùn)行提供環(huán)境

具體的來(lái)說(shuō)JDK包含JRE,還包括編譯java編碼的編譯器javac,以

及java的調(diào)試和分析工具。

9.類(lèi)class類(lèi)名{

類(lèi)體(變量聲明)

(方法定義)}

10.Java里面向?qū)ο蟮娜筇卣魇鞘裁矗?/p>

封裝:將數(shù)據(jù)和行為組合到一個(gè)包中,并對(duì)對(duì)象的使用者隱藏具體

的實(shí)現(xiàn)方式。封裝的思想類(lèi)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的完整性,讓用戶(hù)無(wú)法輕

易直接的操作內(nèi)部數(shù)據(jù),這樣降低對(duì)內(nèi)部數(shù)據(jù)的影響,提高了程序

第2頁(yè)共130頁(yè)

的安全性和可維護(hù)性。

類(lèi)的封裝實(shí)現(xiàn):將成員變量聲明為private,再通過(guò)public的方法對(duì)

這個(gè)變量進(jìn)行訪(fǎng)問(wèn)。對(duì)于一個(gè)變量我們有讀取和賦值的操作,

getXxx(讀取變量),setXxx(對(duì)成員變量進(jìn)行賦值處理)。

封裝的優(yōu)點(diǎn):隱藏類(lèi)的實(shí)現(xiàn)細(xì)節(jié)。

便于修改,增加代碼的可維護(hù)性。

讓使用者使用事先制定好的方法來(lái)訪(fǎng)問(wèn)數(shù)據(jù),方便加入

控制邏輯,限制對(duì)屬性的不合理操作。

繼承:當(dāng)兩個(gè)類(lèi)具有相同的屬性和方法時(shí),可以將相同的部分提取

出來(lái)作為父類(lèi),其他的類(lèi)繼承這個(gè)類(lèi)的方法和屬性。

關(guān)鍵字:extends

繼承和權(quán)限:

Hna

Publiic無(wú)修飾PrivateProtectabstractstatic

1

不能

只有同一包不能修飾不能修飾不能修飾

類(lèi)繼承可繼承濠生一段可繼承

中的可繼承類(lèi)突

可重戢(修蜂

不可重

方法重載不能重蚣司■羲r可?能王函數(shù)就不能

H了)

必須鼻個(gè)實(shí)例

成員變量子類(lèi)不能直父集虐性

幺英聶性使除墓攵金原性陵隨我不能脩飾

(屬做(使用sup"R(使用我接訪(fǎng)問(wèn)父類(lèi)(使用ZP衣技付初共享這個(gè)

廣一*辛

取父笑廈性)取父劃■性)的私有變量取父類(lèi)JBa)值類(lèi)變量

多態(tài):同一個(gè)行為用不同的表現(xiàn)形式或形態(tài)的能力。說(shuō)具體點(diǎn)就是

同一接口,使用不同的實(shí)例而執(zhí)行的結(jié)果。

多態(tài)的優(yōu)點(diǎn):消除類(lèi)型之間的耦合關(guān)系可替換性可擴(kuò)充性接口性

第3頁(yè)共130頁(yè)

靈活性簡(jiǎn)化性

實(shí)現(xiàn)多態(tài)的必要條件:要有繼承

要有方法分的重寫(xiě)

父類(lèi)引用指向子類(lèi)對(duì)象

例子:父類(lèi):publicclassHttpServlet{

publicvoidservice(){

System.out.println("HttpServlet-service");

doGet();

)

publicvoiddoGet(){

System.out.print("HttpServlet-doGet");

)

)

子類(lèi):publicclassMyServletextendsHttpServlet{

publicvoiddoGet(){

System.out.println("MyServlet-doGet");

)

)

主類(lèi):publicclassTest{

publicstaticvoidmain(String[]args){

HttpServlets=newMyServlet();

s.service();

第4頁(yè)共130頁(yè)

)

)

結(jié)果:HttpServlet-service

MyServlet-doGet

代碼分析:HttpServlets=newMyServlet();//s雖然是父類(lèi)變量

的引用,但是指向的是子類(lèi)對(duì)象。s.serviceO;//子類(lèi)中沒(méi)有定

service,因此調(diào)用的是繼承父類(lèi)的service方法,然后service方法

中調(diào)doGet,這時(shí)候也是以子類(lèi)中優(yōu)先查找重寫(xiě)的doGet方法。

11.多態(tài)的向上轉(zhuǎn)型和向下轉(zhuǎn)型分別指的是什么?

向上轉(zhuǎn)型:簡(jiǎn)單的說(shuō)就是子類(lèi)對(duì)象賦值給父類(lèi)引用(減少代碼重復(fù))

格式:父類(lèi)類(lèi)型變量名=new子類(lèi)類(lèi)型()Fatherf=new

son()

Personp=newStudent。;

向下轉(zhuǎn)型:已經(jīng)向上轉(zhuǎn)型的子類(lèi)可以使用強(qiáng)制類(lèi)型轉(zhuǎn)換格式,將父

類(lèi)對(duì)象賦值給子類(lèi)引用

格式:子類(lèi)類(lèi)型變量名=(子類(lèi)類(lèi)型)父類(lèi)類(lèi)型變量名

sons=(son)f

Personp=newStudent。;

Studentstu=(Student)p

12.重寫(xiě)和重載的區(qū)別?

重寫(xiě)(override):子類(lèi)定義一個(gè)方法,這個(gè)方法的類(lèi)型和父類(lèi)的方

法類(lèi)型一致,并且方法名字,參數(shù)個(gè)數(shù),參數(shù)類(lèi)型和父類(lèi)是完全相同

的。

重寫(xiě)的規(guī)則:參數(shù)列表與被重寫(xiě)方法的參數(shù)列表必須完全相同。

第5頁(yè)共130頁(yè)

返回類(lèi)型與被重寫(xiě)方法的返回類(lèi)型可以不相同,但是必須是父類(lèi)返

回值的派生類(lèi)(java5及更早版本返回類(lèi)型要一樣,java7及更高版

本可以不同)。

訪(fǎng)問(wèn)權(quán)限不能比父類(lèi)中被重寫(xiě)的方法的訪(fǎng)問(wèn)權(quán)限更低。例如:如果

父類(lèi)的一個(gè)方法被聲明為public,那么在子類(lèi)中重寫(xiě)該方法就不能

聲明為protectedo

父類(lèi)的成員方法只能被它的子類(lèi)重寫(xiě)。

聲明為final的方法不能被重寫(xiě)。

聲明為static的方法不能被重寫(xiě),但是能夠被再次聲明。

子類(lèi)和父類(lèi)在同一個(gè)包中,那么子類(lèi)可以重寫(xiě)父類(lèi)所有方法,除了

聲明為private和final的方法。

子類(lèi)和父類(lèi)不在同一個(gè)包中,那么子類(lèi)只能夠重寫(xiě)父類(lèi)的聲明為

public和protected的非final方法。

重寫(xiě)的方法能夠拋出任何非強(qiáng)制異常,無(wú)論被重寫(xiě)的方法是否拋出

異常。但是,重寫(xiě)的方法不能拋出新的強(qiáng)制性異常,或者比被重寫(xiě)

方法聲明的更廣泛的強(qiáng)制性異常,反之則可以。

構(gòu)造方法不能被重寫(xiě)。

如果不能繼承一個(gè)方法,則不能重寫(xiě)這個(gè)方法。

重載(overload):一個(gè)類(lèi)中可以有多個(gè)方法具有相同的名字,但這

些方法的參數(shù)必須不同(參數(shù)個(gè)數(shù)不同。參數(shù)個(gè)數(shù)相同但參數(shù)表對(duì)

應(yīng)某個(gè)參數(shù)的類(lèi)型不同。)

二者的區(qū)別:重寫(xiě)和重載都是java多態(tài)性的不同表現(xiàn)。重寫(xiě)是子類(lèi)

第6頁(yè)共130頁(yè)

與父類(lèi)之間多態(tài)性的一種表現(xiàn),重載是一個(gè)類(lèi)中多態(tài)性的表現(xiàn)。

13.super關(guān)鍵字怎么使用?

可以用super操作被隱藏的成員變量和方法。

publicclassAverageextendsSum{//子類(lèi)繼承父類(lèi)

intn;//成員變量

floatf(){//方法

floatc;

super.n=n;//sup一r關(guān)鍵字調(diào)用子類(lèi)繼承所隱藏的成員變量

c=super.f();//用對(duì)象名調(diào)用父類(lèi)的f方法

returnc/n;

)

floatg(){

floatc;//局部變量聲明

c=super,();//也是調(diào)用父類(lèi)的f方法但是此時(shí)沒(méi)有用到n

returnc/2;

)

}

publicclassSum{

intn;

floatf(){

floatsum=0;

for(inti=1;i〈=n;i++)//for循環(huán)先進(jìn)行判斷滿(mǎn)足執(zhí)行循環(huán)代碼,然后才是加一

n=100執(zhí)行了100次

sum=sum+i;//循環(huán)代碼1+2+3+++99=n(al+an)/2

returnsum;

}

}

publicclassExample{

publicstaticvoidmain(Stringargs[]){

Averageaver=newAv一rag一();//倉(cāng)U建對(duì)象執(zhí)行的時(shí)候先跳至!JAverag一類(lèi)中

aver.n=100;//賦值n=100

floatresultOne=av一r,f();//調(diào)用方法

floatresultTwe=aver.g();

System.out.printin(nresultOne=n+resultOne);//輸出

System.out.printin(nresultTwe="+resultTwe);

第7頁(yè)共130頁(yè)

使用super調(diào)用父類(lèi)的構(gòu)造方法。

classAnimal{

publicvoidmove(){

System.out.printIn("動(dòng)物可以移動(dòng)*;

}

)

classDogextendsAnimal{

publicvoidmove(){

super.move();//應(yīng)用super類(lèi)的方法

System.out.printIn("狗可以跑和走;

}

}

publicclassTestDog{

publicstaticvoidmain(Stringargs[]){

Animalb=newDog();//Dog對(duì)象

b.move();〃執(zhí)行Dog類(lèi)的方法

}

}

14.構(gòu)造器可以重寫(xiě)嗎?

構(gòu)造器(Constructor):就是和類(lèi)名相同但無(wú)返回類(lèi)型的方法。它

的作用是創(chuàng)建對(duì)象時(shí)進(jìn)行初始化。

構(gòu)造器是不能被繼承的,所以不可以進(jìn)行。verride的,但可以進(jìn)行

重載(overload)

如果父類(lèi)自定義了有參構(gòu)造函數(shù),則子類(lèi)無(wú)論定義構(gòu)造函數(shù)與否,

定義有參構(gòu)造函數(shù)與否,都會(huì)報(bào)錯(cuò),正確的做法是在子類(lèi)的構(gòu)造方

法中添上super(參數(shù)),以表明子類(lèi)構(gòu)造之前先構(gòu)造父類(lèi),而這

句話(huà)必須放在第一句,否則報(bào)"Constructorcallmustbethe

firststatementinaconstructor”的錯(cuò)誤。

類(lèi)的加載順序:

第8頁(yè)共130頁(yè)

首先執(zhí)行父類(lèi)的靜態(tài)代碼塊/初始化靜態(tài)變量(兩者優(yōu)先級(jí)相

同),然后執(zhí)行子類(lèi)的靜態(tài)代碼/初始化靜態(tài)變量(兩者優(yōu)先級(jí)相

同,誰(shuí)寫(xiě)在前面誰(shuí)先執(zhí)行),然后初始化父類(lèi)成員變量/執(zhí)行代碼塊

{}(兩者優(yōu)先級(jí)相同),接著父類(lèi)的構(gòu)造器,然后子類(lèi)的成員變量/

代碼塊,最后子類(lèi)的構(gòu)造器。

15.什么是正則表達(dá)式以及它有什么用途?

在編寫(xiě)處理字符串的程序時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字

符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話(huà)

說(shuō),正則表達(dá)式就是記錄文本規(guī)則的代碼。計(jì)算機(jī)處理的信息更多

的時(shí)候不是數(shù)值而是字符串,正則表達(dá)式就是在進(jìn)行字符串匹配和

處理的時(shí)候最為強(qiáng)大的工具,絕大多數(shù)語(yǔ)言都提供了對(duì)正則表達(dá)式

的支持。

16.int和integer的區(qū)別是什么?

Java是一個(gè)近乎純潔的面向?qū)ο缶幊陶Z(yǔ)言,但是為了編程的方便還

是引入了基本數(shù)據(jù)類(lèi)型,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類(lèi)型當(dāng)成對(duì)

象操作,Java為每一個(gè)基本數(shù)據(jù)類(lèi)型都引入了對(duì)應(yīng)的包裝類(lèi)型

(wrapperclass),int的包裝類(lèi)就是Integer,從Java5開(kāi)始引

入了自動(dòng)裝箱/拆箱機(jī)制,使得二者可以相互轉(zhuǎn)換。

Java為每個(gè)原始類(lèi)型提供了包裝類(lèi)型:

一原始類(lèi)型:boolean,char,byte,short,int,long,float,

double

-包裝類(lèi)型:Boolean,Character,Byte,Short,Integer,

第9頁(yè)共130頁(yè)

Long,Float,Double

包裝類(lèi)的作用:方便對(duì)一些基本類(lèi)型進(jìn)行操作,解決基本類(lèi)解決不

了的問(wèn)題。

集合不允許存放基本數(shù)據(jù)類(lèi)型,只能存放應(yīng)用數(shù)據(jù)類(lèi)型。

add(Objecto)

基本類(lèi)型可以和包裝類(lèi)型直接相互轉(zhuǎn)換,自動(dòng)裝箱拆箱,(自動(dòng)裝

箱:將基本類(lèi)型轉(zhuǎn)換為包裝器類(lèi)型,自動(dòng)拆箱:將包裝器類(lèi)型轉(zhuǎn)換

為基本類(lèi)型)1〃自動(dòng)裝箱

2Integertotal=99;

3

4//自動(dòng)拆箱

5inttotalprim=total;

通過(guò)包裝類(lèi)型的parse方法可以實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型+String類(lèi)型之間

的相互轉(zhuǎn)換。

函數(shù)需要傳遞進(jìn)去的參數(shù)為Object類(lèi)型,傳入基本數(shù)據(jù)類(lèi)型就不可

行。

17.抽象類(lèi)和接口的區(qū)別?

抽象類(lèi):在面向?qū)ο罄铮械膶?duì)象是通過(guò)類(lèi)來(lái)描繪的,但反過(guò)來(lái)

并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,通俗一點(diǎn)講,如果一個(gè)類(lèi)中

沒(méi)有包含足夠的信息來(lái)描繪一個(gè)對(duì)象,那么這個(gè)類(lèi)就是抽象類(lèi)。通

常使用關(guān)鍵字abstract來(lái)修飾。

abstract類(lèi)的特點(diǎn):不能實(shí)例化對(duì)象,必須被繼承才能實(shí)現(xiàn)。

abstract類(lèi)不能使用new運(yùn)算符創(chuàng)建對(duì)象。

第10頁(yè)共130頁(yè)

abstract類(lèi)中可以有abstract方法。

一旦一個(gè)類(lèi)里面有abstract方法,那么這個(gè)

類(lèi)必須用abstract修飾。

接口:java編程語(yǔ)言中的一個(gè)抽象類(lèi)型,,是抽象方法的集合,通

常用關(guān)鍵字interface聲明。(隱式抽象不需要關(guān)鍵字abstract

所有方法都是公用的)

interface接口名稱(chēng)[extends其他的接口名]{

//聲明變量常量聲明所有的常量一定都是公共的public而且是static常量

//抽象方法訪(fǎng)問(wèn)權(quán)限一定是public

)

接口的實(shí)現(xiàn):當(dāng)接口要實(shí)現(xiàn)時(shí),類(lèi)要實(shí)現(xiàn)接口中所以有的方法。類(lèi)

使用關(guān)鍵字implements聲明該類(lèi)實(shí)現(xiàn)一個(gè)或多個(gè)接口(多個(gè)時(shí)用逗

號(hào)隔開(kāi))。

publicclassMammalintimplementsAnimal{

publicvoideat(){

System.out.println("Mammaleats");

)

publicvoidtravel(){

System.out.printin("Mammaltravels");

)

publicintnoOfLegs(){

return0;

)

publicstaticvoidmain(Stringargs[]){

Mammalintm=newMammalint();

m.eat();

();

)

)

抽象類(lèi)與接口的區(qū)別:

第11頁(yè)共130頁(yè)

抽象類(lèi)中的方法可以有方法體,就可以實(shí)現(xiàn)方法的具體功能,但接

口就不行。

抽象類(lèi)中的成員變量可以是各種類(lèi)型,但接口中的成員變量只能是

publicstaticfinal類(lèi)型的。

接口里只有常量,不能有變量;但抽象類(lèi)中既有常量也有變量。

接口中不能含有靜態(tài)代碼塊和靜態(tài)方法(static修飾),但是抽象

類(lèi)中就可以有。一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi),但一個(gè)類(lèi)可以實(shí)現(xiàn)一

個(gè)或多個(gè)接口。abstract類(lèi)中可以有非abstract方法,但是接口

不行(abstract是可以省略的)。

18.java里什么是構(gòu)造函數(shù)?構(gòu)造函數(shù)重載?復(fù)制構(gòu)造函數(shù)?

構(gòu)造函數(shù):是函數(shù)的一種特殊形式,它不需要定義返回類(lèi)型,而且

構(gòu)造函數(shù)的名稱(chēng)和所在類(lèi)的名稱(chēng)相同,其余的與函數(shù)的特性相同,

可以帶有參數(shù)列表,可以存在函數(shù)重載。

作用:創(chuàng)建函數(shù)對(duì)象對(duì)象初始化

Java中構(gòu)造函數(shù)重載和方法重載很相似。可以為一個(gè)類(lèi)創(chuàng)建多個(gè)構(gòu)

造函數(shù)。每一個(gè)構(gòu)造函數(shù)必須有它自己唯一的參數(shù)列表。

Java不支持像C++中那樣的復(fù)制構(gòu)造函數(shù),這個(gè)不同點(diǎn)是因?yàn)槿绻?/p>

你不自己寫(xiě)構(gòu)造函數(shù)的情況下,Java不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函

數(shù)。

19.面向?qū)ο蟮摹傲瓌t一法則”目的分別是什么?

1)一職責(zé)原則:一個(gè)類(lèi)只做它該做的事情(單一職責(zé)原則表達(dá)的是

“高內(nèi)聚”的思想,寫(xiě)代碼最終原則“高內(nèi)聚,低耦合”。高內(nèi)聚

第12頁(yè)共130頁(yè)

通俗的講就是一個(gè)代碼能完成一項(xiàng)功能,在面向?qū)ο笾校绻蛔?/p>

一個(gè)類(lèi)完成該做的事,而不涉及到其它無(wú)關(guān)的類(lèi)就是高內(nèi)聚。)

2)開(kāi)閉原則:設(shè)計(jì)的系統(tǒng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。怎么理解呢,

開(kāi)閉原則在做新功能開(kāi)發(fā)的時(shí)候經(jīng)常用到,我的理解是當(dāng)我們需要

給一個(gè)類(lèi)添加一個(gè)新的功能時(shí),最好的辦法不是直接修改這個(gè)類(lèi)的

代碼,有可能牽一發(fā)動(dòng)全身,應(yīng)該考慮如何用一個(gè)新的類(lèi)實(shí)現(xiàn)一個(gè)

新的功能,最終的效果是一系列相關(guān)的功能都有自己的類(lèi),當(dāng)然它

們都繼承于父類(lèi)。

3)依賴(lài)倒轉(zhuǎn)原則:高層模塊不應(yīng)該依賴(lài)于底層模塊,二者都應(yīng)該依

賴(lài)于抽象。抽象不應(yīng)該依賴(lài)于具體實(shí)現(xiàn),具體實(shí)現(xiàn)應(yīng)該依賴(lài)于抽

象。其核心思想是面向接口編程。怎么理解吶,就比如說(shuō)我們要把

生產(chǎn)一輛汽車(chē)當(dāng)做一條程序,首先是不是先要建立接口比如車(chē)輪,

車(chē)身,汽車(chē)。每一個(gè)接口都有各自固定的方法,比如車(chē)輪這個(gè)接口

里面就有大小尺寸的方法。比如我們現(xiàn)在要生產(chǎn)一輛轎車(chē),我們就

要寫(xiě)一個(gè)實(shí)現(xiàn)這個(gè)接口的實(shí)現(xiàn)類(lèi),類(lèi)名是轎車(chē)輪。要是生產(chǎn)卡車(chē)呢

就寫(xiě)一個(gè)實(shí)現(xiàn)這個(gè)接口的實(shí)現(xiàn)類(lèi)。這樣一來(lái)既節(jié)省了時(shí)間,也便于

我們更好的維護(hù)。

4)里氏替換原則:所有引用父類(lèi)的地方必須能透明的使用其子類(lèi)的

對(duì)象。比如有兩個(gè)類(lèi)一個(gè)A類(lèi),一個(gè)B類(lèi),并且A是B的父類(lèi)。現(xiàn)

在有一個(gè)方法可以接受A類(lèi)對(duì)象a時(shí),那么這個(gè)方法也能接受B類(lèi)

對(duì)象b。

5)接口隔離原則:接口應(yīng)該小而專(zhuān),不應(yīng)該大而全。

第13頁(yè)共130頁(yè)

6)合成聚合復(fù)用原則:優(yōu)先使用聚合或合成關(guān)系復(fù)合代碼。

7)迪米特法則:最少知識(shí)原則,一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能

少的了解。

20.java語(yǔ)言如何處理異常,關(guān)鍵字throw,throws,try,finally

分別代表什么?在宜y塊可以?huà)伋霎惓幔?/p>

異常:程序運(yùn)行時(shí)出現(xiàn)的錯(cuò)誤,比如試圖打開(kāi)一個(gè)根本不存在的文

件夾等。異常大致分為:Error和Exception兩類(lèi),Error是程序無(wú)

法處理的錯(cuò)誤,此類(lèi)錯(cuò)誤一般表示代碼運(yùn)行時(shí)JVM出現(xiàn)的錯(cuò)誤。比

如虛擬機(jī)運(yùn)行錯(cuò)誤或者類(lèi)定義錯(cuò)誤。而Exception代表的是程序本

身能夠捕獲且可以處理的異常。可以分為兩類(lèi)一種是運(yùn)行時(shí)異常

(不受檢異常)一種是非運(yùn)行時(shí)異常(受檢異常)。前者屬于不可

查異常,一般是由邏輯性錯(cuò)誤引起的,在程序中可以選擇捕獲異

常,也可以不處理。而一旦出現(xiàn)后者這種異常,必須對(duì)異常進(jìn)行處

理。比如lOException,要么使用try-catch捕獲,要么使用

throws拋出異常,否則編譯不過(guò)。

Java處理異常機(jī)制:通過(guò)面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把不同的

異常進(jìn)行分類(lèi),并提供良好的接口。當(dāng)一個(gè)方法出現(xiàn)異常時(shí)就會(huì)拋

出一個(gè)異常對(duì)象,這個(gè)對(duì)象包含異常信息,然后調(diào)用這個(gè)對(duì)象的方

法就會(huì)捕獲到異常并進(jìn)行處理。

throw拋出異常對(duì)象thrownew異常類(lèi)名(參數(shù));

publicclassDemoThrow{

publicstaticvoidmain(String[]args){

inta=DemoThrow.div(4,0);

第14頁(yè)共130頁(yè)

System.out.println(a);

)

publicstaticintdiv(inta,intb){

if(b==0)

thrownewArithmeticException("異常信息:除數(shù)不能為0");

//拋出具體問(wèn)題,編譯時(shí)不檢測(cè)

returna/b;

)

)

throws聲明拋出異常

修飾符返回值類(lèi)型方法名(參數(shù))throws異常類(lèi)名工,異常類(lèi)名2...{}

importjava.io.Fileinputstream;

importjava.io.FileNotFoundException;

importjava.io.Inputstream;

publicclassDemoThrows{

publicstaticvoidmain(String[]args)throws

FileNotFoundException{

readFile();

)

publicstaticvoidreadFile()throwsFileNotFoundException{

Inputstreamis=newFileInputStream("E:/iodemo/ch01.txt");

)

)

try:在這個(gè)成員函數(shù)內(nèi)部寫(xiě)另一個(gè)try語(yǔ)句保護(hù)其他代碼。每當(dāng)遇到一

個(gè)try語(yǔ)句,”異常"的框架就放到堆棧上面,直到所有的try語(yǔ)句都

完成。如果下一級(jí)的宜y語(yǔ)句沒(méi)有對(duì)某種“異常”進(jìn)行處理,堆棧就會(huì)

展開(kāi),直到遇到有處理這種“異常”的try語(yǔ)句。

Finally為確保一段代碼不管發(fā)生什么“異常”都被執(zhí)行一段代碼。

importjava.io.Fileinputstream;

importjava.io.FileNotFoundException;

importjava.io.Inputstream;

publicclassDemoTryCatch{

publicstaticvoidmain(String[]args){

//捕獲異常

try(

//可能產(chǎn)生異常的代碼

第15頁(yè)共130頁(yè)

readFile();

}catch(FileNotFoundExceptione){

//異常的處理邏輯,將異常記錄日志,異常封裝后顯示

System.out.printin("系統(tǒng)找不到指定的路徑”);

}

System.out.printIn(“后續(xù)代碼”);

}

publicstaticvoidreadFile()throwsFileNotFoundException{

Inputstreamis=newFileInputStream("E:/iodemo/ch01.txt");

)

)

21.說(shuō)明一下finalfinallyfinalize的區(qū)別?

final聲明屬性、方法、類(lèi),分別表示屬性不可變、方法不可覆蓋、

類(lèi)不可繼承。

finally是異常處理語(yǔ)句的一部分,表示總是執(zhí)行。

finalize是Object類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用

被回收的對(duì)象的此方法,可以覆蓋此方法提供垃圾回收的其他資源。

22.面向?qū)ο蟮奶卣鳎?/p>

抽象::抽象是將一類(lèi)對(duì)象的共同特征總結(jié)出來(lái)構(gòu)造類(lèi)的過(guò)程,包括

數(shù)據(jù)抽象和行為抽象兩方面,抽象只關(guān)注對(duì)象的哪些屬性和行為,并

不關(guān)注這此行為的細(xì)節(jié)是什么

封裝:將數(shù)據(jù)和行為組合到一個(gè)包中,并對(duì)對(duì)象的使用者隱藏具體的

實(shí)現(xiàn)方式。

繼承:當(dāng)兩個(gè)類(lèi)具有相同的屬性和方法時(shí),可以將相同的部分提取

出來(lái)作為父類(lèi),其他的類(lèi)繼承這個(gè)類(lèi)的方法和屬性。

多態(tài):同一個(gè)行為用不同的表現(xiàn)形式或形態(tài)的能力。說(shuō)具體點(diǎn)就是

同一接口,使用不同的實(shí)例而執(zhí)行的結(jié)果。

第16頁(yè)共130頁(yè)

23.java是否具支持多繼承?

Java中類(lèi)是不支持多繼承的。(一個(gè)類(lèi)只能有一個(gè)父類(lèi))但java中

接口是支持多繼承的,即一個(gè)接口可以有多個(gè)父接口。

24.如何通過(guò)反射創(chuàng)建對(duì)象?反射:java反射機(jī)制是在運(yùn)行過(guò)程中,

對(duì)任何一個(gè)類(lèi),都可以知道這個(gè)類(lèi)的所有方法和屬性;對(duì)于任何一個(gè)

對(duì)象,都可以知道這個(gè)對(duì)象的所有方法和屬性。

第一種通過(guò)class的newlntance()方法來(lái)創(chuàng)建對(duì)象。

第二種通過(guò)Constructor的newlntance()方法來(lái)創(chuàng)建對(duì)象。

25.string、stringBuffer、stringBulide的區(qū)別?String不可變有

什么好處?

string:是字符串常量string類(lèi)是final的所以string不可以繼

承沒(méi)有子類(lèi)。

stringBuffer:是字符變量,是線(xiàn)程安全的,也就是多線(xiàn)程修改同一

個(gè)StringBuffer對(duì)象的時(shí)候,過(guò)程是同步的,當(dāng)然這就導(dǎo)致了

StringBuffer的效率降低。

不可變對(duì)象是指一個(gè)對(duì)象的狀態(tài)在對(duì)象被創(chuàng)建之后就不再變化。不可

改變的意思就是說(shuō):不能改變對(duì)象內(nèi)的成員變量,包括基本數(shù)據(jù)類(lèi)型

的值不能改變,引用類(lèi)型的變量不能指向其他的對(duì)象,引用類(lèi)型指向

的對(duì)象的狀態(tài)也不能改變。

String不可變是因?yàn)樵贘DK中String類(lèi)被聲明為一個(gè)final類(lèi),

且類(lèi)內(nèi)部的value字節(jié)數(shù)組也是final的,只有當(dāng)字符串是不可

變時(shí)字符串池才有可能實(shí)現(xiàn),字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多

第17頁(yè)共130頁(yè)

heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串;如

果字符串是可變的則會(huì)引起很?chē)?yán)重的安全問(wèn)題,譬如數(shù)據(jù)庫(kù)的用戶(hù)名

密碼都是以字符串的形式傳入來(lái)獲得數(shù)據(jù)庫(kù)的連接,或者在socket

編程中主機(jī)名和端口都是以字符串的形式傳入,因?yàn)樽址遣豢勺?/p>

的,所以它的值是不可改變的,否則黑客們可以鉆到空子改變字符串

指向的對(duì)象的值造成安全漏洞;因?yàn)樽址遣豢勺兊模允嵌嗑€(xiàn)

程安全的,同一個(gè)字符串實(shí)例可以被多個(gè)線(xiàn)程共享,這樣便不用因?yàn)?/p>

線(xiàn)程安全問(wèn)題而使用同步,字符串自己便是線(xiàn)程安全的;因?yàn)樽址?/p>

是不可變的所以在它創(chuàng)建的時(shí)候hashcode就被緩存了,不變性也保

證了hash碼的唯一性,不需要重新計(jì)算,這就使得字符串很適合作

為Map的鍵,字符串的處理速度要快過(guò)其它的鍵對(duì)象,這就是

HashMap中的鍵往往都使用字符串的原因。

26.String類(lèi)的常用方法?

publicintlength()獲取string對(duì)象的字符序列長(zhǎng)度。

Stringchina="1998年出生”;

intnlrn2£

nl=chian.lenght();

n2="小鳥(niǎo)fly”.lenght();

nl的值是7,n2的值是5

publicintcompareTo(Strings)按字典序與參數(shù)指定的string對(duì)

象s的字符序列比較大小.如果String對(duì)象的字符序列與s相同,該

方法返回0,大于返回正值。

publicintindexOf(Strings)從當(dāng)前string對(duì)象的字符序列的0

索引位置開(kāi)始檢索首次出現(xiàn)S的位置并返回該位置

Stringtom="Iamagoodcat";

第18頁(yè)共130頁(yè)

//0123456789從零開(kāi)始的并且空格也算一個(gè)數(shù)如果沒(méi)有返回-1

tom.indexOf("a");//值是2

tom.indexOf("good"A2);//值是7從當(dāng)前字符串的第二位開(kāi)始數(shù)

tom.indexOf("wn,2);//-I

publicintindexOf(Strings,intstartpoint)

從當(dāng)前字符串的startpoint位置開(kāi)始檢索字符串s,并返回首次出現(xiàn)s的位置。

沒(méi)有找到的時(shí)候,返回T.

publicintlastlndexOf(Strings)從當(dāng)前String對(duì)象的字符序列

的0索引位置開(kāi)始檢索最后一次出現(xiàn)S的位置并返回該位置

publicbooleanequals(Strings)比較當(dāng)前string對(duì)象的字符

序列是否和參數(shù)相等

Stringtom=newString("天道酬勤”);

Stringboy=newString(“知心朋友”);

Stringjerry=newString(“天道酬勤”);

tom.equlas(boy);//false比較對(duì)象tom和參數(shù)boy是否相等如果相等返回

true否貝!Jfalse

tom.equals(jerry);//true

publicbooleanstartsWith(Strings)string字符前綴是否相等

publicbooleanendWith(Strings)string字符后綴是否相等

publicbooleancontains(Strings)判斷當(dāng)前String對(duì)象的

字符序列是否包含參數(shù)S的字符序列。

publicStringsubstring(intstartpoint)字符串對(duì)象調(diào)用該方法

獲得一個(gè)新的String對(duì)象

27.說(shuō)明Comparator和Comparable接口的區(qū)別以及它們的作用?

Comparator接口里面有兩種方法一種是compare另一種是equals。

compareO方法用來(lái)給輸入兩個(gè)輸入的參數(shù)排序,返回值負(fù)、0、

正分別代表第一個(gè)參數(shù)小于、等于、大于第二個(gè)參數(shù)。equalsO

方法需要一個(gè)對(duì)象作為參數(shù),然后才能決定對(duì)象是否和comparator

相等,如果相等返回true,不相等返回false。

第19頁(yè)共130頁(yè)

comparable接口里面只有一個(gè)compareTo()方法,這個(gè)方法用來(lái)

給兩個(gè)對(duì)象排序。它返回負(fù)數(shù)、0、正數(shù)表示輸入對(duì)象小于、等于、

大于已經(jīng)存在的對(duì)象。

28.解釋一下類(lèi)加載機(jī)制,什么是雙親委派模型?好處是什么?

類(lèi)加載機(jī)制:將類(lèi)的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將

其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆內(nèi)創(chuàng)建一個(gè)

java.lang.Class對(duì)象,用來(lái)封裝類(lèi)在方法區(qū)的數(shù)據(jù)結(jié)構(gòu)。類(lèi)加載的最

終結(jié)果是堆內(nèi)的class對(duì)象,class對(duì)象封裝了方法區(qū)的數(shù)據(jù)結(jié)

構(gòu),并向程序員提供訪(fǎng)問(wèn)方法區(qū)數(shù)據(jù)結(jié)構(gòu)的接口。

雙親委派機(jī)制:當(dāng)一個(gè)類(lèi)加載器收到類(lèi)加載請(qǐng)求時(shí),它首先不會(huì)自

己加載這個(gè)類(lèi),而是把加載這個(gè)類(lèi)的請(qǐng)求委派給自己的父類(lèi)加載

器,每一層加載器都是這樣,這樣一來(lái)加載請(qǐng)求就會(huì)傳送到頂層的

啟動(dòng)加載器中,只有父類(lèi)加載器無(wú)法完成加載請(qǐng)求時(shí)(搜索范圍沒(méi)

有要加載的類(lèi)),子類(lèi)加載器才會(huì)嘗試去完成類(lèi)的加載。

好處:避免重復(fù)加載,提高效率。父類(lèi)已經(jīng)加載了,子類(lèi)就不需要

加載了。

很好的解決了各個(gè)類(lèi)加載器之間基礎(chǔ)類(lèi)的的同一問(wèn)題,如果不使用

該種方式,那么用戶(hù)隨意定義類(lèi)加載器來(lái)加載核心API,會(huì)帶來(lái)相

關(guān)的隱患。

29.請(qǐng)說(shuō)明static關(guān)鍵字是什么意思?Java中是否可以覆蓋

(override)——個(gè)private或static的方法?

static:static關(guān)鍵字表示一個(gè)成員變量或者成員方法可以在沒(méi)有

第20頁(yè)共130頁(yè)

所屬類(lèi)的實(shí)例變量的情況下被訪(fǎng)問(wèn)。

修飾變量:static變量類(lèi)型變量名

目的:作為共享變量使用減少創(chuàng)建對(duì)象保留唯一副本

修飾方法:【訪(fǎng)問(wèn)權(quán)限修飾符】static方法返回值方法名(參

數(shù)列表)

Java中static方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)

綁定的,而static方法是編譯時(shí)靜態(tài)綁定的。static方法跟類(lèi)的

任何實(shí)例都不相關(guān),所以概念上不適用。

30.列舉object類(lèi)的方法并簡(jiǎn)要說(shuō)明。

object類(lèi):所以類(lèi)的超類(lèi)(父類(lèi))

equals方法:確定兩個(gè)對(duì)象的引用是否相等。

hashCode方法:返回對(duì)象的哈希碼值。publicinthashCode()

getClass方法:返回object運(yùn)行時(shí)的類(lèi)。

publicfinalclassgetClass()

toString方法:返回對(duì)象值的一個(gè)字符串。

publicStringtoString()

StringtoString(){

getClass().getName()+n@n+Integer.toHexString(hashCode());

getClass().getName()++Integer.toHexString(hashCode())這返

回的是:類(lèi)的全路徑名稱(chēng)+它的哈希碼值。

31.類(lèi)和對(duì)象的區(qū)別?

定義上的不同:類(lèi)是現(xiàn)實(shí)世界或思維世界在計(jì)算機(jī)的反映,它將數(shù)

據(jù)和數(shù)據(jù)上的操作封裝起來(lái)。

第21頁(yè)共130頁(yè)

對(duì)象是具有類(lèi)類(lèi)型的變量,兩者是面向?qū)ο缶幊套罨镜母拍睢?/p>

范疇不同:類(lèi)是一個(gè)抽象概念,它不存在現(xiàn)實(shí)世界的時(shí)間、空間

里。類(lèi)知識(shí)為所有對(duì)象定義了抽象的屬性和行為。

對(duì)象則是類(lèi)的一個(gè)具體。

狀態(tài)不同:類(lèi)是一個(gè)靜態(tài)的概念,類(lèi)本身不攜帶任何數(shù)據(jù)。當(dāng)沒(méi)有

為類(lèi)創(chuàng)建任何數(shù)據(jù)時(shí),類(lèi)本身不存在于內(nèi)存空間。

對(duì)象是動(dòng)態(tài)的概念,每一個(gè)對(duì)象都存在著有別于其他對(duì)象的屬性和

行為。

二者的聯(lián)系:類(lèi)是對(duì)象的抽象,對(duì)象是類(lèi)的具體。二者的關(guān)系猶如

模板和鑄件一樣,類(lèi)的實(shí)例化就是對(duì)象。

32.類(lèi)的加載過(guò)程?如何保證我的類(lèi)被指定加載器加載?相同的類(lèi)被

不同的加載器加載,這兩個(gè)類(lèi)相同嗎?

類(lèi)加載機(jī)制:

加載一驗(yàn)證—準(zhǔn)備—,解析一,初始化

加載:在內(nèi)存中生成java.long.class對(duì)象,作為方法區(qū)這個(gè)類(lèi)的

各種數(shù)據(jù)入口。(注意這個(gè)過(guò)程并不是一定要去class類(lèi)中獲取,

還可以從zip包或者運(yùn)行時(shí)計(jì)算生成)

驗(yàn)證:這個(gè)過(guò)程主要確保class文件中的字節(jié)流中包含的信息是否

滿(mǎn)足當(dāng)前虛擬機(jī)的要求。

準(zhǔn)備:準(zhǔn)備階段是正式為類(lèi)變量分配內(nèi)存,設(shè)置變量初始值的階

段。在方法區(qū)中分配這些變量所使用的空間。

解析:虛擬機(jī)將常量池中的符號(hào)引用替換為直接引用的過(guò)程。符號(hào)引

第22頁(yè)共130頁(yè)

用就是class文件中:

CONSTANT_Class_info

CONSTANT_Field_info

CONSTANT_Method_info

等類(lèi)型的常量。

初始化:類(lèi)加載的最后一個(gè)階段,前面的加載階段可以自定義加載

器以外,其他階段都是有jvm主導(dǎo)的。這個(gè)階段是執(zhí)行類(lèi)構(gòu)造器

〈client》方法的過(guò)程。

一個(gè)類(lèi),由不同的類(lèi)加載器實(shí)例加載的話(huà),就會(huì)在方法區(qū)產(chǎn)生兩個(gè)

不同的類(lèi),彼此不可見(jiàn),并且在堆中生成不同的class實(shí)例。

33.什么是集合?它的作用是什么?集合與數(shù)組的區(qū)別?Java集合

框架體系結(jié)構(gòu)?

集合:是一種java工具類(lèi),像是一種容器,用來(lái)存儲(chǔ)任意數(shù)量的具

有相同屬性的對(duì)象。

作用:在類(lèi)的內(nèi)部,對(duì)數(shù)據(jù)進(jìn)行組織。

簡(jiǎn)單快速的搜索大量的條目。

有的集合接口,提供一系列排列有序的元素,并且可以在有

序列中快速的插入刪除有關(guān)元素。

還有一些集合接口,提供映射關(guān)系,可通過(guò)關(guān)鍵字(key)去

快速查找唯一對(duì)應(yīng)的對(duì)象,且這個(gè)關(guān)鍵字的類(lèi)型是任意的。

區(qū)別:數(shù)組長(zhǎng)度固定不變,集合長(zhǎng)度改變。

數(shù)組只能通過(guò)下標(biāo)去訪(fǎng)問(wèn)元素,類(lèi)型固定(整型),有的集

第23頁(yè)共130頁(yè)

合可以通過(guò)任意類(lèi)型查找所映射的具體對(duì)象。

Java集合框架體系結(jié)構(gòu):

lis廂Queue是有序,可以重復(fù)科既U的

list(序列)子接口0實(shí)現(xiàn)類(lèi)ArrayList數(shù)組序列

一~一~Queue(隊(duì)列)子?接口?實(shí)現(xiàn)類(lèi)LinkedList鏈表

Collectionm接口>-----------------------------------------------

1\set(集)子接口0實(shí)現(xiàn)類(lèi)Headset哈希集

java集合框架體系結(jié)構(gòu)無(wú)序,不可重復(fù)科既

<key,Value〉Entry(鍵對(duì)值)內(nèi)音湊

~?實(shí)現(xiàn)類(lèi)HeadMap哈希表

------------------------------------------

34.什么是迭代器(Iterator)?迭代器的fail-fast機(jī)制?主要解

決什么問(wèn)題?

迭代器:是一種設(shè)計(jì)模式,是一個(gè)對(duì)象,它的工作是遍歷并選擇序

列中的對(duì)象。(遍歷就是把每一個(gè)元素訪(fǎng)問(wèn)一邊)(java的迭代器

只能單向移動(dòng))

迭代器方法:next。獲取序列的下一個(gè)元素。

HasNextO檢查序列中是否還有元素(如果有返回

true)o

Remove。刪除上次調(diào)用next()方法返回的元素。

迭代器的作用:為各種容器提供公共的操作接口,使用java的迭代

器iterator可以使對(duì)容器的遍歷操作完全與其底層隔離可以很好地

達(dá)到解耦效果。(解耦:較為具體的說(shuō)明就是有的時(shí)候程序需要修

改,我只需要改正一部分,單是如果程序的耦合性很強(qiáng)的話(huà)就需要

從頭再寫(xiě)一遍很不劃算,而正常的開(kāi)發(fā)中都是改那部分,重寫(xiě)那部

分,把配置文件一改就成了,java中通過(guò)接口(interface),

第24頁(yè)共130頁(yè)

spring技術(shù)中的ioc等實(shí)現(xiàn)的解耦合,重寫(xiě)覆蓋父類(lèi)的方法也是一

種解耦行為)

迭代器源代碼:

importjava.util.*;

publicclassT一st工t一rator{

publicstaticvoidmain(Stringargs[]){

//創(chuàng)建一個(gè)list它是一個(gè)序列化的數(shù)據(jù)

List1ist=newArrayList();

//創(chuàng)建一個(gè)map,它是一個(gè)非序列化的數(shù)據(jù)

Mapmap=newHashMap();

for(inti=0;i<10;i++){

//向容器中添加數(shù)據(jù)

list?add(newString();

map.put(i,newString(”map"+i));

}

//序列化了的數(shù)據(jù)創(chuàng)建迭代器。

IteratoriterList=list?it一rator();//List接口實(shí)現(xiàn)了工t一rabl一接口

//進(jìn)行遍歷如果容器中有下一個(gè)數(shù)據(jù),就獲取下一個(gè)數(shù)據(jù)并打印出來(lái)

while(iterList.hasNext()){

StringstrList=(String)iterList.next();

System.out.printIn(strList.toString());

}

//創(chuàng)建非序列化數(shù)據(jù)的迭代器,要先將其序列化

IteratoriterMap=map.entrySet().iterator();

//進(jìn)行遍歷如果容器中有下一個(gè)數(shù)據(jù),就獲取下一個(gè)數(shù)據(jù)并打印出來(lái)

while(iterMap.hasNext()){

Map.EntrystrMap=(Map.Entry)iterMap.next();

System.out.printin(strMap.getValue());

}

)

}

迭代器的fail-fast機(jī)制:

Fail-fast是java集合中的一種錯(cuò)誤機(jī)制,當(dāng)多個(gè)線(xiàn)程對(duì)同一

集合的內(nèi)容同時(shí)操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。比如說(shuō)

35.set、Map、List接口存取元素時(shí),各有什么特點(diǎn)?以及

collection^set>map、list之間的聯(lián)系和區(qū)另U?

第25頁(yè)共130頁(yè)

Set(集)接口存取元素時(shí)不允許增加重復(fù)的元素(用對(duì)象的

equals()方法來(lái)區(qū)分元素是否重復(fù))。

publicstaticvoidmain(String[]args){

HashSet<String>hashSet=newHashSet<>();

LinkedHashSet<String>linkedHashSet=newLinkedHashSet<>();

TreeSet<String>treeSet=newTreeSet<>();

for(Stringdata:Arrays.asListC'afaE","afaE","asfweD",

"hfasfae","aefaeA")){

hashSet.add(data);

linkedHashSet.add(data);

treeSet.add(data);

}

//HashSet:無(wú)序,隨機(jī)輸出。底層數(shù)據(jù)結(jié)構(gòu)是哈希表,依賴(lài)hashCode()和

equals()兩個(gè)方法來(lái)保證唯一性。

System.out.printIn("OrderinginHashSet:"+hashSet);

“LinkedHashSet:FIFO插入有序,先進(jìn)先出。底層結(jié)構(gòu)是鏈表和哈希表,

由鏈表保證元素有序,哈希表保證元素唯一。

System.out.println("OrderofelementinLinkedHashSet:"+

linkedHashSet);

//TreeSet:有序,唯一。底層結(jié)構(gòu)是紅黑樹(shù),排序采用自然排序和比較容器

排序,根據(jù)比較的返回值是否為。來(lái)判斷元素唯一。

System.out.printIn("OrderofobjectsinTreeSet:"+

treeSet);

)

*>rubhr->;??,OCXXKOW

*terminated?【JavaApp?c?tior]ew(2019^3^195上午

OrdvringinHji>ehS*t:[af?B.MXVMD,hfaufa?,awfawAj

OrderofelenentinLinkedHashSet:[afaE.asfweDhfasf&e,aefaeA]

Ordercfobj?ctsinTr?eS?t:(??fiwA,af?BrasfweD.hfasf40]

Map(映射)接口存取元素時(shí)采用鍵對(duì)值(key-value)的方式來(lái)存

取。key唯一的,value不唯一可以重復(fù),一個(gè)value有一個(gè)

key對(duì)映。

publicstaticvoidmain(String[]args){

第26頁(yè)共130頁(yè)

//HashMap采用鍵值對(duì)存儲(chǔ)數(shù)據(jù),采用put。方法存放數(shù)據(jù)

Map<IntegerJString>map=newHashMap<Integer,String)。;

map.put(l?“中國(guó)“);

map.put(2?“小日本”);

map.put(3,“美國(guó)佬”);

//foreach遍歷方法》普遍使用,通過(guò)對(duì)hey唯一的特性,進(jìn)行huy遍歷

for(Integerkey:map.keySet()){

System.out.println(key+"+map.get(key));

}

System.out.printin("----------------------------------------------------------------");

//因?yàn)閔ey唯一,key重復(fù)時(shí)會(huì)自動(dòng)覆蓋value之前存儲(chǔ)的數(shù)據(jù)

map.put(3?”英國(guó)佬”);

for(Integerkeyl:map.keySet()){

System.out.println(keyl+"+map.get(keyl));

}

System.out.printin("----------------------------------------------------------------");

//Map.Entry遍歷hey和value,同樣是foreach方法,推薦容量大的時(shí)候

使用

for(Map.Entry<IntegerJString>entry:map.entrySet()){

System.out.printin(entry.getKey()++

entry.getValue());

}

)

.*;,??J>L.OComoU漢

*terminated>Trw&?t1(JwaAppfic?t>on)(2019^3Qi99下*2:16901)

List(列表)接口用特定的索引來(lái)存取,可以有重復(fù)元素。

publicstaticvoidmain(String[]args){

List<Integer>arraylist=newArrayList<>();

arraylist.add(3);

arraylist.add(22);

arraylist.add(31);

arraylist.add(345);

arraylist.add(63);

arraylist.add(3);

第27頁(yè)共130頁(yè)

//ArrayLtst底層是一個(gè)數(shù)組,輸出時(shí)需要于oreach遍歷,查詢(xún)快,增刪慢,線(xiàn)層安全)

效率高

System.out.print("arraylist:

for(Integertest:arraylist){

System.out.print(test+"");

System.out.printin();//換行

//Vector底層是一個(gè)實(shí)現(xiàn)自動(dòng)增長(zhǎng)的對(duì)象數(shù)組,元素會(huì)自動(dòng)添加到數(shù)組中,查詢(xún)快,增

刪慢,線(xiàn)層安全,效率低

Vector<Integer>vector=newVector<>();

vector.add(3);

vector.add(5);

vector.add(25);

vector.add(51);

vector.add(5);

System.out.printin("vector:"+vector);

//LtnhedLtst底層是一個(gè)鏈表,查詢(xún)慢,增刪快,線(xiàn)層不安全,效率高

LinkedList<Integer>linkedList=newLinkedList<>();

linkedList.add(30);

linkedList.add(30);

linkedList.add(34);

linkedList.add(55);

System.out.printIn("linkedlist"+linkedList);

?:QComote

?t?rrntna<?d?IrwSHl(JavaApplicalicn]^0^201\bir(2019*3月19m上學(xué)11:11:19)

&rraylifii:32231345633

vector:[X5,25,51,5]

linkedlifit[30.30,34,55]

Set、list者B是collection接口的子接口,map接口和

collection接口是同等級(jí)的。

36.詳細(xì)介紹java集合框架結(jié)構(gòu)?

list接口的實(shí)現(xiàn)類(lèi):

ArrayList:基于數(shù)組實(shí)現(xiàn),非線(xiàn)性安全、效率高、增刪慢、查找

快。

Vector:基于數(shù)組實(shí)現(xiàn),線(xiàn)性安全、效率低、增刪慢、查找慢。

LinkedList:基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散列的、增刪快、查找慢。

Map接口的實(shí)現(xiàn)類(lèi):

第28頁(yè)共130頁(yè)

HashMap:基于hash表的map接口實(shí)現(xiàn),非線(xiàn)性安全、高效、支持

null值和null健。

HashTable:線(xiàn)程安全、低效、不支持null值和null健。

sortedMap接口:TreeMap能夠把它保留德記錄根據(jù)健排序,默認(rèn)升

序排序。

Set接口的實(shí)現(xiàn)類(lèi):

HashSet:底層是由HashMap實(shí)現(xiàn),不允許集合中有重復(fù)的值,使

用該方式時(shí)需要重寫(xiě)equals。和hashCode。方法。

第29頁(yè)共130頁(yè)

排列有序,可重復(fù)

底層使用數(shù)坦

ArrayList速磨快,塔珊侵,getter便Gseneq)方法快

送程不安叁倒

當(dāng)零星不婚時(shí),ArrayList是當(dāng)前容量*15*1

排列有序,可里晝

底層使用數(shù)阻

Vector速,章快.塔珊奧

線(xiàn)朝全融低

當(dāng)容量慢氏

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論