學(xué)習(xí)啦>創(chuàng)業(yè)指南>職場(chǎng)>面試題>

Java工程師面試題必考

時(shí)間: 曉晴1082 分享

  Java軟件工程師是指運(yùn)用Java這種開發(fā)語言去完成軟件產(chǎn)品的軟件程序設(shè)計(jì)、開發(fā)、測(cè)試、維護(hù)升級(jí)等工作的人員。Java軟件工程師近年來成為熱門職業(yè)之一,你知道他們的面試試題考什么嗎?下面由學(xué)習(xí)啦小編為你提供的aa,希望大家喜歡。

  Java工程師面試題

  1、面向?qū)ο蟮奶卣饔心男┓矫?

  答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面:

  - 抽象:抽象是將一類對(duì)象的共同特征總結(jié)出來構(gòu)造類的過程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關(guān)注對(duì)象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么。

  - 繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類、基類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時(shí)繼承也是封裝程序中可變因素的重要手段(如果不能理解請(qǐng)閱讀閻宏博士的《Java與模式》或《設(shè)計(jì)模式精解》中關(guān)于橋梁模式的部分)。

  - 封裝:通常認(rèn)為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對(duì)數(shù)據(jù)的訪問只能通過已定義的接口。面向?qū)ο蟮谋举|(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自治、封閉的對(duì)象。我們?cè)陬愔芯帉懙姆椒ň褪菍?duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝;我們編寫一個(gè)類就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝??梢哉f,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(可以想想普通洗衣機(jī)和全自動(dòng)洗衣機(jī)的差別,明顯全自動(dòng)洗衣機(jī)封裝更好因此操作起來更簡單;我們現(xiàn)在使用的智能手機(jī)也是封裝得足夠好的,因?yàn)閹讉€(gè)按鍵就搞定了所有的事情)。

  - 多態(tài)性:多態(tài)性是指允許不同子類型的對(duì)象對(duì)同一消息作出不同的響應(yīng)。簡單的說就是用同樣的對(duì)象引用調(diào)用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。如果將對(duì)象的方法視為對(duì)象向外界提供的服務(wù),那么運(yùn)行時(shí)的多態(tài)性可以解釋為:當(dāng)A系統(tǒng)訪問B系統(tǒng)提供的服務(wù)時(shí),B系統(tǒng)有多種提供服務(wù)的方式,但一切對(duì)A系統(tǒng)來說都是透明的(就像電動(dòng)剃須刀是A系統(tǒng),它的供電系統(tǒng)是B系統(tǒng),B系統(tǒng)可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統(tǒng)只會(huì)通過B類對(duì)象調(diào)用供電的方法,但并不知道供電系統(tǒng)的底層實(shí)現(xiàn)是什么,究竟通過何種方式獲得了動(dòng)力)。方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定),而方法重寫(override)實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)。運(yùn)行時(shí)的多態(tài)是面向?qū)ο笞罹璧臇|西,要實(shí)現(xiàn)多態(tài)需要做兩件事:1). 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);2). 對(duì)象造型(用父類型引用引用子類型對(duì)象,這樣同樣的引用調(diào)用同樣的方法就會(huì)根據(jù)子類對(duì)象的不同而表現(xiàn)出不同的行為)。

  2、訪問修飾符public,private,protected,以及不寫(默認(rèn))時(shí)的區(qū)別?

  答:

