
java
程序員面試寶典
map,t,list,
等
JAVA
中集合解析
(
了解
)
Postedon2008-06-2517:32JavaSuns
閱讀
(1391)
評論
(0)
編輯收藏
在
JAVA
的
util
包中有兩個所有集合的父接口
Collection
和
Map,
它們的父子關系:
+Collection
這個接口
extends
自
--le
接口
+List
接口
-ArrayList
類
-LinkedList
類
-Vector
類此類是實現(xiàn)同步的
+Queue
接口
+
不常用,在此不表
.
+Set
接口
+SortedSet
接口
-TreeSet
類
-HashSet
+Map
接口
-HashMap
類
(
除了不同步和允許使用
null
鍵
/
值之外
,
與
Hashtable
大致相同
.)
-Hashtable
類此類是實現(xiàn)同步的
,
不允許使用
null
鍵值
+SortedMap
接口
-TreeMap
類
以下對眾多接口和類的簡單說明:首先不能不先說一下數(shù)組(
Array
)
一、
Array
,
Arrays
Java
所有
“
存儲及隨機訪問一連串對象
”
的做法,
array
是最有效率的一種。
1
、
效率高,但容量固定且無法動態(tài)改變。
array
還有一個缺點是,無法判斷其中實際存有多少元素,
length
只是告訴我們
array
的容量。
2
、
Java
中有一個
Arrays
類,專門用來操作
array
。
arrays
中擁有一組
static
函數(shù),
equals()
:比較兩個
array
是否相等。
array
擁有相同元素個數(shù),且所有對應元素兩兩相等。
fill()
:將值填入
array
中。
sort()
:用來對
array
進行排序。
binarySearch()
:在排好序的
array
中尋找元素。
opy()
:
array
的復制。
二、
Collection
,
Map
若撰寫程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類
庫,
array
不適用。
1
、
Collection
和
Map
的區(qū)別
容器內(nèi)每個為之所存儲的元素個數(shù)不同。
Collection
類型者,每個位置只有一個元素。
Map
類型者,持有
key-valuepair
,像個小型數(shù)據(jù)庫。
2
、
Java2
容器類類庫的用途是
“
保存對象
”
,它分為兩類,各自旗下的子類關系
Collection
--List
:將以特定次序存儲元素。所以取出來的順序可能和放入順序不同。
--ArrayList/LinkedList/Vector
--Set
:不能含有重復的元素
--HashSet/TreeSet
Map
--HashMap
--HashTable
Page1
java
程序員面試寶典
--TreeMap
Map----
一組成對的
“
鍵值對
”
對象,即其元素是成對的對象,最典型的應用就是數(shù)據(jù)字典,并
且還有其它廣泛的應用。另外,
Map
可以返回其所有鍵組成的
Set
和其所有值組成的
Collection
,
或其鍵值對組成的
Set
,并且還可以像數(shù)組一樣擴展多維
Map
,只要讓
Map
中鍵值對的每個
“
值
”
是
一個
Map
即可。
Collection
下
1.
迭代器
迭代器是一種設計模式,它是一個對象,它可以遍歷并選擇序列中的對象,而開發(fā)人員不需
要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為
“
輕量級
”
對象,因為創(chuàng)建它的代價小。
Java
中的
Iterator
功能比較簡單,并且只能單向移動:
(1)
使用方法
iterator()
要求容器返回一個
Iterator
。第一次調(diào)用
Iterator
的
next()
方法
時,它返回序列的第一個元素。注意:
iterator()
方法是
le
接口
,
被
Collection
繼承。
(2)
使用
next()
獲得序列中的下一個元素。
(3)
使用
hasNext()
檢查序列中是否還有元素。
(4)
使用
remove()
將迭代器新返回的元素刪除。
Iterator
是
Java
迭代器最簡單的實現(xiàn),為
List
設計的
ListIterator
具有更多的功能,它可以
從兩個方向遍歷
List
,也可以從
List
中插入和刪除元素。
的功能方法
List(interface):
次序是
List
最重要的特點;它確保維護元素特定的順序。
List
為
Collection
添加了許多方法,使得能夠向
List
中間插入與移除元素
(
只推薦
LinkedList
使用
)
。一
個
List
可以生成
ListIterator
,使用它可以從兩個方向遍歷
List
,也可以從
List
中間插入和刪除
元素。
ArrayList:
由數(shù)組實現(xiàn)的
List
。它允許對元素進行快速隨機訪問,但是向
List
中間插入與
移除元素的速度很慢。
ListIterator
只應該用來由后向前遍歷
ArrayList
,而不是用來插入和刪
除元素,因為這比
LinkedList
開銷要大很多。
LinkedList:
由列表實現(xiàn)的
List
。對順序訪問進行了優(yōu)化,向
List
中間插入與刪除得開銷不
大,隨機訪問則相對較慢
(
可用
ArrayList
代替
)
。它具有方法
addFirst()
、
addLast()
、
getFirst()
、
getLast()
、
removeFirst()
、
removeLast()
,這些方法
(
沒有在任何接口或基類中
定義過
)
使得
LinkedList
可以當作堆棧、隊列和雙向隊列使用。
的功能方法
Set(interface):
存入
Set
的每個元素必須是唯一的,這也是與
List
不同的,因為
Set
不保存
重復元素。加入
Set
的
Object
必須定義
equals()
方法以確保對象的唯一性。
Set
與
Collection
有完
全一樣的接口。
Set
接口不保證維護元素的次序。
HashSet:HashSet
能快速定位一個元素,存入
HashSet
的對象必須定義
hashCode()
。
TreeSet:
保持次序的
Set
,底層為樹結(jié)構(gòu)。使用它可以從
Set
中提取有序的序列。
LinkedHashSet:
具有
HashSet
的查詢速度,且內(nèi)部使用鏈表維護元素的順序
(
插入的次序
)
。
于是在使用迭代器遍歷
Set
時,結(jié)果會按元素插入的次序顯示。
HashSet
采用散列函數(shù)對元素進行排序,這是專門為快速查詢而設計的;
TreeSet
采用紅黑樹
的數(shù)據(jù)結(jié)構(gòu)進行排序元素;
LinkedHashSet
內(nèi)部使用散列以加快查詢速度,同時使用鏈表維護元
素的次序,使得看起來元素是以插入的順序保存的。需要注意的是,生成自己的類時,
Set
需要
維護元素的存儲順序,因此要實現(xiàn)
Comparable
接口并定義
compareTo()
方法。
3
、其他特征
Page2
java
程序員面試寶典
*List
,
Set
,
Map
將持有對象一律視為
Object
型別。
*Collection
、
List
、
Set
、
Map
都是接口,不能實例化。
繼承自它們的
ArrayList,Vector,HashTable,HashMap
是具象
class
,這些才可被實例
化。
*vector
容器確切知道它所持有的對象隸屬什么型別。
vector
不進行邊界檢查。
三、
Collections
Collections
是針對集合類的一個幫助類。提供了一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排
序、線程完全化等操作。
相當于對
Array
進行類似操作的類
——Arrays
。
如,
(Collectioncoll);
取
coll
中最大的元素。
(Listlist);
對
list
中元素排序
四、如何選擇?
1
、容器類和
Array
的區(qū)別、擇取
*
容器類僅能持有對象引用(指向?qū)ο蟮闹羔槪?,而不是將對象信?/p>
copy
一份至數(shù)列
某位置。
*
一旦將對象置入容器內(nèi),便損失了該對象的型別信息。
2
、
*
在各種
Lists
中,最好的做法是以
ArrayList
作為缺省選擇。當插入、刪除頻繁時,
使用
LinkedList()
;
Vector
總是比
ArrayList
慢,所以要盡量避免使用。
*
在各種
Sets
中,
HashSet
通常優(yōu)于
HashTree
(插入、查找)。只有當需要產(chǎn)生一個經(jīng)
過排序的序列,才用
TreeSet
。
HashTree
存在的唯一理由:能夠維護其內(nèi)元素的排序狀態(tài)。
*
在各種
Maps
中
HashMap
用于快速查找。
*
當元素個數(shù)固定,用
Array
,因為
Array
效率是最高的。
結(jié)論:最常用的是
ArrayList
,
HashSet
,
HashMap
,
Array
。而且,我們也會發(fā)現(xiàn)一個規(guī)律,用
TreeXXX
都是排序的。
注意:
1
、
Collection
沒有
get()
方法來取得某個元素。只能通過
iterator()
遍歷元素。
2
、
Set
和
Collection
擁有一模一樣的接口。
3
、
List
,可以通過
get()
方法來一次取出一個元素。使用數(shù)字來選擇一堆對象中的一個,
get(0)...
。
(add/get)
4
、一般使用
ArrayList
。用
LinkedList
構(gòu)造堆棧
stack
、隊列
queue
。
5
、
Map
用
put(k,v)/get(k)
,還可以使用
containsKey()/containsValue()
來檢查其中是否含
有某個
key/value
。
HashMap
會利用對象的
hashCode
來快速找到
key
。
*hashing
哈希碼就是將對象的信息經(jīng)過一些轉(zhuǎn)變形成一個獨一無二的
int
值,這個值存儲在一
個
array
中。
我們都知道所有存儲結(jié)構(gòu)中,
array
查找速度是最快的。所以,可以加速查找。
發(fā)生碰撞時,讓
array
指向多個
values
。即,數(shù)組每個位置上又生成一個梿表。
6
、
Map
中元素,可以將
key
序列、
value
序列單獨抽取出來。
使用
keySet()
抽取
key
序列,將
map
中的所有
keys
生成一個
Set
。
使用
values()
抽取
value
序列,將
map
中的所有
values
生成一個
Collection
。
為什么一個生成
Set
,一個生成
Collection
?那是因為,
key
總是獨一無二的,
value
允許重復。
Page3
java
程序員面試寶典
===List
接口對
Collection
進行了簡單的擴充,它的具體實現(xiàn)類常用的有
ArrayList
和
LinkedList
。你可以將任何東西放到一個
List
容器中,并在需要時從中取出。
ArrayList
從其命名中可以看
出它是一種類似數(shù)組的形式進行存儲,因此它的隨機訪問速度極快,而
LinkedList
的內(nèi)部實現(xiàn)是
鏈表,它適合于在鏈表中間需要頻繁進行插入和刪除操作。在具體應用時可以根據(jù)需要自由選
擇。前面說的
Iterator
只能對容器進行向前遍歷,而
ListIterator
則繼承了
Iterator
的思想,并
提供了對
List
進行雙向遍歷的方法。
Set
接口也是
Collection
的一種擴展,而與
List
不同的時,在
Set
中的對象元素不能重復,也就是
說你不能把同樣的東西兩次放入同一個
Set
容器中。它的常用具體實現(xiàn)有
HashSet
和
TreeSet
類。
HashSet
能快速定位一個元素,但是你放到
HashSet
中的對象需要實現(xiàn)
hashCode()
方法,它使用了
前面說過的哈希碼的算法。而
TreeSet
則將放入其中的元素按序存放,這就要求你放入其中的對
象是可排序的,這就用到了集合框架提供的另外兩個實用類
Comparable
和
Comparator
。一個類是
可排序的,它就應該實現(xiàn)
Comparable
接口。有時多個類具有相同的排序算法,那就不需要在每分
別重復定義相同的排序算法,只要實現(xiàn)
Comparator
接口即可。集合框架中還有兩個很實用的公用
類:
Collections
和
Arrays
。
Collections
提供了對一個
Collection
容器進行諸如排序、復制、查
找和填充等一些非常有用的方法,
Arrays
則是對一個數(shù)組進行類似的操作。
Map
是一種把鍵對象和值對象進行關聯(lián)的容器,而一個值對象又可以是一個
Map
,依次類推,這樣
就可形成一個多級映射。對于鍵對象來說,像
Set
一樣,一個
Map
容器中的鍵對象不允許重復,這
是為了保持查找結(jié)果的一致性
;
如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象
時就有問題了,可能你得到的并不是你想的那個值對象,結(jié)果會造成混亂,所以鍵的唯一性很重
要,也是符合集合的性質(zhì)的。當然在使用過程中,某個鍵所對應的值對象可能會發(fā)生變化,這時
會按照最后一次修改的值對象與鍵對應。對于值對象則沒有唯一性的要求。你可以將任意多個鍵
都映射到一個值對象上,這不會發(fā)生任何問題(不過對你的使用卻可能會造成不便,你不知道你
得到的到底是那一個鍵所對應的值對象)。
Map
有兩種比較常用的實現(xiàn):
HashMap
和
TreeMap
。
HashMap
也用到了哈希碼的算法,以便快速查找一個鍵,
TreeMap
則是對鍵按序存放,因此它便有
一些擴展的方法,比如
firstKey(),lastKey()
等,你還可以從
TreeMap
中指定一個范圍以取得其
子
Map
。鍵和值的關聯(lián)很簡單,用
pub(Objectkey,Objectvalue)
方法即可將一個鍵與一個值對
象相關聯(lián)。用
get(Objectkey)
可得到與此
key
對象所對應的值對象。
1.
抽象:
抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方
面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個
方面,一是過程抽象,二是數(shù)據(jù)抽象。
2.
繼承:
繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方
法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,
新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類
那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。
3.
封裝:
封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥嬎闶加谶@個
基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的
接口訪問其他對象。
3
、
int
和
Integer
有什么區(qū)別
Java
提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類
型)。
Int
是
java
的原始數(shù)據(jù)類型,
Integer
是
java
為
int
提供的封裝類。
Java
為每個原始類型提
供了封裝類。原始類型封裝類
booleanBooleancharCharacterbyteByteshortShort
intIntegerlongLongfloatFloatdoubleDouble
引用類型和原始類型的行為完全不同,并且它
們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,
這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的
缺省值。對象引用實例變量的缺省值為
null
,而原始類型實例變量的缺省值與它們的類型有
關。
4
、
String
和
StringBuffer
的區(qū)別
JAVA
平臺提供了兩個類:
String
和
StringBuffer
,它們可以
儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個
String
類提供了數(shù)值不可改變的字符串。
而這個
StringBuffer
類提供的字符串進行修改。當你知道字符數(shù)據(jù)要改變的時候你就可以使用
StringBuffer
。典型地,你可以使用
StringBuffers
來動態(tài)構(gòu)造字符數(shù)據(jù)。
Page4
java
程序員面試寶典
5
、運行時異常與一般異常有何異同?異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時
異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。
java
編譯器要求方法必須
聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
6
、說出
Servlet
的生命周期,并說出
Servlet
和
CGI
的區(qū)別。
Servlet
被服務器實例化后,容器運
行其
init
方法,請求到達時運行其
rvice
方法,
rvice
方法自動派遣運行與請求對應的
doXXX
方法(
doGet
,
doPost
)等,當服務器決定將實例銷毀的時候調(diào)用其
destroy
方法。與
cgi
的區(qū)別
在于
rvlet
處于服務器進程中,它通過多線程方式運行其
rvice
方法,一個實例可以服務于多
個請求,并且其實例一般不會銷毀,而
CGI
對每個請求都產(chǎn)生新的進程,服務完成后就銷毀,所
以效率上低于
rvlet
。
7
、說出
ArrayList,Vector,LinkedList
的存儲性能和特性
ArrayList
和
Vector
都是使用數(shù)組方
式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索
引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,
Vector
由于使用了
synchronized
方法(線程安全),通常性能上較
ArrayList
差,而
LinkedList
使用雙
向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的
前后項即可,所以插入速度較快。
8
、
EJB
是基于哪些技術(shù)實現(xiàn)的?并說出
SessionBean
和
EntityBean
的區(qū)別,
StatefulBean
和
StatelessBean
的區(qū)別。
EJB
包括
SessionBean
、
EntityBean
、
MessageDrivenBean
,基
于
JNDI
、
RMI
、
JAT
等技術(shù)實現(xiàn)。
SessionBean
在
J2EE
應用程序中被用來完成一些服務器端的業(yè)務
操作,例如訪問數(shù)據(jù)庫、調(diào)用其他
EJB
組件。
EntityBean
被用來代表應用系統(tǒng)中用到的數(shù)據(jù)。對
于客戶機,
SessionBean
是一種非持久性對象,它實現(xiàn)某些在服務器上運行的業(yè)務邏輯。對于客
戶機,
EntityBean
是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或
是一個由現(xiàn)有企業(yè)應用程序?qū)崿F(xiàn)的實體。
SessionBean
還可以再細分為
StatefulSession
Bean
與
StatelessSessionBean
,這兩種的
SessionBean
都可以將系統(tǒng)邏輯放在
method
之
中執(zhí)行,不同的是
StatefulSessionBean
可以記錄呼叫者的狀態(tài),因此通常來說,一個使用
者會有一個相對應的
StatefulSessionBean
的實體。
StatelessSessionBean
雖然也是邏輯
組件,但是他卻不負責記錄使用者狀態(tài),也就是說當使用者呼叫
StatelessSessionBean
的時
候,
EJBContainer
并不會找尋特定的
StatelessSessionBean
的實體來執(zhí)行這個
method
。
換言之,很可能數(shù)個使用者在執(zhí)行某個
StatelessSessionBean
的
methods
時,會是同一個
Bean
的
Instance
在執(zhí)行。從內(nèi)存方面來看,
StatefulSessionBean
與
StatelessSession
Bean
比較,
StatefulSessionBean
會消耗
J2EEServer
較多的內(nèi)存,然而
Stateful
SessionBean
的優(yōu)勢卻在于他可以維持使用者的狀態(tài)。
9
、
Collection
和
Collections
的區(qū)別。
Collection
是集合類的上級接口,繼承與他的接口主
要有
Set
和
tions
是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種
集合的搜索、排序、線程安全化等操作。
10
、
&
和
&&
的區(qū)別。
&
是位運算符,表示按位與運算,
&&
是邏輯運算符,表示邏輯與(
and
)。
11
、
HashMap
和
Hashtable
的區(qū)別。
HashMap
是
Hashtable
的輕量級實現(xiàn)(非線程安全的實現(xiàn)),
他們都完成了
Map
接口,主要區(qū)別在于
HashMap
允許空(
null
)鍵值(
key
)
,
由于非線程安全,效
率上可能高于
Hashtable
。
HashMap
允許將
null
作為一個
entry
的
key
或者
value
,而
Hashtable
不
允許。
HashMap
把
Hashtable
的
contains
方法去掉了,改成
containsvalue
和
containsKey
。因為
contains
方法容易讓人引起誤解。
Hashtable
繼承自
Dictionary
類,而
HashMap
是
Java1.2
引進的
Mapinterface
的一個實現(xiàn)。最大的不同是,
Hashtable
的方法是
Synchronize
的,而
HashMap
不
是,在多個線程訪問
Hashtable
時,不需要自己為它的方法實現(xiàn)同步,而
HashMap
就必須為之提
供外同步。
Hashtable
和
HashMap
采用的
hash/rehash
算法都大概一樣,所以性能不會有很大的差
異。
12
、
final,finally,finalize
的區(qū)別。
final
用于聲明屬性,方法和類,分別表示屬性不可
變,方法不可覆蓋,類不可繼承。
finally
是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize
是
Object
類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆
蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
13
、
sleep()
和
wait()
有什么區(qū)別
?sleep
是線程類(
Thread
)的方法,導致此線程暫停執(zhí)行
指定時間,給執(zhí)行機會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復。調(diào)用
sleep
不
會釋放對象鎖。
wait
是
Object
類的方法,對此對象調(diào)用
wait
方法導致本線程放棄對象鎖,進入等
待此對象的等待鎖定池,只有針對此對象發(fā)出
notify
方法(或
notifyAll
)后本線程才進入對象
鎖定池準備獲得對象鎖進入運行狀態(tài)。
14
、
Overload
和
Override
的區(qū)別。
Overloaded
的方法是否可以改變返回值的類型
?
方法的重寫
Page5
java
程序員面試寶典
Overriding
和重載
Overloading
是
Java
多態(tài)性的不同表現(xiàn)。重寫
Overriding
是父類與子類之間多
態(tài)性的一種表現(xiàn),重載
Overloading
是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與
其父類有相同的名稱和參數(shù),我們說該方法被重寫
(Overriding)
。子類的對象使用這個方法
時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被
“
屏蔽
”
了。如果在一個類中定義了多
個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載
(Overloading)
。
Overloaded
的方法是可以改變返回值的類型。
15
、
error
和
exception
有什么區(qū)別
?error
表示恢復不是不可能但很困難的情況下的一種嚴重問
題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。
exception
表示一種設計或?qū)崿F(xiàn)問
題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。
16
、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。如果數(shù)據(jù)將在線程間共享。
例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程寫過
了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進行同步存取。當應用程序在對象上調(diào)用了一個需要花費
很長時間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情
況下采用異步途徑往往更有效率。
17
、
abstractclass
和
interface
有什么區(qū)別
?
聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(
abstractclass
),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該
類中實現(xiàn)該類的情況。不能創(chuàng)建
abstract
類的實例。然而可以創(chuàng)建一個變量,其類型是一個抽
象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。
Abstract
類的
子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)
該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法。接口(
interface
)是抽象類的變體。
在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都
是抽象的,沒有一個有程序體。接口只可以定義
staticfinal
成員變量。接口的實現(xiàn)與子類相
似,除了該實現(xiàn)類不能從接口定義中繼承行為。當類實現(xiàn)特殊接口時,它定義(即將程序體給
予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由
于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到
接口類型或從接口類型轉(zhuǎn)換,
instanceof
運算符可以用來決定某對象的類是否實現(xiàn)了接口。
18
、
heap
和
stack
有什么區(qū)別。棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。
棧按照后進先出的方式進行處理。堆是棧的一個組成元素
19
、
forward
和
redirect
的區(qū)別
forward
是服務器請求資源,服務器直接訪問目標地址的
URL
,把
那個
URL
的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務器發(fā)送的
內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect
就是服務端根據(jù)邏輯
,
發(fā)送一
個狀態(tài)碼
,
告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請
求,所以
ssion,request
參數(shù)都可以獲取。
20
、
EJB
與
JAVABEAN
的區(qū)別?
JavaBean
是可復用的組件,對
JavaBean
并沒有嚴格的規(guī)范,理
論上講,任何一個
Java
類都可以是一個
Bean
。但通常情況下,由于
JavaBean
是被容器所創(chuàng)建(
如
Tomcat
)的,所以
JavaBean
應具有一個無參的構(gòu)造器,另外,通常
JavaBean
還要實現(xiàn)
Serializable
接口用于實現(xiàn)
Bean
的持久性。
JavaBean
實際上相當于微軟
COM
模型中的本地進程內(nèi)
COM
組件,它是不能被跨進程訪問的。
EnterpriJavaBean
相當于
DCOM
,即分布式組件。它是
基于
Java
的遠程方法調(diào)用(
RMI
)技術(shù)的,所以
EJB
可以被遠程訪問(跨進程、跨計算機)。但
EJB
必須被布署在諸如
Webspere
、
WebLogic
這樣的容器中,
EJB
客戶從不直接訪問真正的
EJB
組
件,而是通過其容器訪問。
EJB
容器是
EJB
組件的代理,
EJB
組件由容器所創(chuàng)建和管理??蛻敉ㄟ^
容器來訪問真正的
EJB
組件。
21
、
StaticNestedClass
和
InnerClass
的不同。
StaticNestedClass
是被聲明為靜態(tài)(
static
)的內(nèi)部類,它可以不依賴于外部類實例被實例化。而通常的內(nèi)部類需要在外部類實例化
后才能實例化。
22
、
JSP
中動態(tài)
INCLUDE
與靜態(tài)
INCLUDE
的區(qū)別?動態(tài)
INCLUDE
用
jsp:include
動作實現(xiàn)
它總是會檢查所含文件中的變化,適合用
于包含動態(tài)頁面,并且可以帶參數(shù)。靜態(tài)
INCLUDE
用
include
偽碼實現(xiàn)
,
定不會檢查所含文件的變
化,適用于包含靜態(tài)頁面
<%@includefile=""%>
23
、什么時候用
asrt
。
asrtion(
斷言
)
在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言
中都支持這種機制。在實現(xiàn)中,
asrtion
就是在程序中的一條語句,它對一個
boolean
表達式進
行檢查,一個正確程序必須保證這個
boolean
表達式的值為
true
;如果該值為
fal
,說明程序已
經(jīng)處于不正確的狀態(tài)下,系統(tǒng)將給出警告或退出。一般來說,
asrtion
用于保證程序最基本、
關鍵的正確性。
asrtion
檢查通常在開發(fā)和測試時開啟。為了提高性能,在軟件發(fā)布后,
Page6
java
程序員面試寶典
asrtion
檢查通常是關閉的。
24
、
GC
是什么
?
為什么要有
GC?GC
是垃圾收集的意思(
GabageCollection
)
,
內(nèi)存處理是編程人
員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,
Java
提
供的
GC
功能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的,
Java
語言沒有提供
釋放已分配內(nèi)存的顯示操作方法。
25
、
shorts1=1;s1=s1+1;
有什么錯
?shorts1=1;s1+=1;
有什么錯
?shorts1=
1;s1=s1+1;
(
s1+1
運算結(jié)果是
int
型,需要強制轉(zhuǎn)換類型)
shorts1=1;s1+=1;
(可
以正確編譯)
26
、
(11.5)
等於多少
?(-11.5)
等於多少
?(11.5)==12
(-11.5)==-11round
方法返回與參數(shù)最接近的長整數(shù),參數(shù)加
1/2
后求其
floor.
27
、
Strings=newString("xyz");
創(chuàng)建了幾個
StringObject?
兩個
28
、設計
4
個線程,其中兩個線程每次對
j
增加
1
,另外兩個線程對
j
每次減少
1
。寫出程序。以下
程序使用內(nèi)部類實現(xiàn)線程,對
j
增減的時候沒有考慮順序問題。
publicclass
ThreadTest1{privateintj;publicstaticvoidmain(Stringargs[]){ThreadTest1
tt=newThreadTest1();Incinc=();Decdec=();for(int
i=0;i<2;i++){Threadt=newThread(inc);();t=newThread(dec);();}}
privatesynchronizedvoidinc(){j++;
n(tThread().getName()+"-inc:"+j);}private
synchronizedvoiddec(){j--;
n(tThread().getName()+"-dec:"+j);}classInc
implementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){inc();}}}class
DecimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){dec();}}}}
29
、
Java
有沒有
goto?java
中的保留字,現(xiàn)在沒有在
java
中使用。
30
、啟動一個線程是用
run()
還是
start()?
啟動一個線程是調(diào)用
start()
方法,使線程所代表的虛
擬處理機處于可運行狀態(tài),這意味著它可以由
JVM
調(diào)度并執(zhí)行。這并不意味著線程就會立即運
行。
run()
方法可以產(chǎn)生必須退出的標志來停止一個線程。
31
、
EJB
包括(
SessionBean,EntityBean
)說出他們的生命周期,及如何管理事務的?
SessionBean
:
StatelessSessionBean
的生命周期是由容器決定的,當客戶機發(fā)出請求要建立
一個
Bean
的實例時,
EJB
容器不一定要創(chuàng)建一個新的
Bean
的實例供客戶機調(diào)用,而是隨便找一個
現(xiàn)有的實例提供給客戶機。當客戶機第一次調(diào)用一個
StatefulSessionBean
時,容器必須立即
在服務器中創(chuàng)建一個新的
Bean
實例,并關聯(lián)到客戶機上,以后此客戶機調(diào)用
StatefulSession
Bean
的方法時容器會把調(diào)用分派到與此客戶機相關聯(lián)的
Bean
實例。
EntityBean
:
EntityBeans
能存活相對較長的時間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫中的數(shù)據(jù)存在,
Entitybeans
就一直存
活。而不是按照應用程序或者服務進程來說的。即使
EJB
容器崩潰了,
Entitybeans
也是存活
的。
EntityBeans
生命周期能夠被容器或者
Beans
自己管理。
EJB
通過以下技術(shù)管理實務:對象
管理組織(
OMG
)的對象實務服務(
OTS
),
SunMicrosystems
的
TransactionService
(
JTS
)、
JavaTransactionAPI
(
JTA
),開發(fā)組(
X/Open
)的
XA
接口。
32
、應用服務器有那些?
BEAWebLogicServer
,
IBMWebSphereApplicationServer
,
Oracle9iApplicationServer
,
jBoss
,
Tomcat
33
、給我一個你最常見到的
runtimeexception
。
ArithmeticException,
ArrayStoreException,BufferOverflowException,BufferUnderflowException,
CannotRedoException,CannotUndoException,ClassCastException,CMMException,
ConcurrentModificationException,DOMException,EmptyStackException,
IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,
IllegalStateException,ImagingOpException,IndexOutOfBoundsException,
MissingResourceException,NegativeArraySizeException,NoSuchElementException,
NullPointerException,ProfileDataException,ProviderException,
RasterFormatException,SecurityException,SystemException,
UndeclaredThrowableException,UnmodifiableSetException,
UnsupportedOperationException
34
、接口是否可繼承接口
?
抽象類是否可實現(xiàn)
(implements)
接口
?
抽象類是否可繼承實體類
(concreteclass)?
接口可以繼承接口。抽象類可以實現(xiàn)
(implements)
接口,抽象類是否可繼承
Page7
java
程序員面試寶典
實體類,但前提是實體類必須有明確的構(gòu)造函數(shù)。
35
、
List,Set,Map
是否繼承自
Collection
接口
?List
,
Set
是,
Map
不是
36
、說出數(shù)據(jù)連接池的工作機制是什么
?J2EE
服務器啟動時會建立一定數(shù)量的池連接,并一直維
持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時,池驅(qū)動程序會返回一個未使用的池連接并將
其表記為忙。如果當前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配
置參數(shù)決定。當使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使
用這個連接。
37
、
abstract
的
method
是否可同時是
static,
是否可同時是
native
,是否可同時是
synchronized?
都不能
38
、數(shù)組有沒有
length()
這個方法
?String
有沒有
length()
這個方法?數(shù)組沒有
length()
這個方
法,有
length
的屬性。
String
有有
length()
這個方法。
39
、
Set
里的元素是不能重復的,那么用什么方法來區(qū)分重復與否呢
?
是用
==
還是
equals()?
它
們有何區(qū)別
?Set
里的元素是不能重復的,那么用
iterator()
方法來區(qū)分重復與否。
equals()
是
判讀兩個
Set
是否相等。
equals()
和
==
方法決定引用值是否指向同一對象
equals()
在類中被覆
蓋,為的是當兩個分離的對象的內(nèi)容和類型相配的話,返回真值。
40
、構(gòu)造器
Constructor
是否可被
override?
構(gòu)造器
Constructor
不能被繼承,因此不能重寫
Overriding
,但可以被重載
Overloading
。
41
、是否可以繼承
String
類
?String
類是
final
類故不可以繼承。
42
、
swtich
是否能作用在
byte
上,是否能作用在
long
上,是否能作用在
String
上
?switch
(
expr1
)中,
expr1
是一個整數(shù)表達式。因此傳遞給
switch
和
ca
語句的參數(shù)應該是
int
、
short
、
char
或者
byte
。
long,string
都不能作用于
swtich
。
43
、
try{}
里有一個
return
語句,那么緊跟在這個
try
后的
finally{}
里的
code
會不會被執(zhí)行,
什么時候被執(zhí)行,在
return
前還是后
?
會執(zhí)行,在
return
前執(zhí)行。
44
、編程題
:
用最有效率的方法算出
2
乘以
8
等於幾
?2<<3
45
、兩個對象值相同
((y)==true)
,但卻可有不同的
hashcode
,這句話對不對
?
不
對,有相同的
hashcode
。
46
、當一個對象被當作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后
的結(jié)果,那么這里到底是值傳遞還是引用傳遞
?
是值傳遞。
Java
編程語言只有值傳遞參數(shù)。當
一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象的內(nèi)容可以
在被調(diào)用的方法中改變,但對象的引用是永遠不會改變的。
47
、當一個線程進入一個對象的一個
synchronized
方法后,其它線程是否可進入此對象的其它方
法
?
不能,一個對象的一個
synchronized
方法只能由一個線程訪問。
48
、編程題
:
寫一個
Singleton
出來。
Singleton
模式主要作用是保證在
Java
應用程序中,一個
類
Class
只有一個實例存在。一般
Singleton
模式通常有幾種種形式
:
第一種形式
:
定義一個類,
它的構(gòu)造函數(shù)為
private
的,它有一個
static
的
private
的該類變量,在類初始化時實例話,通過
一個
public
的
getInstance
方法獲取對它的引用
,
繼而調(diào)用其中的方法。
publicclassSingleton
{privateSingleton(){}privatestaticSingletoninstance=newSingleton();public
staticSingletongetInstance(){returninstance;
}}
第二種形式
:publicclass
Singleton{privatestaticSingletoninstance=null;publicstaticsynchronized
SingletongetInstance(){
if(instance==null)
instance
=
newSingleton();return
instance;
}}
其他形式
:
定義一個類,它的構(gòu)造函數(shù)為
private
的,所有方法為
static
的。一般認為第一種形式要更加安全些
49
、
Java
的接口和
C++
的虛類的相同和不同處。由于
Java
不支持多繼承,而有可能某個類或?qū)ο?/p>
要使用分別在幾個類或?qū)ο罄锩娴姆椒ɑ驅(qū)傩裕F(xiàn)有的單繼承機制就不能滿足要求。與繼承相
比,接口有更高的靈活性,因為接口中沒有任何實現(xiàn)代碼。當一個類實現(xiàn)了接口以后,該類要實
現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認狀態(tài)下面都是
publicstatic,
所有方
法默認情況下是
public.
一個類可以實現(xiàn)多個接口。
Page8
java
程序員面試寶典
50
、
Java
中的異常處理機制的簡單原理和應用。當
JAVA
程序違反了
JAVA
的語義規(guī)則時,
JAVA
虛擬
機就會將發(fā)生的錯誤表示為一個異常。違反語義規(guī)則包括
2
種情況。一種是
JAVA
類庫內(nèi)置的語義
檢查。例如數(shù)組下標越界
,
會引發(fā)
IndexOutOfBoundsException;
訪問
null
的對象時會引發(fā)
NullPointerException
。另一種情況就是
JAVA
允許程序員擴展這種語義檢查,程序員可以創(chuàng)建自
己的異常,并自由選擇在何時用
throw
關鍵字引發(fā)異常。所有的異常都是
le
的
子類。
51
、垃圾回收的優(yōu)點和原理。并考慮
2
種回收機制。
Java
語言中一個顯著的特點就是引入了垃圾
回收機制,使
c++
程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得
Java
程序員在編寫程序的時
候不再需要考慮內(nèi)存管理。由于有個垃圾回收機制,
Java
中的對象不再有
“
作用域
”
的概念,只有
對象的引用才有
“
作用域
”
。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃
圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內(nèi)存堆中已經(jīng)死亡的或
者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調(diào)用垃圾回收器對某個對象或所有
對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收
本文檔由
A5
下載
收集整理,版權(quán)歸原作者所有。
A5
下載提供海量源碼,軟件,素材,教程文檔下載。
如果您恰好喜歡打籃球,請登錄
購買正品低價的斯伯丁籃球
Page9
本文發(fā)布于:2023-03-05 00:46:46,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167794840611447.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:java面試寶典.doc
本文 PDF 下載地址:java面試寶典.pdf
| 留言與評論(共有 0 條評論) |