- 相關(guān)推薦
java面試問題及答案
JAVA經(jīng)典面試題及參考答案
1、作用域public,private,protected,以及不寫時的區(qū)別
答:區(qū)別如下:
作用域 當(dāng)前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不寫時默認(rèn)為friendly
2、ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別
答:就ArrayList與Vector主要從二方面來說.
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長為原來一培,而ArrayList卻是原來的一半
就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value
3、char型變量中能不能存貯一個中文漢字?為什么?
答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節(jié),所以放一個中文是沒問題的
4、多線程有幾種實現(xiàn)方法,都是什么?同步有幾種實現(xiàn)方法,都是什么?
答:多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口
同步的實現(xiàn)方面有兩種,分別是synchronized,wait與notify
JAVA經(jīng)典面試題及參考答案
1)transient和volatile是java關(guān)鍵字嗎?(瞬聯(lián))
如果用transient聲明一個實例變量,當(dāng)對象存儲時,它的值不需要維持。例如:
class T
{
transient int a; //不需要維持
int b; //需要維持
}
這里,如果T類的一個對象寫入一個持久的存儲區(qū)域,a的內(nèi)容不被保存,但b的將被保存。
volatile修飾符告訴編譯器被volatile修飾的變量可以被程序的其他部分改變。在多線程程序中,有時兩個或更多的線程共享一個相同的實例變量。考慮效率問題,每個線程可以自己保存該共享變量的私有拷貝。實際的變量副本在不同的時候更新,如當(dāng)進入synchronized方法時。 用strictfp修飾類或方法,可以確保浮點運算(以及所有切斷)正如早期的Java版本那樣準(zhǔn)確。切斷只影響某些操作的指數(shù)。當(dāng)一個類被strictfp修飾,所有的方法自動被strictfp修飾。
strictfp的意思是FP-strict,也就是說精確浮點的意思。在Java虛擬機進行浮點運算時,如果沒有指定strictfp關(guān)鍵字時,Java的編譯器以及運行環(huán)境在對浮點運算的表達式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結(jié)果往往無法令你滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那么所聲明的范圍內(nèi)Java的編譯器以及運行環(huán)境會完全依照浮點規(guī)范IEEE-754來執(zhí)行。因此如果你想讓你的浮點運算更加精確,而且不會因為不同的硬件平臺所執(zhí)行的結(jié)果不一致的話,那就請用關(guān)鍵字strictfp。
你可以將一個類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構(gòu)造函數(shù)聲明strictfp關(guān)鍵字,例如下面的代碼:
strictfp interface A {}
public strictfp class FpDemo1 {
strictfp void f() {}
}
2. 錯誤的使用方法
interface A {
strictfp void f();
}
public class FpDemo2 {
strictfp FpDemo2() {}
}
一旦使用了關(guān)鍵字strictfp來聲明某個類、接口或者方法時,那么在這個關(guān)鍵字所聲明的范圍內(nèi)所有浮點運算都是精確的,符合IEEE-754規(guī)范
的。例如一個類被聲明為strictfp,那么該類中所有的方法都是strictfp的。
2)抽象類和接口有什么區(qū)別?(瞬聯(lián))
1.abstract class 在 Java 語言中表示的是一種繼承關(guān)系,一個類只能使用一次繼承關(guān)系。但是,一個類卻可以實現(xiàn)多個interface。
2.在abstract class 中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final的,不過在 interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。
3.abstract class和interface所反映出的設(shè)計理念不同。其實abstract class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。
4.實現(xiàn)抽象類和接口的類必須實現(xiàn)其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現(xiàn)方法。
5.接口中定義的變量默認(rèn)是public static final 型,且必須給其初值,所以實現(xiàn)類中不能重新定義,也不能改變其值。
6.抽象類中的變量默認(rèn)是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。
7.接口中的方法默認(rèn)都是 public,abstract 類型的。
3)能說一下java的反射(reflection)機制嗎?(瞬聯(lián))
開放性和原因連接(causally-connected)是反射系統(tǒng)的兩大基本要素
4)在java中怎樣實現(xiàn)多線程?(瞬聯(lián))
extends Thread
implement Runnable
方法一:繼承 Thread 類,覆蓋方法 run(),我們在創(chuàng)建的 Thread 類的子類中重寫 run() ,加入線程所要執(zhí)行的代碼即可。下面是一個例子:
public class MyThread extends Thread
{
int count= 1, number;
public MyThread(int num)
{
number = num;
System.out.println
("創(chuàng)建線程 " + number);
}
public void run() {
while(true) {
System.out.println
("線程 " + number + ":計數(shù) " + count);
if(++count== 6) return;
}
}
public static void main(String args[])
{
for(int i = 0;i 〈 5; i++) new MyThread(i+1).start();
}
}
這種方法簡單明了,符合大家的習(xí)慣,但是,它也有一個很大的缺點,那就是如果我們的類已經(jīng)從一個類繼承(如小程序必須繼承自 Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應(yīng)該怎么辦呢?
我們不妨來探索一種新的方法:我們不創(chuàng)建Thread類的子類,而是直接使用它,那么我們只能將我們的方法作為參數(shù)傳遞給 Thread 類的實例,有點類似回調(diào)函數(shù)。但是 Java 沒有指針,我們只能傳遞一個包含這個方法的類的實例。
那么如何限制這個類必須包含這一方法呢?當(dāng)然是使用接口!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來的限制嗎?)
Java 提供了接口 java.lang.Runnable 來支持這種方法。
方法二:實現(xiàn) Runnable 接口
Runnable接口只有一個方法run(),我們聲明自己的類實現(xiàn)Runnable接口并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但是Runnable接口并沒有任何對線程的支持,我們還必須創(chuàng)建Thread類的實例,這一點通過Thread類的構(gòu)造函數(shù) public Thread(Runnable target);來實現(xiàn)。下面是一個例子:
public class MyThread implements Runnable
{
int count= 1, number;
public MyThread(int num)
{
number = num;
System.out.println("創(chuàng)建線程 " + number);
}
public void run()
{
while(true)
{
System.out.println
("線程 " + number + ":計數(shù) " + count);
if(++count== 6) return;
}
}
public static void main(String args[])
{
for(int i = 0; i 〈 5;i++) new Thread(new MyThread(i+1)).start();
}
}
嚴(yán)格地說,創(chuàng)建Thread子類的實例也是可行的,但是必須注意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執(zhí)行的將是子類的 run 方法,而不是我們用以實現(xiàn)Runnable 接口的類的 run 方法,對此大家不妨試驗一下。
使用 Runnable 接口來實現(xiàn)多線程使得我們能夠在一個類中包容所有的代碼,有利于封裝,它的缺點在于,我們只能使用一套代碼,若想創(chuàng)建多個線程并使各個線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話,在大多數(shù)情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。
綜上所述,兩種方法各有千秋,大家可以靈活運用。
下面讓我們一起來研究一下多線程使用中的一些問題。
三、線程的四種狀態(tài)
1. 新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start() 尚未被調(diào)用)。
2. 可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU 時間隨時可能被分配給該線程,從而使得它執(zhí)行。
3. 死亡狀態(tài):正常情況下 run() 返回使得線程死亡。調(diào)用 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產(chǎn)生異常,后者是強制終止,不會釋放鎖。
4. 阻塞狀態(tài):線程不會被分配 CPU 時間,無法執(zhí)行。
四、線程的優(yōu)先級
線程的優(yōu)先級代表該線程的重要程度,當(dāng)有多個線程同時處于可執(zhí)行狀態(tài)并等待獲得 CPU 時間時,線程調(diào)度系統(tǒng)根據(jù)各個線程的優(yōu)先級來決定給誰分配 CPU 時間,優(yōu)先級高的線程有更大的機會獲得 CPU 時間,優(yōu)先級低的線程也不是沒有機會,只是機會要小一些罷了。
你可以調(diào)用 Thread 類的方法 getPriority() 和 setPriority()來存取線程的優(yōu)先級,線程的優(yōu)先級界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是5(NORM_PRIORITY)。
5)你用過哪種設(shè)計模式?(瞬聯(lián),IBM,aspenTech)
設(shè)計:design
模式:pattern
框架:framework
創(chuàng)建模式,結(jié)構(gòu)模式和行為模式
GoF設(shè)計模式
A.創(chuàng)建模式
設(shè)計模式之Factory(工廠模式)
使用工廠模式就象使用new一樣頻繁.2002/10/9更新
設(shè)計模式之Prototype(原型模式)
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
設(shè)計模式之Builder
汽車由車輪 方向盤 發(fā)動機很多部件組成,同時,將這些部件組裝成汽車也是一件復(fù)雜的工作,Builder模式就是將這兩種情況分開進行。
設(shè)計模式之Singleton(單態(tài)模式)
保證一個類只有一個實例,并提供一個訪問它的全局訪問點 2002/10/9更新
B.結(jié)構(gòu)模式
設(shè)計模式之Facade
可擴展的使用JDBC針對不同的數(shù)據(jù)庫編程,Facade提供了一種靈活的實現(xiàn).
設(shè)計模式之Proxy
以Jive為例,剖析代理模式在用戶級別授權(quán)機制上的應(yīng)用
設(shè)計模式之Adapter
使用類再生的兩個方式:組合(new)和繼承(extends),這個已經(jīng)在"thinking in java"中提到過.
設(shè)計模式之Composite
就是將類用樹形結(jié)構(gòu)組合成一個單位.你向別人介紹你是某單位,你是單位中的一個元素,別人和你做買賣,相當(dāng)于和單位做買賣。文章中還對Jive再進行了剖析。
設(shè)計模式之Decorator
Decorator是個油漆工,給你的東東的外表刷上美麗的顏色.
設(shè)計模式之Bridge
將"牛郎織女"分開(本應(yīng)在一起,分開他們,形成兩個接口),在他們之間搭建一個橋(動態(tài)的結(jié)合)
設(shè)計模式之Flyweight
提供Java運行性能,降低小而大量重復(fù)的類的開銷.
C.行為模式
設(shè)計模式之Template
實際上向你介紹了為什么要使用Java 抽象類,該模式原理簡單,使用很普遍.
設(shè)計模式之Memento
很簡單一個模式,就是在內(nèi)存中保留原來數(shù)據(jù)的拷貝.
設(shè)計模式之Observer
介紹如何使用Java API提供的現(xiàn)成Observer
設(shè)計模式之Chain of Responsibility
各司其職的類串成一串,好象擊鼓傳花,當(dāng)然如果自己能完成,就不要推委給下一個.
設(shè)計模式之Command
什么是將行為封裝,Command是最好的說明.
設(shè)計模式之State
狀態(tài)是編程中經(jīng)常碰到的實例,將狀態(tài)對象化,設(shè)立狀態(tài)變換器,便可在狀態(tài)中輕松切換.
設(shè)計模式之Strategy
不同算法各自封裝,用戶端可隨意挑選需要的算法.
設(shè)計模式之Mediator
Mediator很象十字路口的紅綠燈,每個車輛只需和紅綠燈交互就可以.
設(shè)計模式之Interpreter
主要用來對語言的分析,應(yīng)用機會不多.
設(shè)計模式之Visitor
訪問者在進行訪問時,完成一系列實質(zhì)性操作,而且還可以擴展.
設(shè)計模式之Iterator
這個模式已經(jīng)被整合入Java的Collection.在大多數(shù)場合下無需自己制造一個Iterator,只要將對象裝入Collection中,直接使用Iterator進行對象遍歷。
【java面試問題及答案】相關(guān)文章:
java招聘面試常見問題12-10
java面試最常見問題03-24
JAVA面試真題及答案分享11-20
面試后勤問題及答案09-23
銷售面試的問題及答案11-08
面試問題及答案02-15
面試問題及答案01-02
社團面試的問題及答案11-20
面試司機的問題及答案04-26