




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