Java工程師面試題必考
Java軟件工程師是指運用Java這種開發(fā)語言去完成軟件產品的軟件程序設計、開發(fā)、測試、維護升級等工作的人員。Java軟件工程師近年來成為熱門職業(yè)之一,你知道他們的面試試題考什么嗎?下面由學習啦小編為你提供的aa,希望大家喜歡。
Java工程師面試題
1、面向對象的特征有哪些方面?
答:面向對象的特征主要有以下幾個方面:
- 抽象:抽象是將一類對象的共同特征總結出來構造類的過程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,并不關注這些行為的細節(jié)是什么。
- 繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類、基類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時繼承也是封裝程序中可變因素的重要手段(如果不能理解請閱讀閻宏博士的《Java與模式》或《設計模式精解》中關于橋梁模式的部分)。
- 封裝:通常認為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對數(shù)據(jù)的訪問只能通過已定義的接口。面向對象的本質就是將現(xiàn)實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現(xiàn)細節(jié)的一種封裝;我們編寫一個類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝??梢哉f,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現(xiàn)在使用的智能手機也是封裝得足夠好的,因為幾個按鍵就搞定了所有的事情)。
- 多態(tài)性:多態(tài)性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時的多態(tài)性和運行時的多態(tài)性。如果將對象的方法視為對象向外界提供的服務,那么運行時的多態(tài)性可以解釋為:當A系統(tǒng)訪問B系統(tǒng)提供的服務時,B系統(tǒng)有多種提供服務的方式,但一切對A系統(tǒng)來說都是透明的(就像電動剃須刀是A系統(tǒng),它的供電系統(tǒng)是B系統(tǒng),B系統(tǒng)可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統(tǒng)只會通過B類對象調用供電的方法,但并不知道供電系統(tǒng)的底層實現(xiàn)是什么,究竟通過何種方式獲得了動力)。方法重載(overload)實現(xiàn)的是編譯時的多態(tài)性(也稱為前綁定),而方法重寫(override)實現(xiàn)的是運行時的多態(tài)性(也稱為后綁定)。運行時的多態(tài)是面向對象最精髓的東西,要實現(xiàn)多態(tài)需要做兩件事:1). 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);2). 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為)。
2、訪問修飾符public,private,protected,以及不寫(默認)時的區(qū)別?
答:
修飾符 | 當前類 | 同包 | 子類 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
類的成員不寫訪問修飾時默認為default。默認對于同一個包中的其他類相當于公開(public),對于不是同一個包中的其他類相當于私有(private)。受保護(protected)對子類相當于公開,對不是同一包中的沒有父子關系的類相當于私有。Java中,外部類的修飾符只能是public或默認,類的成員(包括內部類)的修飾符可以是以上四種。
3、String 是最基本的數(shù)據(jù)類型嗎?
答:不是。Java中的基本數(shù)據(jù)類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type),剩下的都是引用類型(reference type),Java 5以后引入的枚舉類型也算是一種比較特殊的引用類型。
4、float f=3.4;是否正確?
答:不正確。3.4是雙精度數(shù),將雙精度型(double)賦值給浮點型(float)屬于下轉型(down-casting,也稱為窄化)會造成精度損失,因此需要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F;。
5、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
答:對于short s1 = 1; s1 = s1 + 1;由于1是int類型,因此s1+1運算結果也是int 型,需要強制轉換類型才能賦值給short型。而short s1 = 1; s1 += 1;可以正確編譯,因為s1+= 1;相當于s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。
6、Java有沒有goto?
答:goto 是Java中的保留字,在目前版本的Java中沒有使用。(根據(jù)James Gosling(Java之父)編寫的《The Java Programming Language》一書的附錄中給出了一個Java關鍵字列表,其中有goto和const,但是這兩個是目前無法使用的關鍵字,因此有些地方將其稱之為保留字,其實保留字這個詞應該有更廣泛的意義,因為熟悉C語言的程序員都知道,在系統(tǒng)類庫中使用過的有特殊意義的單詞或單詞的組合都被視為保留字)
7、int和Integer有什么區(qū)別?
答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入了基本數(shù)據(jù)類型,但是為了能夠將這些基本數(shù)據(jù)類型當成對象操作,Java為每一個基本數(shù)據(jù)類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。
Java 為每個原始類型提供了包裝類型:
- 原始類型: boolean,char,byte,short,int,long,float,double
- 包裝類型:Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,Double
class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3; // 將3自動裝箱成Integer類型
int c = 3;
System.out.println(a == b); // false 兩個引用沒有引用同一對象
System.out.println(a == c); // true a自動拆箱成int類型再和c比較
}
}1234567891012345678910
最近還遇到一個面試題,也是和自動裝箱和拆箱有點關系的,代碼如下所示:
public class Test03 {
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}123456789123456789
如果不明就里很容易認為兩個輸出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什么呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態(tài)方法valueOf,如果看看valueOf的源代碼就知道發(fā)生了什么。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}1234512345
IntegerCache是Integer的內部類,其代碼如下所示:
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}12345678910111213141516171819202122232425262728293031323334353637383940414243441234567891011121314151617181920212223242526272829303132333435363738394041424344
簡單的說,如果整型字面量的值在-128到127之間,那么不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1==f2的結果是true,而f3==f4的結果是false。
提醒:越是貌似簡單的面試題其中的玄機就越多,需要面試者有相當深厚的功力。
8、&和&&的區(qū)別?
答:&運算符有兩種用法:(1)按位與;(2)邏輯與。&&運算符是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是null而且不是空字符串,應當寫為:username != null &&!username.equals(""),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。
補充:如果你熟悉JavaScript,那你可能更能感受到短路運算的強大,想成為javascript的高手就先從玩轉短路運算開始吧。
9、解釋內存中的棧(stack)、堆(heap)和方法區(qū)(method area)的用法。
答:通常我們定義一個基本數(shù)據(jù)類型的變量,一個對象的引用,還有就是函數(shù)調用的現(xiàn)場保存都使用JVM中的??臻g;而通過new關鍵字和構造器創(chuàng)建的對象則放在堆空間,堆是垃圾收集器管理的主要區(qū)域,由于現(xiàn)在的垃圾收集器都采用分代收集算法,所以堆空間還可以細分為新生代和老生代,再具體一點可以分為Eden、Survivor(又可分為From Survivor和To Survivor)、Tenured;方法區(qū)和堆都是各個線程共享的內存區(qū)域,用于存儲已經被JVM加載的類信息、常量、靜態(tài)變量、JIT編譯器編譯后的代碼等數(shù)據(jù);程序中的字面量(literal)如直接書寫的100、"hello"和常量都是放在常量池中,常量池是方法區(qū)的一部分,。??臻g操作起來最快但是棧很小,通常大量的對象都是放在堆空間,棧和堆的大小都可以通過JVM的啟動參數(shù)來進行調整,??臻g用光了會引發(fā)StackOverflowError,而堆和常量池空間不足則會引發(fā)OutOfMemoryError。
String str = new String("hello");11
上面的語句中變量str放在棧上,用new創(chuàng)建出來的字符串對象放在堆上,而"hello"這個字面量是放在方法區(qū)的。
補充1:較新版本的Java(從Java 6的某個更新開始)中,由于JIT編譯器的發(fā)展和"逃逸分析"技術的逐漸成熟,棧上分配、標量替換等優(yōu)化技術使得對象一定分配在堆上這件事情已經變得不那么絕對了。
補充2:運行時常量池相當于Class文件常量池具有動態(tài)性,Java語言并不要求常量一定只有編譯期間才能產生,運行期間也可以將新的常量放入池中,String類的intern()方法就是這樣的。
看看下面代碼的執(zhí)行結果是什么并且比較一下Java 7以前和以后的運行結果是否一致。
String s1 = new StringBuilder("go")
.append("od").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder("ja")
.append("va").toString();
System.out.println(s2.intern() == s2);123456123456
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在參數(shù)上加0.5然后進行下取整。
JAVA工程師面試技巧
1.自我介紹。
講清楚自己的學校,工作經歷,離職原因。
2.項目介紹。
做過的項目是什么,多少人參與,負責哪個模塊,做的什么業(yè)務,解決方案是什么,為什么這么做。
我跟面試者聊的最多的就是他們做過的項目用到的技術方案,我會自己想一下,如果是我做這個需求,我怎么做,他們怎么做。
如果我有經驗,知道他的方式不正確,會問一下他,這個方案怎么來的,為什么這么做,有沒有更好的辦法,能否看到這個方案中存在的問題。
如果我沒經驗,我會把我的方案拿出來,跟他對比一下,問問他我的這個方案怎么樣,有什么風險。
這部分主要考察的是業(yè)務理解能力和方案設計能力。
3.方案交流
我會主動問他,我們現(xiàn)在要做一個什么東西,假設你就是這個項目的負責人,你會怎么做。
他給出一個方案之后, 會當場跟他交流這個方案的問題,順便借此交流看一下,如果他真的加入了我們團隊,是不是好交流。
不怕不會,就怕點不透,太固執(zhí)已見的,無法交流的,根本不知道你在說什么的,完全摸不著頭腦的,不考慮。
4.技術面
簡單的問Maven,Shell,nexus,Memcache,Redis,JMS,Rest,aop,SCA了解多少,有沒有特別熟悉的,如果有的話,挑一個他比較熟悉的問題問一下,看看他對一個知識點的掌握程度。
比如說,Snapshot和Release的區(qū)別是什么?什么樣的場景下應該用Snapshot,什么時候去發(fā)布Release版本,Maven是如何識別有新的Snapshot新版本的?
以及除了java之外還會別的什么語言。
5.候選人自已的特長
問我自己關心的問題,往往會補一句。除了以上我們聊到的,還有哪些你擅長的,但是我們剛剛沒有說的技術點?
如果候選人說了,繼續(xù)聊,看看他的知識掌握程度。
如果候選人說沒有了,就問他有沒有對我們公司想要了解的
Java工程師面試題必考
下一篇:面試常見的面試題及回答技巧