修飾符 當(dāng)前類 同包 子類 其他包
public
protected ×
default × ×
private × × ×

  類的成員不寫訪問修飾時(shí)默認(rèn)為default。默認(rèn)對(duì)于同一個(gè)包中的其他類相當(dāng)于公開(public),對(duì)于不是同一個(gè)包中的其他類相當(dāng)于私有(private)。受保護(hù)(protected)對(duì)子類相當(dāng)于公開,對(duì)不是同一包中的沒有父子關(guān)系的類相當(dāng)于私有。Java中,外部類的修飾符只能是public或默認(rèn),類的成員(包括內(nèi)部類)的修飾符可以是以上四種。

  3、String 是最基本的數(shù)據(jù)類型嗎?

  答:不是。Java中的基本數(shù)據(jù)類型只有8個(gè):byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type),剩下的都是引用類型(reference type),Java 5以后引入的枚舉類型也算是一種比較特殊的引用類型。

  4、float f=3.4;是否正確?

  答:不正確。3.4是雙精度數(shù),將雙精度型(double)賦值給浮點(diǎn)型(float)屬于下轉(zhuǎn)型(down-casting,也稱為窄化)會(huì)造成精度損失,因此需要強(qiáng)制類型轉(zhuǎn)換float f =(float)3.4; 或者寫成float f =3.4F;。

  5、short s1 = 1; s1 = s1 + 1;有錯(cuò)嗎?short s1 = 1; s1 += 1;有錯(cuò)嗎?

  答:對(duì)于short s1 = 1; s1 = s1 + 1;由于1是int類型,因此s1+1運(yùn)算結(jié)果也是int 型,需要強(qiáng)制轉(zhuǎn)換類型才能賦值給short型。而short s1 = 1; s1 += 1;可以正確編譯,因?yàn)閟1+= 1;相當(dāng)于s1 = (short)(s1 + 1);其中有隱含的強(qiáng)制類型轉(zhuǎn)換。

  6、Java有沒有g(shù)oto?

  答:goto 是Java中的保留字,在目前版本的Java中沒有使用。(根據(jù)James Gosling(Java之父)編寫的《The Java Programming Language》一書的附錄中給出了一個(gè)Java關(guān)鍵字列表,其中有g(shù)oto和const,但是這兩個(gè)是目前無法使用的關(guān)鍵字,因此有些地方將其稱之為保留字,其實(shí)保留字這個(gè)詞應(yīng)該有更廣泛的意義,因?yàn)槭煜語言的程序員都知道,在系統(tǒng)類庫中使用過的有特殊意義的單詞或單詞的組合都被視為保留字)

  7、int和Integer有什么區(qū)別?

  答:Java是一個(gè)近乎純潔的面向?qū)ο缶幊陶Z言,但是為了編程的方便還是引入了基本數(shù)據(jù)類型,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類型當(dāng)成對(duì)象操作,Java為每一個(gè)基本數(shù)據(jù)類型都引入了對(duì)應(yīng)的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動(dòng)裝箱/拆箱機(jī)制,使得二者可以相互轉(zhuǎn)換。

  Java 為每個(gè)原始類型提供了包裝類型:

  - 原始類型: 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自動(dòng)裝箱成Integer類型

  int c = 3;

  System.out.println(a == b); // false 兩個(gè)引用沒有引用同一對(duì)象

  System.out.println(a == c); // true a自動(dòng)拆箱成int類型再和c比較

  }

  }1234567891012345678910

  最近還遇到一個(gè)面試題,也是和自動(dòng)裝箱和拆箱有點(diǎn)關(guān)系的,代碼如下所示:

  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

  如果不明就里很容易認(rèn)為兩個(gè)輸出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四個(gè)變量都是Integer對(duì)象引用,所以下面的==運(yùn)算比較的不是值而是引用。裝箱的本質(zhì)是什么呢?當(dāng)我們給一個(gè)Integer對(duì)象賦一個(gè)int值的時(shí)候,會(huì)調(diào)用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的內(nèi)部類,其代碼如下所示:

  /**

  * 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之間,那么不會(huì)new新的Integer對(duì)象,而是直接引用常量池中的Integer對(duì)象,所以上面的面試題中f1==f2的結(jié)果是true,而f3==f4的結(jié)果是false。

  提醒:越是貌似簡單的面試題其中的玄機(jī)就越多,需要面試者有相當(dāng)深厚的功力。

  8、&和&&的區(qū)別?

  答:&運(yùn)算符有兩種用法:(1)按位與;(2)邏輯與。&&運(yùn)算符是短路與運(yùn)算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運(yùn)算符左右兩端的布爾值都是true整個(gè)表達(dá)式的值才是true。&&之所以稱為短路運(yùn)算是因?yàn)?,如?amp;&左邊的表達(dá)式的值是false,右邊的表達(dá)式會(huì)被直接短路掉,不會(huì)進(jìn)行運(yùn)算。很多時(shí)候我們可能都需要用&&而不是&,例如在驗(yàn)證用戶登錄時(shí)判定用戶名不是null而且不是空字符串,應(yīng)當(dāng)寫為:username != null &&!username.equals(""),二者的順序不能交換,更不能用&運(yùn)算符,因?yàn)榈谝粋€(gè)條件如果不成立,根本不能進(jìn)行字符串的equals比較,否則會(huì)產(chǎn)生NullPointerException異常。注意:邏輯或運(yùn)算符(|)和短路或運(yùn)算符(||)的差別也是如此。

  補(bǔ)充:如果你熟悉JavaScript,那你可能更能感受到短路運(yùn)算的強(qiáng)大,想成為javascript的高手就先從玩轉(zhuǎn)短路運(yùn)算開始吧。

  9、解釋內(nèi)存中的棧(stack)、堆(heap)和方法區(qū)(method area)的用法。

  答:通常我們定義一個(gè)基本數(shù)據(jù)類型的變量,一個(gè)對(duì)象的引用,還有就是函數(shù)調(diào)用的現(xiàn)場(chǎng)保存都使用JVM中的棧空間;而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對(duì)象則放在堆空間,堆是垃圾收集器管理的主要區(qū)域,由于現(xiàn)在的垃圾收集器都采用分代收集算法,所以堆空間還可以細(xì)分為新生代和老生代,再具體一點(diǎn)可以分為Eden、Survivor(又可分為From Survivor和To Survivor)、Tenured;方法區(qū)和堆都是各個(gè)線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)已經(jīng)被JVM加載的類信息、常量、靜態(tài)變量、JIT編譯器編譯后的代碼等數(shù)據(jù);程序中的字面量(literal)如直接書寫的100、"hello"和常量都是放在常量池中,常量池是方法區(qū)的一部分,。??臻g操作起來最快但是棧很小,通常大量的對(duì)象都是放在堆空間,棧和堆的大小都可以通過JVM的啟動(dòng)參數(shù)來進(jìn)行調(diào)整,??臻g用光了會(huì)引發(fā)StackOverflowError,而堆和常量池空間不足則會(huì)引發(fā)OutOfMemoryError。

  String str = new String("hello");11

  上面的語句中變量str放在棧上,用new創(chuàng)建出來的字符串對(duì)象放在堆上,而"hello"這個(gè)字面量是放在方法區(qū)的。

  補(bǔ)充1:較新版本的Java(從Java 6的某個(gè)更新開始)中,由于JIT編譯器的發(fā)展和"逃逸分析"技術(shù)的逐漸成熟,棧上分配、標(biāo)量替換等優(yōu)化技術(shù)使得對(duì)象一定分配在堆上這件事情已經(jīng)變得不那么絕對(duì)了。

  補(bǔ)充2:運(yùn)行時(shí)常量池相當(dāng)于Class文件常量池具有動(dòng)態(tài)性,Java語言并不要求常量一定只有編譯期間才能產(chǎn)生,運(yùn)行期間也可以將新的常量放入池中,String類的intern()方法就是這樣的。

  看看下面代碼的執(zhí)行結(jié)果是什么并且比較一下Java 7以前和以后的運(yùn)行結(jié)果是否一致。

  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然后進(jìn)行下取整。

  JAVA工程師面試技巧

  1.自我介紹。

  講清楚自己的學(xué)校,工作經(jīng)歷,離職原因。

  2.項(xiàng)目介紹。

  做過的項(xiàng)目是什么,多少人參與,負(fù)責(zé)哪個(gè)模塊,做的什么業(yè)務(wù),解決方案是什么,為什么這么做。

  我跟面試者聊的最多的就是他們做過的項(xiàng)目用到的技術(shù)方案,我會(huì)自己想一下,如果是我做這個(gè)需求,我怎么做,他們?cè)趺醋觥?/p>

  如果我有經(jīng)驗(yàn),知道他的方式不正確,會(huì)問一下他,這個(gè)方案怎么來的,為什么這么做,有沒有更好的辦法,能否看到這個(gè)方案中存在的問題。

  如果我沒經(jīng)驗(yàn),我會(huì)把我的方案拿出來,跟他對(duì)比一下,問問他我的這個(gè)方案怎么樣,有什么風(fēng)險(xiǎn)。

  這部分主要考察的是業(yè)務(wù)理解能力和方案設(shè)計(jì)能力。

  3.方案交流

  我會(huì)主動(dòng)問他,我們現(xiàn)在要做一個(gè)什么東西,假設(shè)你就是這個(gè)項(xiàng)目的負(fù)責(zé)人,你會(huì)怎么做。

  他給出一個(gè)方案之后, 會(huì)當(dāng)場(chǎng)跟他交流這個(gè)方案的問題,順便借此交流看一下,如果他真的加入了我們團(tuán)隊(duì),是不是好交流。

  不怕不會(huì),就怕點(diǎn)不透,太固執(zhí)已見的,無法交流的,根本不知道你在說什么的,完全摸不著頭腦的,不考慮。

  4.技術(shù)面

  簡單的問Maven,Shell,nexus,Memcache,Redis,JMS,Rest,aop,SCA了解多少,有沒有特別熟悉的,如果有的話,挑一個(gè)他比較熟悉的問題問一下,看看他對(duì)一個(gè)知識(shí)點(diǎn)的掌握程度。

  比如說,Snapshot和Release的區(qū)別是什么?什么樣的場(chǎng)景下應(yīng)該用Snapshot,什么時(shí)候去發(fā)布Release版本,Maven是如何識(shí)別有新的Snapshot新版本的?

  以及除了java之外還會(huì)別的什么語言。

  5.候選人自已的特長

  問我自己關(guān)心的問題,往往會(huì)補(bǔ)一句。除了以上我們聊到的,還有哪些你擅長的,但是我們剛剛沒有說的技術(shù)點(diǎn)?

  如果候選人說了,繼續(xù)聊,看看他的知識(shí)掌握程度。

  如果候選人說沒有了,就問他有沒有對(duì)我們公司想要了解的

Java工程師面試題必考

Java軟件工程師是指運(yùn)用Java這種開發(fā)語言去完成軟件產(chǎn)品的軟件程序設(shè)計(jì)、開發(fā)、測(cè)試、維護(hù)升級(jí)等工作的人員。Java軟件工程師近年來成為熱門職業(yè)之一,你知道他們的面試試題考什么嗎?下面由學(xué)習(xí)啦小編為你提供的aa,希望大家喜歡。 Java
推薦度:
點(diǎn)擊下載文檔文檔為doc格式

精選文章

  • 2017年山東農(nóng)商行面試模擬題有哪些
    2017年山東農(nóng)商行面試模擬題有哪些

    山東農(nóng)村信用社的招聘考試一般會(huì)采用結(jié)構(gòu)化面試形式。所謂結(jié)構(gòu)化面試是指面試的內(nèi)容、形式、程序、評(píng)分標(biāo)準(zhǔn)及結(jié)果的合成與分析等構(gòu)成要素,按統(tǒng)一

  • 山東農(nóng)商行歷年面試真題
    山東農(nóng)商行歷年面試真題

    山東農(nóng)村信用社的招聘考試一般會(huì)采用結(jié)構(gòu)化面試形式。所謂結(jié)構(gòu)化面試是指面試的內(nèi)容、形式、程序、評(píng)分標(biāo)準(zhǔn)及結(jié)果的合成與分析等構(gòu)成要素,按統(tǒng)一

  • 終極面試問題會(huì)有哪些參考答案
    終極面試問題會(huì)有哪些參考答案

    面試時(shí),面試官最看中的是哪些能力?下面就由學(xué)習(xí)啦小編為大家介紹一下終極面試問題的文章,歡迎閱讀。 終極面試問題篇1 1. 說說你不得不糾正某人錯(cuò)誤

  • selenium自動(dòng)化面試題及答案
    selenium自動(dòng)化面試題及答案

    自動(dòng)化技術(shù)是一門綜合性技術(shù),它和控制論、信息論、系統(tǒng)工程、計(jì)算機(jī)技術(shù)、電子學(xué)、液壓氣壓技術(shù)、自動(dòng)控制等都有著十分密切的關(guān)系,而其中又以控

3567624