版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java經(jīng)典面試題集及答案2021
Java經(jīng)典面試題及答案1
1.Java集合框架是什么?說出一些集合框架的優(yōu)點(diǎn)?
每種編程語言中都有集合,最初的Java版本包含幾種集合
類:Vector、Stack、HashTable和Array。
隨著集合的廣泛使用,Java1.2提出了囊括所有集合接口、
實(shí)現(xiàn)和算法的集合框架。在保證線程安全的情況下使用泛型和并
發(fā)集合類,Java已經(jīng)經(jīng)歷了很久。它還包括在Java并發(fā)包中,
阻塞接口以及它們的實(shí)現(xiàn)。
集合框架的部分優(yōu)點(diǎn)如下:
(1)使用核心集合類降低開發(fā)成本,而非實(shí)現(xiàn)我們自己的集
合類。
(2)隨著使用經(jīng)過嚴(yán)格測(cè)試的集合框架類,代碼質(zhì)量會(huì)得到
提高。
(3)通過使用JDK附帶的集合類,可以降低代碼維護(hù)成本。
(4)復(fù)用性和可操作性。
2.集合框架中的泛型有什么優(yōu)點(diǎn)?
Java1.5引入了泛型,所有的集合接口和實(shí)現(xiàn)都大量地使用
它。泛型允許我們?yōu)榧咸峁┮粋€(gè)可以容納的對(duì)象類型,因此,
如果你添加其它類型的任何元素,它會(huì)在編譯時(shí)根錯(cuò)。這避免了
在運(yùn)行時(shí)出現(xiàn)CIassCastException,因?yàn)槟銓?huì)在編譯時(shí)得到
報(bào)錯(cuò)信息。
泛型也使得代碼整潔,我們不需要使用顯式轉(zhuǎn)換和
instanceOf操作符。它也給運(yùn)行時(shí)帶來好處,因?yàn)椴粫?huì)產(chǎn)生類
型檢查的字節(jié)碼指令。
3.Java集合框架的基礎(chǔ)接口有哪些?
CoIIection為集合層級(jí)的根接口。一個(gè)集合代表一組對(duì)象,
這些對(duì)象即為它的元素。Java平臺(tái)不提供這個(gè)接口任何直接的
實(shí)現(xiàn)。
Set是一個(gè)不能包含重復(fù)元素的集合。這個(gè)接口對(duì)數(shù)學(xué)集合
抽象進(jìn)行建模,被用來代表集合,就如一副牌。
List是一個(gè)有序集合,可以包含重復(fù)元素。你可以通過它
的索引來訪問任何元素。List更像長(zhǎng)度動(dòng)態(tài)變換的數(shù)組。
Map是一個(gè)將key映射到value的對(duì)象.一個(gè)Map不能包含
重復(fù)的key:每個(gè)key最多只能映射一個(gè)value。
一些其它的接口有Queue、Dequeue>SortedSet>SortedMap
和ListIteratoro
4.為何ColIection不從Cloneable和Serializable接口繼
承?
Co11ection接口指定一組對(duì)象,對(duì)象即為它的元素。如何
維護(hù)這些元素由Collection的具體實(shí)現(xiàn)決定。
例如,一些如List的Collection實(shí)現(xiàn)允許重復(fù)的元素,而
其它的如Set就不允許。很多Co11ection實(shí)現(xiàn)有一個(gè)公有的
clone方法。然而,把它放到集合的所有實(shí)現(xiàn)中也是沒有意義的。
這是因?yàn)镃ollection是一個(gè)抽象表現(xiàn)。重要的是實(shí)現(xiàn)。
當(dāng)與具體實(shí)現(xiàn)打交道的時(shí)候,克隆或序列化的語義和含義才
發(fā)揮作用。所以,具體實(shí)現(xiàn)應(yīng)該決定如何對(duì)它進(jìn)行克隆或序列化,
或它是否可以被克隆或序列化。
在所有的實(shí)現(xiàn)中授權(quán)克隆和序列化,最終導(dǎo)致更少的靈活性
和更多的限制。特定的實(shí)現(xiàn)應(yīng)該決定它是否可以被克隆和序列
化。
5.為何Map接口不繼承Co11ection接口?
盡管Map接口和它的實(shí)現(xiàn)也是集合框架的一部分,但Map
不是集合,集合也不是Map。因此,Map繼承Collection毫無意
義,反之亦然。
如果Map繼承Collection接口,那么元素去哪兒?Map包含
key-value對(duì),它提供抽取key或value列表集合的方法,但是
它不適合“一組對(duì)象”規(guī)范。
6.Iterator是什么?
Iterator接口提供遍歷任何CoIIection的接口。我們可以
從一個(gè)Collection中使用迭代器方法來獲取迭代器實(shí)例。迭代
器取代了Java集合框架中的Enumerationo迭代器允許調(diào)用者
在迭代過程中移除元素。
7.Enumeration和Iterator接口的區(qū)別?
Enumeration的速度是Iterator的兩倍,也使用更少的內(nèi)
存。Enumeration是非?;A(chǔ)的,也滿足了基礎(chǔ)的需要。但是,
與Enumeration相比,Iterator更加安全,因?yàn)楫?dāng)一個(gè)集合正
在被遍歷的時(shí)候,它會(huì)阻止其它線程去修改集合。
迭代器取代了Java集合框架中的Enumerationo迭代器允
許調(diào)用者從集合中移除元素,而Enumeration不能做到。為了使
它的功能更加清晰,迭代器方法名已經(jīng)經(jīng)過改善。
8.為何沒有像Iterator,add()這樣的方法,向集合中添加
元素?
語義不明,已知的是,Iterator的協(xié)議不能確保迭代的次
序。然而要注意,ListIterator沒有提供一個(gè)add操作,它要
確保迭代的順序。
9.為何迭代器沒有一個(gè)方法可以直接獲取下一個(gè)元素,而不
需要移動(dòng)游標(biāo)?
它可以在當(dāng)前Iterator的頂層實(shí)現(xiàn),但是它用得很少,如
果將它加到接口中,每個(gè)繼承都栗去實(shí)現(xiàn)它,這沒有意義。
10.Iterator和ListIterator之間有什么區(qū)別?
(1)我們可以使用Iterator來遍歷Set和List集合,而
ListIterator只能遍歷List。
(2)Iterator只可以向前遍歷,而ListIterator可以雙向
遍歷。
(3)ListIterator從Iterator接口繼承,然后添加了一些
額外的功能,比如添加一個(gè)元素、替換一個(gè)元素、獲取前面或后
面元素的索引位置。
11.遍歷一個(gè)List有哪些不同的方式?
ListstrList=newArrayListOO;
//使用for-each循環(huán)
for(Stringobj:strList){
System,out.println(obj);
}
//usingiterator
Iteratorit=strList.iterator();
whiIe(it.hasNext()){
Stringobj=it.next();
System.out.println(obj);
)
使用迭代器更加線程安全,因?yàn)樗梢源_保,在當(dāng)前遍歷的
集合元素被更改的時(shí)候,它會(huì)拋出
ConcurrentModificationException。
12.通過迭代器fail-fast屬性,你明白了什么?
每次我們嘗試獲取下一個(gè)元素的時(shí)候,IteratorfaiI-fast
屬性檢查當(dāng)前集合結(jié)構(gòu)里的任何改動(dòng)。如果發(fā)現(xiàn)任何改動(dòng),它拋
出ConcurrentModificationExceptionoCo11ection中所有
Iterator的實(shí)現(xiàn)都是按faiI-fast來設(shè)計(jì)的
(ConcurrentHashMap和CopyOnWriteArrayList這類并發(fā)集合類
除外)。
13.faiI-fast與fail-safe有什么區(qū)別?
Iterator的fail-fast屬性與當(dāng)前的集合共同起作用,因
此它不會(huì)受到集合中任何改動(dòng)的影響。
Java,utiI包中的所有集合類都被設(shè)計(jì)為faiI-fast的,而
java.util,concurrent中的集合類都為fail-safe的。
FaiI-fast迭代器拋出ConcurrentModificationException,而
fail-safe迭代器從不拋出
ConcurrentModificationExceptiono
14.在迭代一個(gè)集合的時(shí)候,如何避免
ConcurrentModificationException?
在遍歷一個(gè)集合的時(shí)候,我們可以使用并發(fā)集合類來避免
ConcurrentModificationException,比如使用
CopyOnWriteArrayList,而不是ArrayListo
15.為何Iterator接口沒有具體的實(shí)現(xiàn)?
Iterator接口定義了遍歷集合的方法,但它的實(shí)現(xiàn)則是集
合實(shí)現(xiàn)類的責(zé)任。每個(gè)能夠返回用于遍歷的Iterator的集合類
都有它自己的Iterator實(shí)現(xiàn)內(nèi)部類。
這就允許集合類去選擇迭代器是fail-fast還是fail-safe
的。比如,ArrayList迭代器是fail-fast的,而
CopyOnWriteArrayList迭代器是fail-safe的。
16.UnsupportedOperationException是什么?
UnsupportedOperationException是用于表明操作不支持
的異常。在JDK類中已被大量運(yùn)用,在集合框架
java.utiI.Collections.UnmodifiabIeCo11ection將會(huì)在所有
add和remove操作中拋出這個(gè)異常。
17.在Java中,HashMap是如何工作的?
HashMap在Map.Entry靜態(tài)內(nèi)部類實(shí)現(xiàn)中存儲(chǔ)key-vaIue
對(duì)。
HashMap使用哈希算法,在put和get方法中,它使用
hashCode()和equaIs()方法。當(dāng)我們通過傳遞key-value對(duì)調(diào)
用put方法的時(shí)候,HashMap使用KeyhashCode()和哈希算法來
找出存儲(chǔ)key-vaIue對(duì)的索引。
Entry存儲(chǔ)在LinkedList中,所以如果存在entry,它使用
equals。方法來檢查傳遞的key是否已經(jīng)存在,如果存在,它會(huì)
覆蓋value,如果不存在,它會(huì)創(chuàng)建一個(gè)新的entry然后保存。
當(dāng)我們通過傳遞key調(diào)用get方法時(shí),它再次使用
hashCode()來找到數(shù)組中的索引,然后使用equaIs()方法找出
正確的Entry,然后返回它的值。下面的圖片解釋了詳細(xì)內(nèi)容。
其它關(guān)于HashMap比較重要的問題是容量、負(fù)荷系數(shù)和閥值
調(diào)整。HashMap默認(rèn)的初始容量是32,負(fù)荷系數(shù)是0.75。
閥值是為負(fù)荷系數(shù)乘以容量,無論何時(shí)我們嘗試添加一個(gè)
entry,如果map的大小比閥值大的時(shí)候,HashMap會(huì)對(duì)map的
內(nèi)容進(jìn)行重新哈希,且使用更大的容量。容量總是2的霹,所以
如果你知道你需栗存儲(chǔ)大量的key-vaIue對(duì),比如緩存從數(shù)據(jù)庫
里面拉取的數(shù)據(jù),使用正確的容量和負(fù)荷系數(shù)對(duì)HashMap進(jìn)行初
始化是個(gè)不錯(cuò)的做法。
18.hashCode()和equaIs()方法有何重要性?
HashMap使用Key對(duì)象的hashCode()和equaIs()方法去決
定key-value對(duì)的索引。當(dāng)我們?cè)囍鴱腍ashMap中獲取值的時(shí)候,
這些方法也會(huì)被用到。如果這些方法沒有被正確地實(shí)現(xiàn),在這種
情況下,兩個(gè)不同Key也許會(huì)產(chǎn)生相同的hashCode()和equals。
輸出,HashMap將會(huì)認(rèn)為它們是相同的,然后覆蓋它們,而非把
它們存儲(chǔ)到不同的地方。
同樣的,所有不允許存儲(chǔ)重復(fù)數(shù)據(jù)的集合類都使用
hashCode。和equals。去查找重復(fù),所以正確實(shí)現(xiàn)它們非常重
要。equals。和hashCode()的實(shí)現(xiàn)應(yīng)該遵循以下規(guī)則:
(1)如果o1.equaIs(o2),那么o1.hashCode()=
o2.hashCode()總是為true的。
(2)如果o1.hashCode()==o2.hashCode(),并不意味著
o1.equaIs(o2)會(huì)為true。
19.我們能否使用任何類作為Map的key?
我們可以使用任何類作為Map的key,然而在使用它們之前,
需要考慮以下幾點(diǎn):
(1)如果類重寫了equals。方法,它也應(yīng)該重寫hashCode()
方法。
(2)類的所有實(shí)例需要遵循與equals。和hashCodeO相關(guān)
的規(guī)則。請(qǐng)參考之前提到的這些規(guī)則。
(3)如果一個(gè)類沒有使用equals(),你不應(yīng)該在hashCode()
中使用它。
(4)用戶自定義key類的最佳實(shí)踐是使之為不可變的,這樣,
hashCodeO值可以被緩存起來,擁有更好的性能。不可變的美也
可以確保hashCodeO和equals。在未來不會(huì)改變,這樣就會(huì)解
決與可變相關(guān)的‘問題了。
比如,我有一個(gè)類MyKey,在HashMap中使用它。
//傳遞給MyKey的name參數(shù)被用于equaIs()和hashCode()
中
MyKeykey=newMyKey(fPankaj1);//assume
hashCode=1234
myHashMap.put(key,1Value');
//以下的代碼會(huì)改變key的hashCode()和equaIs()值
key.setName(1Amit1);//assumenewhashCode=7890
//下面會(huì)返回null,因?yàn)镠ashMap會(huì)嘗試查找存儲(chǔ)同樣索
引的key,而key已被改變了,匹配失敗,返回null
myHashMap.get(newMyKey(*Pankaj'));
那就是為何String和Integer被作為HashMap的key大量
使用。
20.Map接口提供了哪些不同的集合視圖?
Map接口提供三個(gè)集合視圖:
(1)Setkeyset():返回map中包含的所有key的一個(gè)Set
視圖。
集合是受map支持的,map的變化會(huì)在集合中反映出來,反
之亦然。當(dāng)一個(gè)迭代器正在遍歷一個(gè)集合時(shí),若map被修改了(除
迭代器自身的移除操作以外),迭代器的結(jié)果會(huì)變?yōu)槲炊x。
集合支持通過Iterator的Remove>Set.remove>removeAII、
retainAII和clear操作進(jìn)行元素移除,從map中移除對(duì)應(yīng)的映
射。它不支持add和addAII操作。
(2)CoIIectionvaIues():返回一個(gè)map中包含的所有
value的一個(gè)CoIlection視圖。
這個(gè)coIlection受map支持的,map的變化會(huì)在coIlection
中反映出來,反之亦然。當(dāng)一個(gè)迭代器正在遍歷一個(gè)co11ection
時(shí),若map被修改了(除迭代器自身的移除操作以外),迭代器的
結(jié)果會(huì)變?yōu)槲炊x。
集合支持通過Iterator的Remove>Set.remove>removeAII>
retainAII和clear操作進(jìn)行元素移除,從map中移除對(duì)應(yīng)的映
射。它不支持add和addAII操作。
(3)Set<map.entry<k,v?entrySet():返回一個(gè)map鐘包
含的所有映射的一個(gè)集合視圖。
這個(gè)集合受map支持的,map的變化會(huì)在coIIection中反
映出來,反之亦然。當(dāng)一個(gè)迭代器正在遍歷一個(gè)集合時(shí),若map
被修改了(除迭代器自身的移除操作,以及對(duì)迭代器返回的
entry進(jìn)行setVaIue外),迭代器的結(jié)果會(huì)變?yōu)槲炊x。
集合支持通過Iterator的Remove>Set.remove>removeAII、
retainAII和clear操作進(jìn)行元素移除,從map中移除對(duì)應(yīng)的映
射。它不支持add和addAII操作。
21.HashMap和HashTabIe有何不同?
(1)HashMap允許key和vaIue為nuII,而HashTabIe不允
許。
(2)HashTabIe是同步的,而HashMap不是。所以HashMap
適合單線程環(huán)境,HashTable適合多線程環(huán)境。
(3)在Java1.4中引入了LinkedHashMap,HashMap的一個(gè)子
類,假如你想要遍歷順序,你很容易從HashMap轉(zhuǎn)向
LinkedHashMap,但是HashTable不是這樣的,它的順序是不可
預(yù)知的。
(4)HashMap提供對(duì)key的Set進(jìn)行遍歷,因此它是
faiI-fast的,但HashTabIe提供對(duì)key的Enumeration進(jìn)行遍
歷,它不支持faiI-fast。
(5)HashTabIe被認(rèn)為是個(gè)遺留的類,如果你尋求在迭代的
時(shí)候修改Map,你應(yīng)該使用CocurrentHashMapo
22.如何決定選用HashMap還是TreeMap?
對(duì)于在Map中括入、刪除和定位元素這類操作,HashMap是
最好的選擇。然而,假如你需要對(duì)一個(gè)有序的key集合進(jìn)行遍歷,
TreeMap是更好的選擇?;谀愕腸ollection的大小,也許向
HashMap中添加元素會(huì)更快,將map換為TreeMap進(jìn)行有序key
的遍歷。
23.ArrayList和Vector有何異同點(diǎn)?
ArrayList和Vector在很多時(shí)候都很類似。
(1)兩者都是基于索引的,內(nèi)部由一個(gè)數(shù)組支持。
(2)兩者維護(hù)插入的順序,我們可以根據(jù)插入順序來獲取元
素。
(3)ArrayList和Vector的迭代器實(shí)現(xiàn)都是fail-fast的。
(4)ArrayList和Vector兩者允許null值,也可以使用索
引值對(duì)元素進(jìn)行隨機(jī)訪問。
以下是ArrayList和Vector的不同點(diǎn)。
(1)Vector是同步的,而ArrayList不是。然而,如果你尋
求在迭代的時(shí)候?qū)α斜磉M(jìn)行改變,你應(yīng)該使用
CopyOnWriteArrayListo
(2)ArrayList比Vector快,它因?yàn)橛型?,不?huì)過載。
(3)ArrayList更加通用,因?yàn)槲覀兛梢允褂肅oIIections
工具類輕易地獲取同步列表和只讀列表。
24.Array和ArrayList有何區(qū)別?什么時(shí)候更適合用Array?
Array可以容納基本類型和對(duì)象,而ArrayList只能容納對(duì)
象。
Array是指定大小的,而ArrayList大小是固定的。
Array沒有提供ArrayList那么多功能,比如addAII、
removeAlI和iterator等。盡管ArrayList明顯是更好的選擇,
但也有些時(shí)候Array比較好用。
(1)如果列表的大小已經(jīng)指定,大部分情況下是存儲(chǔ)和遍歷
它們。
(2)對(duì)于遍歷基本數(shù)據(jù)類型,盡管Collections使用自動(dòng)裝
箱來減輕編碼任務(wù),在指定大小的基本類型的列表上工作也會(huì)變
得很慢。
(3)如果你要使用多維數(shù)組,使用口口比List<list<>>更容
易。
25.ArrayList和LinkedList有何區(qū)別?
ArrayList和LinkedList兩者都實(shí)現(xiàn)了List接口,但是它
們之間有些不同。
(1)ArrayList是由Array所支持的基于一個(gè)索引的數(shù)據(jù)結(jié)
構(gòu),所以它提供對(duì)元素的隨機(jī)訪問,復(fù)雜度為0(1),但
LinkedList存儲(chǔ)一系列的節(jié)點(diǎn)數(shù)據(jù),每個(gè)節(jié)點(diǎn)都與前一個(gè)和下
一個(gè)節(jié)點(diǎn)相連接。所以,盡管有使用索引獲取元素的方法,內(nèi)部
實(shí)現(xiàn)是從起始點(diǎn)開始遍歷,遍歷到索引的節(jié)點(diǎn)然后返回元素,時(shí)
間復(fù)雜度為0(n),比ArrayList要慢。
(2)與ArrayList相比,在LinkedList中插入、添加和刪除
一個(gè)元素會(huì)更快,因?yàn)樵谝粋€(gè)元素被放到中間的時(shí)候,不會(huì)涉及
改變數(shù)組的大小,或更新索引。
(3)LinkedList比ArrayList消耗更多的內(nèi)存,因?yàn)?/p>
LinkedList中的每個(gè)節(jié)點(diǎn)存儲(chǔ)了前后節(jié)點(diǎn)的引用。
26.哪些集合類提供對(duì)元素的隨機(jī)訪問?
ArrayList、HashMap>TreeMap和HashTable類提供對(duì)元素
的隨機(jī)訪問。
27.EnumSet是什么?
java.util.EnumSet是使用枚舉類型的集合實(shí)現(xiàn)。當(dāng)集合創(chuàng)
建時(shí),枚舉集合中的所有元素必須來自單個(gè)指定的枚舉類型,可
以是顯示的或隱示的。EnumSet是不同步的,不允許值為nulI
的元素。它也提供了一些有用的方法,copyOf(Co11ection
c)、of(Efirst,E***rest)^complementOf(EnumSets)0
28.哪些集合類是線程安全的?
Vector>HashTable>Properties和Stack是同步類,所以
它們是線程安全的,可以在多線程環(huán)境下使用。Java1.5并發(fā)API
包括一些集合類,允許迭代時(shí)修改,因?yàn)樗鼈兌脊ぷ髟诩系目?/p>
隆上,所以它們?cè)诙嗑€程環(huán)境中是安全的。
29.并發(fā)集合類是什么?
Javal.5并發(fā)包(java.util,concurrent)包含線程安全集
合類,允許在迭代時(shí)修改集合。迭代器被設(shè)計(jì)為千ail-fast的,
會(huì)拋出ConcurrentModificationException。一部分類為:
CopyOnWriteArrayList、ConcurrentHashMap、
CopyOnWriteArraySet。
30.BlockingQueue是什么?
Java.util.concurrent.BIockingQueue是一個(gè)隊(duì)列,在進(jìn)
行檢索或移除一個(gè)元素的時(shí)候,它會(huì)等待隊(duì)列變?yōu)榉强?;?dāng)在添
加一個(gè)元素時(shí),它會(huì)等待隊(duì)列中的可用空間。
BIockingQueue接口是Java集合框架的一部分,主要用于
實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。我們不需要擔(dān)心等待生產(chǎn)者有可用的
空間,或消費(fèi)者有可用的對(duì)象,因?yàn)樗荚贐lockingQueue的實(shí)
現(xiàn)類中被處理了。
Java提供了集中BlockingQueue的實(shí)現(xiàn),比如
ArrayBIockingQueue、LinkedBIockingQueue、
PriorityBIockingQueue,、SynchronousQueue等。
31.隊(duì)列和棧是什么,列出它們的區(qū)別?
棧和隊(duì)列兩者都被用來預(yù)存儲(chǔ)數(shù)據(jù)。java.util.Queue是一
個(gè)接口,它的實(shí)現(xiàn)類在Java并發(fā)包中。隊(duì)列允許先進(jìn)先出(FIFO)
檢索元素,但并非總是這樣。Deque接口允許從兩端檢索元素。
棧與隊(duì)列很相似,但它允許對(duì)元素進(jìn)行后進(jìn)先出(LIFO)進(jìn)行
檢索。
Stack是一個(gè)擴(kuò)展自Vector的類,而Queue是一個(gè)接口。
32.CoIlections類是什么?
Java,utiLCollections是一個(gè)工具類僅包含靜態(tài)方法,它
們操作或返回集合。它包含操作集合的多態(tài)算法,返回一個(gè)由指
定集合支持的新集合和其它一些內(nèi)容。這個(gè)類包含集合框架算法
的方法,比如折半搜索、排序、混編和逆序等。
33.ComparabIe和Comparator接口是什么?
如果我們想使用Array或CoIIection的排序方法時(shí),需要
在自定義類里實(shí)現(xiàn)Java提供Comparable接口。
Comparable接口有compareTo(TOBJ)方法,它被排序方法
所使用。我們應(yīng)該重寫這個(gè)方法,如果“this”對(duì)象比傳遞的對(duì)
象參數(shù)更小、相等或更大時(shí),它返回一個(gè)負(fù)整數(shù)、?;蛘麛?shù)。
但是,在大多數(shù)實(shí)際情況下,我們想根據(jù)不同參數(shù)進(jìn)行排序O
比如,作為一個(gè)CEO,我想對(duì)雇員基于薪資進(jìn)行排序,一個(gè)
HR想基于年齡對(duì)他們進(jìn)行排序。這就是我們需要使用
Comparator接口的情景,因?yàn)镃omparable.compareTo(Objecto)
方法實(shí)現(xiàn)只能基于一個(gè)字段進(jìn)行排序,我們不能根據(jù)對(duì)象排序的
需要選擇字段。
Comparator接口的compare(Objecto1,Objecto2)方法的
實(shí)現(xiàn)需要傳遞兩個(gè)對(duì)象參數(shù),若第一個(gè)參數(shù)比第二個(gè)小,返回負(fù)
整數(shù);若第一個(gè)等于第二個(gè),返回0;若第一個(gè)比第二個(gè)大,返回
正整數(shù)。
34.Comparable和Comparator接口有何區(qū)別?
Comparable和Comparator接口被用來對(duì)對(duì)象集合或者數(shù)組
進(jìn)行排序。Comparable接口被用來提供對(duì)象的自然排序,我們
可以使用它來提供基于單個(gè)邏輯的排序。
Comparator接口被用來提供不同的排序算法,我們可以選
擇需要使用的Comparator來對(duì)給定的對(duì)象集合進(jìn)行排序。
35.我們?nèi)绾螌?duì)一組對(duì)象進(jìn)行排序?
如果我們需要對(duì)一個(gè)對(duì)象數(shù)組進(jìn)行排序,我們可以使用
Arrays.sort()方法。如果我們需要排序一個(gè)對(duì)象列表,我們可
以使用Co11ection.sort()方法。
兩個(gè)類都有用于自然排序(使用Comparable)或基于標(biāo)準(zhǔn)的
排序(使用Comparator)的重載方法sort()oCoIIections內(nèi)部
使用數(shù)組排序方法,所有它們兩者都有相同的性能,只是
Co11ections需要花時(shí)間將列表轉(zhuǎn)換為數(shù)組。
36.當(dāng)一個(gè)集合被作為參數(shù)傳遞給一個(gè)函數(shù)時(shí),如何才可以
確保函數(shù)不能修改它?
在作為參數(shù)傳遞之前,我們可以使用
CoIlections.unmodifiabIeCo11ection(Co11ectionc)方法創(chuàng)
建一個(gè)只讀集合,這將確保改變集合的任何操作都會(huì)拋出
UnsupportedOperationExceptiono
37.我們?nèi)绾螐慕o定集合那里創(chuàng)建一個(gè)synchronized的集
合?
我們可以使用
CoIlections,synchronizedCoIlection(CoIlectionc)根據(jù)指
定集合來獲取一個(gè)synchronized(線程安全的)集合。
38.集合框架里實(shí)現(xiàn)的通用算法有哪些?
Java集合框架提供常用的算法實(shí)現(xiàn),比如排序和搜索。
Co11ections類包含這些方法實(shí)現(xiàn)。大部分算法是操作List的,
但一部分對(duì)所有類型的集合都是可用的。部分算法有排序、搜索、
混編、最大最小值。
39.大寫的0是什么?舉幾個(gè)例子?
大寫的。描述的是,就數(shù)據(jù)結(jié)構(gòu)中的一系列元素而言,一個(gè)
算法的性能。
Collection類就是實(shí)際的數(shù)據(jù)結(jié)構(gòu),我們通?;跁r(shí)間、
內(nèi)存和性能,使用大寫的0來選擇集合實(shí)現(xiàn)。比如:
例子1:ArrayList的get(indexi)是一個(gè)常量時(shí)間操作,
它不依賴list中元素的數(shù)量。所以它的性能是0(1)。
例子2:一個(gè)對(duì)于數(shù)組或列表的線性搜索的性能是0(n),因
為我們需要遍歷所有的元素來查找需要的元素。
40.與Java集合框架相關(guān)的有哪些最好的實(shí)踐?
(1)根據(jù)需要選擇正確的集合類型。比如,如果指定了大小,
我們會(huì)選用Array而非ArrayListo如果我們想根據(jù)插入順序遍
歷一個(gè)Map,我們需要使用TreeMap。如果我們不想重復(fù),我們
應(yīng)該使用Seto
(2)一些集合類允許指定初始容量,所以如果我們能夠估計(jì)
到存儲(chǔ)元素的數(shù)量,我們可以使用它,就避免了重新哈?;虼笮?/p>
調(diào)整。
(3)基于接口編程,而非基于實(shí)現(xiàn)編程,它允許我們后來輕
易地改變實(shí)現(xiàn)。
(4)總是使用類型安全的泛型,避免在運(yùn)行時(shí)出現(xiàn)
CIassCastException<>
(5)使用JDK提供的不可變類作為Map的key,可以避免自
己實(shí)現(xiàn)hashCode()和equaIs()o
(6)盡可能使用Collections工具類,或者獲取只讀、同步
或空的集合,而非編寫自己的實(shí)現(xiàn)。它將會(huì)提供代碼重用性,它
有著更好的穩(wěn)定性和可維護(hù)性。
Java經(jīng)典面試題及答案2
1.什么是B/S架構(gòu)?什么是C/S架構(gòu)
B/S(Browser/Server),瀏覽器/服務(wù)器程序
C/S(Client/Server),客戶端/服務(wù)端,桌面應(yīng)用程序
2.你所知道網(wǎng)絡(luò)協(xié)議有那些?
HTTP:超文本傳輸協(xié)議
FTP:文件傳輸協(xié)議
SMPT:簡(jiǎn)單郵件協(xié)議
TELNET:遠(yuǎn)程終端協(xié)議
POP3:郵件讀取協(xié)議
3.Java都有那些開發(fā)平臺(tái)?
JAVASE:主要用在客戶端開發(fā)
JAVAEE:主要用在web應(yīng)用程序開發(fā)
JAVAME:主要用在嵌入式應(yīng)用程序開發(fā)
4?什么是JVM?java虛擬機(jī)包括什么?
JVM:java虛擬機(jī),運(yùn)用硬件或軟件手段實(shí)現(xiàn)的虛擬的計(jì)算機(jī),
Java虛擬機(jī)包括:寄存器,堆棧,處理器
5.Java是否需要開發(fā)人員回收內(nèi)存垃圾嗎?
大多情況下是不需要的。Java提供了一個(gè)系統(tǒng)級(jí)的線程來跟蹤
內(nèi)存分配,不再使用的內(nèi)存區(qū)將會(huì)自動(dòng)回收
6?什么是JDK?什么是JRE?
JDK:javadevelopmentkit:java開發(fā)工具包,是開發(fā)人員所
需要安裝的環(huán)境
JRE:javaruntimeenvironment:java運(yùn)行環(huán)境,java程序運(yùn)
行所需要安裝的環(huán)境
7.什么是數(shù)據(jù)結(jié)構(gòu)?
計(jì)算機(jī)保存,組織數(shù)據(jù)的方式
8.Java的數(shù)據(jù)結(jié)構(gòu)有那些?
線性表(ArrayList)
鏈表(LinkedList)
棧(Stack)
隊(duì)列(Queue)
圖(Map)
樹(Tree)
9?什么是OOP?
面向?qū)ο缶幊?/p>
10.什么是面向?qū)ο螅?/p>
世間萬物都可以看成一個(gè)對(duì)象。每個(gè)物體包括動(dòng)態(tài)的行為和靜態(tài)
的屬性,這些就構(gòu)成了一個(gè)對(duì)象。
11.類與對(duì)象的關(guān)系?
類是對(duì)象的抽象,對(duì)象是類的具體,類是對(duì)象的模板,對(duì)象是類
的實(shí)例
12.Java中有幾種數(shù)據(jù)類型
整形:byte,short,int,long
浮點(diǎn)型:float,double
字符型:char
布爾型:booIean
13.什么是隱式轉(zhuǎn)換,什么是顯式轉(zhuǎn)換
顯示轉(zhuǎn)換就是類型強(qiáng)轉(zhuǎn),把一個(gè)大類型的數(shù)據(jù)強(qiáng)制賦值給小類型
的數(shù)據(jù);隱式轉(zhuǎn)換就是大范圍的變量能夠接受小范圍的數(shù)據(jù);隱
式轉(zhuǎn)換和顯式轉(zhuǎn)換其實(shí)就是自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。
14.Char類型能不能轉(zhuǎn)成int類型?能不能轉(zhuǎn)化成string類型,
能不能轉(zhuǎn)成doubIe類型
Char在java中也是比較特殊的類型,它的int值從1開始,一
共有2的16次方個(gè)數(shù)據(jù);Char<int<Iong<fIoat<doubIe;Char
類型可以隱式轉(zhuǎn)成int,double類型,但是不能隱式轉(zhuǎn)換成
string;如果char類型轉(zhuǎn)成byte,short類型的時(shí)候,需要強(qiáng)
轉(zhuǎn)。
15,什么是拆裝箱?
拆箱:把包裝類型轉(zhuǎn)成基本數(shù)據(jù)類型
裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)成包裝類型
16.Java中的包裝類都是那些?
byte:Byteshort:Shortint:Integerlong:LongfIoat:
Floatdouble:DoubIechar:CharacterbooIean:BooIean
17.一個(gè)java類中包含那些內(nèi)容?
屬性、方法、內(nèi)部類、構(gòu)造方法、代碼塊。
18.例如:if(a+1.0=4.0),這樣做好嗎?
不好,因?yàn)橛?jì)算機(jī)在浮點(diǎn)型數(shù)據(jù)運(yùn)算的時(shí)候,會(huì)有誤差,盡量在
布爾表達(dá)式中不使用浮點(diǎn)型數(shù)據(jù)(if,while,switch中判斷條件
不使用浮點(diǎn)型)
19.那針對(duì)浮點(diǎn)型數(shù)據(jù)運(yùn)算出現(xiàn)的誤差的問題,你怎么解決?
使用Bigdecimal類進(jìn)行浮點(diǎn)型數(shù)據(jù)的運(yùn)算
20.++i與i++的區(qū)別
++i:先賦值,后計(jì)算
i++:先計(jì)算,后賦值
21.程序的結(jié)構(gòu)有那些?
順序結(jié)構(gòu)
選擇結(jié)構(gòu)
循環(huán)結(jié)構(gòu)
22.數(shù)組實(shí)例化有幾種方式?
靜態(tài)實(shí)例化:創(chuàng)建數(shù)組的時(shí)候已經(jīng)指定數(shù)組中的元素,
1int[]
a=newint[]{1,3,3}
動(dòng)態(tài)實(shí)例化:實(shí)例化數(shù)組的時(shí)候,只指定了數(shù)組程度,數(shù)組中所
有元素都是數(shù)組類型的默認(rèn)值
23.Java中各種數(shù)據(jù)默認(rèn)值
Byte,short,int,Iong默認(rèn)是都是OBoolean默認(rèn)值是faIse
Char類型的默認(rèn)值是''
Float與double類型的默認(rèn)是0.0
對(duì)象類型的默認(rèn)值是null
24.Java常用包有那些?
Java.lang
Java,io
Java.sqI
Java.utiI
Java.awt
Java,net
Java,math
25.Java最頂級(jí)的父類是哪個(gè)?
Object
26.Object類常用方法有那些?
EquaIs
Hashcode
toString
wait
notify
clone
getClass
27.java中有沒有指針?
有指針,但是隱藏了,開發(fā)人員無法直接操作指針,由jvm來操
作指針
28.java中是值傳遞引用傳遞?
理論上說,java都是引用傳遞,對(duì)于基本數(shù)據(jù)類型,傳遞是值
的副本,而不是值本身。對(duì)于對(duì)象類型,傳遞是對(duì)象的引用,當(dāng)
在一個(gè)方法操作操作參數(shù)的時(shí)候,其實(shí)操作的是引用所指向的對(duì)
象。
29.假設(shè)把實(shí)例化的數(shù)組的變量當(dāng)成方法參數(shù),當(dāng)方法執(zhí)行的時(shí)
候改變了數(shù)組內(nèi)的元素,那么在方法外,數(shù)組元素有發(fā)生改變
嗎?
改變了,因?yàn)閭鬟f是對(duì)象的引用,操作的是引用所指向的對(duì)象
30.實(shí)例化數(shù)組后,能不能改變數(shù)組長(zhǎng)度呢?
不能,數(shù)組一旦實(shí)例化,它的長(zhǎng)度就是固定的
31.假設(shè)數(shù)組內(nèi)有5個(gè)元素,如果對(duì)數(shù)組進(jìn)行反序,該如何做?
創(chuàng)建一個(gè)新數(shù)組,從后到前循環(huán)遍歷每個(gè)元素,將取出的元素依
次順序放入新數(shù)組中
32.形參與實(shí)參
形參:全稱為“形式參數(shù)”,是在定義方法名和方法體的時(shí)候使
用的參數(shù),用于接收調(diào)用該方法時(shí)傳入的實(shí)際值;實(shí)參:全稱為
“實(shí)際參數(shù)”,是在調(diào)用方法時(shí)傳遞給該方法的實(shí)際值。
33.構(gòu)造方法能不能顯式調(diào)用?
不能構(gòu)造方法當(dāng)成普通方法調(diào)用,只有在創(chuàng)建對(duì)象的時(shí)候它才會(huì)
被系統(tǒng)調(diào)用
34.構(gòu)造方法能不能重寫?能不能重載?
可以重寫,也可以重載
35.什么是方法重載?
方法的重載就是在同一個(gè)類中允許同時(shí)存在一個(gè)以上的同名方
法,只要它們的參數(shù)個(gè)數(shù)或者類型不同即可。在這種情況下,該
方法就叫被重載了,這個(gè)過程稱為方法的重載(override)
36.內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別?
靜態(tài)內(nèi)部類相對(duì)與外部類是獨(dú)立存在的,在靜態(tài)內(nèi)部類中無法直
接訪問外部類中變量、方法。如果要訪問的話,必須要new一個(gè)
外部類的對(duì)象,使用new出來的對(duì)象來訪問。但是可以直接訪問
靜態(tài)的變量、調(diào)用靜態(tài)的方法;
普通內(nèi)部類作為外部類一個(gè)成員而存在,在普通內(nèi)部類中可以直
接訪問外部類屬性,調(diào)用外部類的方法。
如果外部類要訪問內(nèi)部類的屬性或者調(diào)用內(nèi)部類的方法,必須要
創(chuàng)建一個(gè)內(nèi)部類的對(duì)象,使用該對(duì)象訪問屬性或者調(diào)用方法。
如果其他的類要訪問普通內(nèi)部類的屬性或者調(diào)用普通內(nèi)部類的
方法,必須要在外部類中創(chuàng)建一個(gè)普通內(nèi)部類的對(duì)象作為一個(gè)屬
性,外同類可以通過該屬性調(diào)用普通內(nèi)部類的方法或者訪問普通
內(nèi)部類的屬性
如果其他的類要訪問靜態(tài)內(nèi)部類的屬性或者調(diào)用靜態(tài)內(nèi)部類的
方法,直接創(chuàng)建一個(gè)靜態(tài)內(nèi)部類對(duì)象即可。
37.Static關(guān)鍵字有什么作用?
Static可以修飾內(nèi)部類、方法、變量、代碼塊
Static修飾的類是靜態(tài)內(nèi)部類
Static修飾的方法是靜態(tài)方法,表示該方法屬于當(dāng)前類的,而
不屬于某個(gè)對(duì)象的,靜態(tài)方法也不能被重寫,可以直接使用類名
來調(diào)用。在static方法中不能使用this或者super關(guān)鍵字。
Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實(shí)
例所共享,不會(huì)依賴于對(duì)象。靜態(tài)變量在內(nèi)存中只有一份拷貝,
在JVM加載類的時(shí)候,只為岸態(tài)分配一次內(nèi)存。
Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來做程序優(yōu)化的。
靜態(tài)代碼塊中的代碼在整個(gè)類加載的時(shí)候只會(huì)執(zhí)行一次。靜態(tài)代
碼塊可以有多個(gè),如果有多個(gè),按照先后順序依次執(zhí)行。
38.Final在java中的作用
Final可以修飾類,修飾方法,修飾變量。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變量叫常量,常量必須初始化,一旦初始化后,常量的值
不能發(fā)生改變。
39.Java中操作字符串使用哪個(gè)類?
String,StringBuffer,StringBuiIder
40.StringBuffer,StringbuiIder有什么區(qū)別?
StringBuffer與StringBuiIder都繼承了
AbstractStringBuIder類,而AbtractStringBuiIder又實(shí)現(xiàn)了
CharSequence接口,兩個(gè)類都是用來進(jìn)行字符串操作的。
在做字符串拼接修改刪除替換時(shí),效率比string更高。
StringBuffer是線程安全的,StringbuiIder是非線程安全的。
所以StringbuiIder比stringbuffer效率更高,StringBuffer
的方法大多都加了synchronized關(guān)鍵字
41.Stringstr=waaa",與Stringstr=newString("aaa”)
一樣嗎?
不一樣的。因?yàn)閮?nèi)存分配的方式不一樣。
第一種,創(chuàng)建的“aaa”是常量,jvm都將其分配在常量池中。
第二種創(chuàng)建的是一個(gè)對(duì)象,jvm將其值分配在堆內(nèi)存中。
42.Stringstr=waaw,Strings="bb”,Stringaa=aa+s;-
種創(chuàng)速了幾個(gè)對(duì)象?
一共有兩個(gè)引用,三個(gè)對(duì)象。因?yàn)椤癮a"與“bb”都是常量,常
量的值不能改變,當(dāng)執(zhí)行字符串拼接時(shí)候,會(huì)創(chuàng)建一個(gè)新的常量
是“aabbb”,有將其存到常量池中。
43.將下java中的math類有那些常用方法?
Pow():瓶運(yùn)算
SqrtO:平方根
Round():四舍五入
Abs():求絕對(duì)值
Random():生成一個(gè)0T的隨機(jī)數(shù),包括0不包括1
44.String類的常用方法有那些?
charAt:返回指定索引處的字符
indexOf():返回指定字符的索引
replace():字符串替換
trimO:去除字符串兩端空白
splitO:分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組
getBytes():返回字符串的byte類型數(shù)組
Iength():返回字符串長(zhǎng)度
toLowerCaseO:將字符串轉(zhuǎn)成小寫字母
toUpperCaseO:將字符串轉(zhuǎn)成大寫字符
substring():截取字符串
format():格式化字符串
equaIs():字符串比較
45.判斷兩個(gè)對(duì)象是否相同,能使用equlas比較嗎?
不能。EquIas大多用來做字符串比較,要判斷基本數(shù)據(jù)類型或
者對(duì)象類型,需要使用二
46.=與equIas有什么區(qū)別?
二可以判斷基本數(shù)據(jù)類型值是否相等,也可以判斷兩個(gè)對(duì)象指向
的內(nèi)存地址是否相同,也就是說判斷兩個(gè)對(duì)象是否是同一個(gè)對(duì)
象,Equlas通常用來做字符串比較。
47.如何將字符串反轉(zhuǎn)?
StringbuiIder或者stringbuffer的reverse方法
48.面向?qū)ο蟮恼Z言有那些特征?
封裝、繼承、多態(tài)
49.Java中的繼承是單繼承還是多繼承
Java中既有單繼承,又有多繼承。對(duì)于java類來說只能有一個(gè)
父類,對(duì)于接口來說可以同時(shí)繼承多個(gè)接口
50.什么是重寫?什么是重載?
重載和重寫都是java多態(tài)的表現(xiàn)。
重載叫override,在同一個(gè)類中多態(tài)的表現(xiàn)。當(dāng)一個(gè)類中出現(xiàn)
了多個(gè)相同名稱的方法,但參數(shù)個(gè)數(shù)和參數(shù)類型不同,方法重載
與返回值無關(guān)
重寫叫overwrite,是字符類中多態(tài)的表現(xiàn)。當(dāng)子類出現(xiàn)與父類
相同的方法,那么這就是方法重寫。方法重寫時(shí),子類的返回值
必須與父類的一致。如果父類方法拋出一個(gè)異常,子類重寫的方
法拋出的異常類型不能小于父類拋出的異常類型。
51.構(gòu)造方法能不能重載?能不能重寫?
可以重載,必須重寫
52.如果父類只有有參構(gòu)造方法,那么子類必須要重寫父類的構(gòu)
造方法嗎?
必須重寫
53.創(chuàng)建一個(gè)子類對(duì)象的時(shí)候,那么父類的構(gòu)造方法會(huì)執(zhí)行嗎?
會(huì)執(zhí)行。當(dāng)創(chuàng)建一個(gè)子類對(duì)象,調(diào)用子類構(gòu)造方法的時(shí)候,子類
構(gòu)造方法會(huì)默認(rèn)調(diào)用父類的構(gòu)造方法。
54.什么是父類引用指向子類對(duì)象?
是java多態(tài)一種特殊的表現(xiàn)形式。創(chuàng)建父類引用,讓該引用指
向一個(gè)子類的對(duì)象
55.當(dāng)父類引用指向子類對(duì)象的時(shí)候,子類重寫了父類方法和屬
性,那么當(dāng)訪問屬性的時(shí)候,訪問是誰的屬性?調(diào)用方法時(shí),調(diào)
用的是誰的方法?
子類重寫了父類方法和屬性,訪問的是父類的屬性,調(diào)用的是子
類的方法
56.Super與this表示什么?
Super表示當(dāng)前類的父類對(duì)象
This表示當(dāng)前類的對(duì)象
57.抽象的關(guān)鍵字是什么?
Abstract
58.抽象類必須要有抽象方法嗎
不是必須。抽象類可以沒有抽象方法。
59.如果一個(gè)類中有抽象方法,那么這個(gè)一定是抽象類?
包含抽象方法的類一定是抽象類
60.抽象類可以使用final修飾嗎?
不可以。定義抽象類就是讓其他繼承的,而final修飾類表示該
類不能被繼承,與抽象類的理念違背了
61.普通類與抽象類有什么區(qū)別?
普通類不能包含抽象方法,抽象類可以包含抽象方法
抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化
62.什么是接口?
接口就是某個(gè)事物對(duì)外提供的一些功能的聲明,是一種特殊的
java類
63.JAVA為什么需要接口?
接口彌補(bǔ)了Java單繼承的缺點(diǎn)
64.接口有什么特點(diǎn)?
接口中聲明全是publicstaticfinal修飾的常量
接口中所有方法都是抽象方法
接口是沒有構(gòu)造方法的
接口也不能直接實(shí)例化
接口可以多繼承
65.接口與抽象類有什么區(qū)別?
抽象類有構(gòu)造方法,接口沒有構(gòu)造方法
抽象類只能單繼承,接口可以多繼承
抽象類可以有普通方法,接口中的所有方法都是抽象方法
接口的屬性都是publicstaticfinal修飾的,而抽象的不是
66.Java中異常分為哪兩種?
編譯時(shí)異常
運(yùn)行時(shí)異常
67.說幾個(gè)常見的編譯時(shí)異常類?
NulIPointerException:空指針異常
ArrayIndexOutOfBoundsException:數(shù)組下標(biāo)越界
NumberFormatException:數(shù)字轉(zhuǎn)換異常
IIlegalArgumentException:參數(shù)不匹配異常
InstantiationException:對(duì)象初始化異常
ArithmeticException:算術(shù)異常
68.異常的處理機(jī)制有幾種?
異常捕捉:try…catch…finally,異常拋出:throws?
69.如何自定義一個(gè)異常
繼承一個(gè)異常類,通常是RumtimeException或者Exception
70.在異常捕捉時(shí),如果發(fā)生異常,那么try.catch.finally塊
外的return語句會(huì)執(zhí)行嗎?
會(huì)執(zhí)行,如果有finally,在finally之后被執(zhí)行,如果沒有
finally,在catch之后被執(zhí)行
71.Try.catch,finally是必須要存在的嗎?
Try塊必須存在,catch和finally可以不存在,但不能同時(shí)不
存在
72.Thow與thorws區(qū)別
Throw寫在代碼塊內(nèi),throw后面跟的是一個(gè)具體的異常實(shí)例
Throw寫在方法前面后面,throws后面跟的是異常類,異常類可
以出現(xiàn)多個(gè)
73.Error與Exception區(qū)別?
Error和Exception都是java錯(cuò)誤處理機(jī)制的一部分,都繼承
TThrowable類。
Exception表示的異常,異常可以通過程序來捕捉,或者優(yōu)化程
序來避免。
Error表示的是系統(tǒng)錯(cuò)誤,不能通過程序來進(jìn)行錯(cuò)誤處理。
74.使用Log4j對(duì)程序有影響嗎?
有,Iog4j是用來日志記錄的,記錄一些關(guān)鍵敏感的信息,通常
會(huì)將日志記錄到本地文件或者數(shù)據(jù)庫中。記錄在本地文件中,會(huì)
有頻繁的i。操作,會(huì)耗費(fèi)一些系統(tǒng)資源。記錄在數(shù)據(jù)庫中,會(huì)
頻繁地操作數(shù)據(jù)庫表,對(duì)系統(tǒng)性能也有一定的影響。但是為了程
序安全以及數(shù)據(jù)的恢復(fù)或者bug的跟蹤,這點(diǎn)資源消耗是可以承
受的。
75.Log4j日志有幾個(gè)級(jí)別?
由低到高:debug、info、wran、error
76.除了使用new創(chuàng)建對(duì)象之外,還可以用什么方法創(chuàng)建對(duì)象?
Java反射
77.Java反射創(chuàng)建對(duì)象效率高還是通過new創(chuàng)建對(duì)象的效率高?
通過new創(chuàng)建對(duì)象的效率比較高。通過反射時(shí),先找查找類資源,
使用類加載器創(chuàng)建,過程比較繁瑣,所以效率較低
78.Java中集合框架的有幾個(gè)?
Coillection、Mapo
79.Co11ection接口下有那些集合框架?
List:線性表、Set:無序集合。
80.List接口有什么特點(diǎn)?
順序存儲(chǔ)、可以有重復(fù)值。
81.Set接口有什么特點(diǎn)
無須存儲(chǔ)、不能有重復(fù)值。
82.ArrayList與LinkedList有什么區(qū)別?
ArrayList與LinkedList都實(shí)現(xiàn)了List接口。
ArrayList是線性表,底層是使用數(shù)組實(shí)現(xiàn)的,它在尾端插入和
訪問數(shù)據(jù)時(shí)效率較高,
Linked是雙向鏈表,他在中間插入或者頭部插入時(shí)效率較高,
在訪問數(shù)據(jù)時(shí)效率較低
83.Array與ArrayList有什么不一樣?
Array與ArrayList都是用來存儲(chǔ)數(shù)據(jù)的集合。ArrayList底層
是使用數(shù)組實(shí)現(xiàn)的,但是arrayList對(duì)數(shù)組進(jìn)行了封裝和功能擴(kuò)
展,擁有許多原生數(shù)組沒有的一些功能。我們可以理解成
ArrayList是Array的一個(gè)升級(jí)版。
84.Map有什么特點(diǎn)
以鍵值對(duì)存儲(chǔ)數(shù)據(jù)
元素存儲(chǔ)循序是無須的
不允許出現(xiàn)重復(fù)鍵
85.JDBC操作的步驟
加載數(shù)據(jù)庫驅(qū)動(dòng)類
打開數(shù)據(jù)庫連接
執(zhí)行sql語句
處理返回結(jié)果
關(guān)閉資源
86.在使用jdbc的時(shí)候,如何防止出現(xiàn)sql注入的問題。
使用PreparedStatement類,而不是使用Statement類
87.怎么在JDBC內(nèi)調(diào)用一個(gè)存儲(chǔ)過程
使用CalIabIeStatement
88.是否了解連接池,使用連接池有什么好處?
數(shù)據(jù)庫連接是非常消耗資源的,影響到程序的性能指標(biāo)。連接池
是用來分配、管理、釋放數(shù)據(jù)庫連接的,可以使應(yīng)用程序重復(fù)使
用同一個(gè)數(shù)據(jù)庫連接,而不是每次都創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接。
通過釋放空閑時(shí)間較長(zhǎng)的數(shù)據(jù)庫連接避免數(shù)據(jù)庫因?yàn)閯?chuàng)建太多
的連接而造成的連接遺漏問題,提高了程序性能。
89.你所了解的數(shù)據(jù)源技術(shù)有那些?使用數(shù)據(jù)源有什么好處?
Dbcp,c3p0等,用的最多還是c3p0,因?yàn)閏3p0比dbcp更加穩(wěn)定,
安全;通過配置文件的形式來維護(hù)數(shù)據(jù)庫信息,而不是通過硬編
碼。當(dāng)連接的數(shù)據(jù)庫信息發(fā)生改變時(shí),不需要再更改程序代碼就
實(shí)現(xiàn)了數(shù)據(jù)庫信息的更新。
90.Java的io流分為哪兩種?
按功能來分
輸入流(input),輸出流(output)
按類型來分
字節(jié)流,字符流
91.常用io類有那些?
File
FileinputSteam,FiIeOutputStream
BufferInputStream,BufferedOutputSream
PrintWrite
FiIeReader,FileWriter
BufferReader,BufferedWriter
ObjectInputStream,ObjectOutputSream
92.字節(jié)流與字符流的區(qū)別
以字節(jié)為單位輸入輸出數(shù)據(jù),字節(jié)流按照8位傳輸
以字符為單位輸入輸出數(shù)據(jù),字符流按照16位傳輸
93.final>finalize。、finally
性質(zhì)不同
final為關(guān)鍵字:
finalize()為方法;
finally為區(qū)塊標(biāo)志,用于try語句中;
作用
final為用于標(biāo)識(shí)常量的關(guān)鍵字,final標(biāo)識(shí)的關(guān)鍵字存儲(chǔ)在常
量池中(在這里final常量的具體用法將在下面進(jìn)行介紹);
finalize。方法在Object中進(jìn)行了定義,用于在對(duì)象“消失”
時(shí),由JVM進(jìn)行調(diào)用用于對(duì)對(duì)象進(jìn)行垃圾回收,類似于C++中的
析構(gòu)函數(shù);用戶自定義時(shí),用于釋放對(duì)象占用的資源(比如進(jìn)行
I/O操作);
finally{}用于標(biāo)識(shí)代碼塊,與try()進(jìn)行配合,不論try中的
代碼執(zhí)行完或沒有執(zhí)行完(這里指有異常),該代碼塊之中的程
序必定會(huì)進(jìn)行;
94.抽象類和接口的區(qū)別?
抽象類:
抽象方法,只有行為的概念,沒有具體的行為實(shí)現(xiàn)。使用
abstract關(guān)鍵字修飾,沒有方法體。子類必須重寫這些抽象方
法。
包含抽象方法的類,一定是抽象類。
抽象類只能被繼承,一個(gè)類只能繼承一個(gè)抽象類。
接口:
全部的方法都是抽象方法,屬型都是常量
不能實(shí)例化,可以定義變量。
接口變量可以引用具體實(shí)現(xiàn)類的實(shí)例
接口只能被實(shí)現(xiàn),一個(gè)具體類實(shí)現(xiàn)接口,必須實(shí)現(xiàn)全部的抽象方
法
接口之間可以多實(shí)現(xiàn)
一個(gè)具體類可以實(shí)現(xiàn)多個(gè)接口,實(shí)現(xiàn)多繼承現(xiàn)象
95.線程同步的方法
wait。:讓線程等待。將線程存儲(chǔ)到一個(gè)線程池中。
notify():喚醒被等待的線程。通常都喚醒線程池中的第一個(gè)。
讓被喚醒的線程處于臨時(shí)阻塞狀態(tài)。
notifyAHO:?jiǎn)拘阉械牡却€程。將線程池中的所有線程都
喚醒。
96.線程與進(jìn)程的區(qū)別
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,線程是CPU
調(diào)度和分派的基本單位
進(jìn)程和線程的關(guān)系:
一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至
少有一個(gè)線程。
資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
線程在執(zhí)行過程中,需要協(xié)作同步。不同進(jìn)程的線程間要利用消
息通信的辦法實(shí)現(xiàn)同步。
線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體。
線程與進(jìn)程的區(qū)別:
調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基
本單位。
并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之
間也可以并發(fā)執(zhí)行。
擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資
源,但可以訪問隸屬于進(jìn)程的資源。
系統(tǒng)開銷:在創(chuàng)建或撤銷進(jìn)程的時(shí)候,由于系統(tǒng)都要為之分配和
回收資源,導(dǎo)致系統(tǒng)的明顯大于創(chuàng)建或撤銷線程時(shí)的開銷。但進(jìn)
程有獨(dú)立的地址空間,進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他的
進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同的執(zhí)行路徑。線程
有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一
個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程
的程序健壯,但是在進(jìn)程切換時(shí),耗費(fèi)的資源較大,效率要差些。
97.&和&&的區(qū)別
&是位運(yùn)算符。&&是布爾邏輯運(yùn)算符,在進(jìn)行邏輯判斷時(shí)用&處理
的前面為false后面的內(nèi)容仍需處理,用&&處理的前面為false
不再處理后面的內(nèi)容。
98.重載與重寫
Overload為重載,Override為重寫方法的重寫和重載是Java
多態(tài)性的不同表現(xiàn)。重寫是父類與子類之間多態(tài)性的一種表現(xiàn),
重載是一個(gè)類中多態(tài)性的一種表現(xiàn)。
如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說
該方法被重寫(Override)o子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)
用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。
如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)
數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overload)。
重載的方法是可以改變返回值的類型。
99.如果對(duì)象的引用被置為null,垃圾收集器是否會(huì)立即釋放對(duì)
象占用的內(nèi)存?
不會(huì),在下一個(gè)垃圾回收周期中,這個(gè)對(duì)象將是可被回收的。
100.串行(serial)收集器和吞吐量(throughput)收集器的區(qū)別
是什么?
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等規(guī)
模和大規(guī)模數(shù)據(jù)的應(yīng)用程序。而串行收集器對(duì)大多數(shù)的小應(yīng)用
(在現(xiàn)代處理器上需要大概100M左右的內(nèi)存)就足夠了。
Java經(jīng)典面試題及答案3
1、作用域public,private,protected,以及不寫時(shí)的區(qū)別
答:區(qū)別如下:
作用域當(dāng)刖類同一package子孫類其他package
publicV7VV
protectedVVVX
friendlyV7xX
privateVXXX
不寫時(shí)默認(rèn)為friendly嫡黑那
2、AnonymousInnerClass(匿名內(nèi)部類)是否可以
extends(繼承)其它類,是否可以implements(實(shí)
現(xiàn))interface(接口)
答:匿名的內(nèi)部類是沒有名字的內(nèi)部類。不能extends(繼
承)其它類,但一個(gè)內(nèi)部類可以作為一個(gè)接口,由另一個(gè)內(nèi)部類
實(shí)現(xiàn)
3、StaticNestedClass和InnerClass的不同
答:NestedClass(一般是C++的說法),InnerClass(一
般是JAVA的說法)。Java內(nèi)部類與C++嵌套類最大的不同就在于
是否有指向外部的引用上。注:靜態(tài)內(nèi)部類(InnerClass)意
味著1創(chuàng)建一個(gè)static內(nèi)部類的對(duì)象,不需要一個(gè)外部類對(duì)象,
2不能從一個(gè)static內(nèi)部類的一個(gè)對(duì)象訪問一個(gè)外部類對(duì)象
4、&和&&的區(qū)別
答:&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表
示邏輯與(and)
5、CoIIection和Collections的區(qū)別
答:Collection是集合類的上級(jí)接口,繼承與他的接口主
要有Set和List.Collections是針對(duì)集合類的一個(gè)幫助類,他
提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化
等操作
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年校園食堂特色攤位租賃及食品安全監(jiān)督合同3篇
- 2025年上半年遵義市桐梓縣交通運(yùn)輸局下屬事業(yè)單位招考易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年遼源市西安區(qū)人民法院西安區(qū)人民檢察院招考文職人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年遼寧遼陽市事業(yè)單位公開招聘工作人員前重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年遼寧大連市事業(yè)單位招考857名人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年贛州市石城縣工業(yè)和信息化局招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年貴州黔西南興仁市馬馬崖鎮(zhèn)人民政府招聘9人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年貴州黔東南州榕江縣塔石鄉(xiāng)人民政府招聘駕駛員1人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年礦產(chǎn)資源使用權(quán)轉(zhuǎn)讓及礦業(yè)權(quán)合作開發(fā)合同3篇
- 2025年上半年貴州省黔西南州第九屆線上線下人才博覽會(huì)興義市引進(jìn)高層次急需緊缺人才240人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 領(lǐng)導(dǎo)溝通的藝術(shù)
- 發(fā)生用藥錯(cuò)誤應(yīng)急預(yù)案
- 南潯至臨安公路(南潯至練市段)公路工程環(huán)境影響報(bào)告
- 綠色貸款培訓(xùn)課件
- 大學(xué)生預(yù)征對(duì)象登記表(樣表)
- 主管部門審核意見三篇
- 初中數(shù)學(xué)校本教材(完整版)
- 父母教育方式對(duì)幼兒社會(huì)性發(fā)展影響的研究
- 新課標(biāo)人教版數(shù)學(xué)三年級(jí)上冊(cè)第八單元《分?jǐn)?shù)的初步認(rèn)識(shí)》教材解讀
- (人教版2019)數(shù)學(xué)必修第一冊(cè) 第三章 函數(shù)的概念與性質(zhì) 復(fù)習(xí)課件
- 重慶市銅梁區(qū)2024屆數(shù)學(xué)八上期末檢測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論