天天看點

Java初級工程師面試題精選1

說明:本面試題大多都是根據《Java面試問題集》、《Java程式員面試寶典》、《程式員面試寶典》等書籍概括精選而來,其中也補充了一些自己在找工作的過程中遇到的面試題,雖然不能遍及Java的所有知識點,但絕對都是面試會問到的高頻知識點。

1.Java中的作用域public,private,protected,以及不寫作用域(default)時有什麼差別?

  Java中有四種作用域,按照作用域範圍由大到小排列一次是:public , protected , default , private。

  private表示隻能在目前類中使用;

  default表示隻能在目前類或者是同一個包下面使用;

  protected表示可以在目前類,同一個包下,目前類的子類中使用;

  public表示除了上面的情況外,還可以被其它包中的類使用。

2.匿名内部類是否可以繼承其它類,是否可以實作其它接口?

  首先需要搞清楚内部類和匿名内部類的概念和特點,可以參考以下連結:

  http://android.blog.51cto.com/268543/384844/

  http://www.cnblogs.com/o-andy-o/archive/2012/04/07/2435825.html

  内部類分為三種:成員内部類,局部内部類(又稱方法内部類),匿名内部類。(這裡不把靜态嵌套類歸類于内部類,在後面會單獨講到)

  本題問的是匿名内部類,那麼我們來看一段代碼:

public class Car {
    public void drive() {
        System.out.println("drive a car!");
    }
}           
public class Outer {
    public static void main(String[] args) {
        Car car = new Car(){
//要使用匿名内部類必須先定義該類(接口)
//此處匿名内部類會預設繼承已經定義的類(Car)
            public void drive() {
                System.out.println("drive another car!");
            }
        };
        car.drive();
    }
}           

  其中,new Car()就是一個匿名内部類,繼承了它的父類Car。

  是以,本題答案是匿名内部類可以而且是必須繼承一個父類或者實作一個接口。

3.靜态嵌套類和内部類的差別。

  首先,我們看一下靜态嵌套類的例子:

public class Outer {
    public static void main(String[] args) {
        Outer.Inner inner = new Inner();
        Outer.Inner.print();
    }

    public static class Inner {
        public static void print() {
        }
    }
}
           

  該靜态嵌套内部類可以像其它靜态成員一樣,沒有外部類對象時也能夠通過外部類的類名通路它。但是,它不能通路外部類的成員和方法,因為無法知道外部類是否生成對象,隻有外部類執行個體化了對象,外部類才會有成員和方法。

  而内部類必須要執行個體化外部類的對象才能被通路,而且,内部類是可以通過Outer.this來擷取外部類對象,進而通路外部類的成員和方法。

4.&和&&的差別。

  &是位運算符,&&是邏輯運算符。位運算2&3=2是因為轉換為二進制為10&11=10,10是2的二進制表示。邏輯運算true&&false=false。在Java中&也可也用來做邏輯運算true&false=false。

  它們的差別在于:在做邏輯運算的時候,&&具有短路的功能,而&不具備。下面舉例說明。

public class TestAnd {
//類變量,不會被初始化,值為null
public static String str1;
public static String str2;

public static void main(String[] args) {
if(str1 != null && str2.equals(“”)) {
...
} else {
...
}
}
}           

  當使用&&時,首先判斷str1 != null 為false,是以短路,不會執行後面的操作。

  當使用&時,雖然前面為false,但是仍然執行後面的判斷

str2.equals("")

,此時會抛出空指針異常。

  

5.Java中Collection和Collections的差別。

  Collection是Java集合架構中最上級的接口之一。Collection的實作類主要有List,Queue,Set等等。

  Colelctions是Collection集合架構的一個幫助類(工具類),它直接繼承Object,不屬于集合架構,主要提供一系列的靜态方法對Collection集合進行各種操作。

6.String s = new String(“abc”);這句話建立了幾個對象?

  兩個。new String(“abc”)是一個字元串對象;s是一個字元串對象的引用對象。

7.Math.round(11.5),Math.round(-11.5),Math.floor(11.7),Math.floor(-11.7)的值各是多少?

  Math.round(a)是四舍五入;Math.floor(a)是傳回小于等于a的最大的double值(即向下取整)。

  是以答案為:12,-11,11,-12

  另外:還有一個ceil方法是向上取整。

8.short s1 = 1;s1=s1+1和short s1 = 1;s1+=1;有什麼差別?

  s1 + 1會自動向上轉型成為int,将int賦給short會編譯報錯,需要強制類型轉換:s1 = (short)s1 + 1;

  對于s1 += 1;編譯器會自動将+=後面的操作數強制轉換成前面變量的類型,然後在變量所在的記憶體區上直接根據右邊的操作數修改左邊變量記憶體存儲的二進制數值,屬于位運算,能正确通過編譯。

  另外,後一種方式屬于位運算,效率比前者要高。

9.Java中有沒有goto語句?

  Java關鍵字:共51個。

  Java保留字:共14個,表示現有的Java版本尚未使用,但以後版本可能會作為關鍵字使用。

  其中,goto就是Java的保留字。

10.數組有沒有length()這個方法,String有沒有length()這個方法?

  數組沒有length()方法,但是有length屬性。String有length()方法。

  補充:集合架構測量長度的方法是size()。

11.簡述Overload(重載)和Override(重寫)的差別。

  重載和重寫是Java多态中的内容。重寫是父類與子類之間多态性的一種表現,重載是一個類中多态性的一種表現。

  重載是在一個類中定義多個同名的方法,但是允許這些方法的傳回值類型,參數清單,通路修飾符,異常等不同。換言之,除了方法名之外,其它都可以不同。

  重寫是因為子類想對父類中某個方法的功能做修改,而不再增加一個新的方法。重寫的要求比較嚴格,傳回值類型,方法名稱,參數清單必須嚴格一緻,通路修飾符必須大于等于被重寫的方法,比如,父類的通路修飾符是protected,子類重寫方法的修飾符可以是protected或者是public。

  值得一提的是,如果父類的方法是private,那麼子類中重寫的這個方法就不能算是重寫,相當于子類中增加了一個全新的方法。重寫的方法不能抛出新的異常類型,但是允許是原異常類型的子類異常。

12.集合架構Set中的元素能否重複?用什麼方法來判斷集合中的元素是否重複?用==還是equals()?它們有什麼差別?

  Set是不能存放重複元素的,即使是null,在Set中也隻能存放一個。Set中元素的順序和元素的插入順序無關,是由Set内部的排序機制自行排序的。

  再來說說==和equals()的差別:

  當比較雙方是基本資料類型的時候,應該使用==來進行比較,比較的是它們的值。

  當比較雙方是複合資料類型的時候,可以使用==也可以使用equals()來進行比較。

  首先,當使用==時,比較的是它們在記憶體中的存放位址。當使用equals()方法時,預設比較的是兩者的記憶體位址,和==一樣。這是因為在Object這個類中定義了這個比較記憶體位址的equals()方法。但在一些類庫中這個equals()方法被重寫了,比如String,Integer和Date等,在這類中equals()就有了它們自己的實作,比較的就不一定是兩者的記憶體位址了。如果想讓兩個複合資料類型的equals方法比較的是它們的值而不是位址,需要重寫hashCode和equals方法。

13.給我一個你最常見到的runtime exception   

  ArithmeticException,       

  BufferOverFlowException,

  ClassCastException,

  IllegalArgumentException,

  NullPointerException…

Exception:http://blog.csdn.net/hguisu/article/details/6155636

14.Error和Exception的差別。

  Error和Exception都是Throwable的子類。

  Error是程式無法處理的錯誤,表示運作應用程式中較嚴重的問題,比如記憶體溢出。

  Exception是程式本身可以處理的異常,表示一種設計或者實作上的問題。

  詳見http://blog.csdn.net/hguisu/article/details/6155636

15.List,Set,Map是否繼承自Collection接口?

  List和Set是,Map不是。

  可以參考Java集合架構的繼承圖。

  http://blog.csdn.net/zsw101259/article/details/7570033

16.abstract class(抽象類)和interface(接口)有什麼差別?

  說到抽象類和接口,不得不先說一下抽象方法,有關抽象方法,抽象類和接口的知識詳細參見:

  http://www.cnblogs.com/dolphin0520/p/3811437.html

  這裡補充強調一下差別:

  a)抽象類可以有構造方法,接口中不能有構造方法。(雖然抽象類不能建立執行個體對象)

  b)抽象類的成員變量可以是各種類型的,接口中的成員變量是public static final 類型的。

  c)抽象類可以有抽象方法,也可以有具體實作的方法;接口隻能有抽象方法。

  d)抽象類的抽象方法可以是public和protected,接口的抽象方法隻能是public abstract。

  e)抽象類中可以有靜态方法和靜态代碼塊,接口中不行。

  f)單繼承,多實作。

  g)從使用方面來說,繼承是為了代碼的複用,接口是為了系統的邏輯設計。

17.抽象方法是否可以用static,native,synchronized來修飾嗎?

  在類中,沒有方法體的方法就是抽象方法。

  構造方法,靜态方法,私有方法,final方法不能被聲明為抽象方法,抽象方法也不能使用native,static,final,private,protected,synchronized來修飾。

  原因:

  抽象方法是需要在子類中實作的,本身沒有實作體,通過抽象類名來調用這個沒有實作體的抽象靜态方法完全沒有意義,是以抽象方法不能是static。

  雖然native修飾的方法不能有實作體但卻表示該方法要用另外一種程式設計語言實作,不存在被子類實作的問題,是以native方法不能是abstract的。是以,抽象方法不能是native。

  一個抽象方法沒有實作體,需要synchronized有什麼用,也不行。

18.接口是否可以繼承接口,抽象類是否可以實作接口,抽象類是否可以繼承實體類?抽象類中是否可以有靜态的main方法?

  接口可以繼承接口,抽象類可以實作接口,但接口不能繼承抽象類,抽象類也可以繼承實體類,但前提是實體類必須有明确的構造函數(或者說,實體類中必須有子類可以通路的構造函數)。抽象類中可以有靜态的main方法這個詳見:

http://blog.sina.com.cn/s/blog_7042a6c101013ung.html

  tips:抽象類和具體類的差別:抽象類用abstract修飾,抽象類不能被執行個體化,抽象類中允許有抽象方法。

19.構造器(構造函數)能否被重寫?

  一個類的構造函數不能被重寫,但是可以重載。

20.是否可以繼承String類?

  查閱JDK幫助文檔,可以看到String類的定義聲明:

  

public final class String extends Object implements Serializable, Comparable<String>, CharSequence

由于是final類型的,是以,String類是不能被繼承的。

  建議:String類的所有方法都要看一下,考的很多。

21.try{}裡面有一個return語句,那麼緊跟在這個try後面的finally{}裡的代碼會不會被執行,什麼時候執行。

  會執行,在try{}裡面的return語句傳回之前執行。

  重要示例:

  http://blog.csdn.net/u012050416/article/details/50781426

22.用最有效率的方法算出2*8

  最有效率的就是位運算,2<<3就可以了。

23.兩個對象值相等(x.equals(y) == true),但卻可以有不同的hash code,這句話對嗎?

  首先需要了解hashcode的作用:

  http://blog.csdn.net/fenglibing/article/details/8905007

  如果兩個對象相同,那麼這兩個對象的hashcode一定相同;但是如果兩個對象的hashcode相同,并不一定表示這兩個對象就相同。

  是以這句話是錯的。

24.當一個對象被當做參數傳遞給一個方法後,此方法可以改變這個對象的屬性,并可以傳回變化後的結果,那麼這算是按值傳遞還是引用傳遞?

  首先要搞清楚Java中的按值傳遞和引用傳遞分别是什麼意思:

  http://blog.csdn.net/zzp_403184692/article/details/8184751

  首先要弄清楚題目中說的對象是基本類型還是複合資料類型的對象,由上面文章可知,如果為基本類型(及其包裝類)或者是String,那就是按值傳遞,因為參數傳遞過去的是值的拷貝;如果是複合資料類型的對象(除了基本資料類型及其包裝類和String),那麼傳遞的參數是這個對象的引用,就算是引用傳遞,比如StringBuilder,StringBuffer等等。

25.switch是否能作用在byte,long,String上?

  jdk1.6以前可以支援byte,char,short,int,enum。要注意,沒有long

  jdk1.7新增加了對String的支援。

26.char中可以存放一個中文漢字嗎?

  一個中文漢字需要兩個位元組才能存放,隻要我們記住Java中基本資料類型所占的位元組數就可以了。

基本類型 大小
char 2
byte 1
short 2
int 4
long 8
float 4
double 8

  是以本體的答案是可以。另外,如果某個特殊的漢字沒有被包含在unicode中,那麼char就不能表示出這個漢字。

  參考資料:字元編碼方式

27.GC是什麼,為什麼要有GC?

  GC是垃圾收集的意思(GabageCollection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導緻程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域進而達到自動回收記憶體的目的,Java語言沒有提供釋放已配置設定記憶體的顯示操作方法。

28.float f = 3.4這樣書寫是否正确?

  不正确,在Java中,小數預設是采用double類型的,此處3.4是double類型的,這句話會出現編譯錯誤,應該強制類型轉換:

  float f = (float)3.4

  或者這樣寫:

  float f = 3.4f

29.String和StringBuffer的差別

  一個String對象建立以後,它在記憶體中的内容是不可變的,之是以有

  

String s = "abc";

  

s = s + "d";

  這是因為建立了兩個String對象,分别是“abc”和“abcd”,而s的引用指向了“abcd”。

  StringBuffer的内容是可以改變的,而且在更改的過程中隻建立一個對象。

  String類重寫了equals方法和hashCode方法,StringBuffer類卻沒有,是以:

  

new String(“abc”).equals(new String(“abc”))

結果為true,

  

new StringBuffer(“abc”).equals(new StringBuffer(“abc”))

的結果為false。

  當需要對某個字元串經常修改時,盡量采用StringBuffer類型,最後如果想得到String類型,可以調用StringBuffer的toString()方法。

  Tips:StringBuilder和StringBuffer都是可變的,差別在于,StringBuilder不是線程安全的,StringBuffer是線程安全的。效率上,前者優于後者。

30.說一說final,finally和finalize的差別

  final和finally都是Java的關鍵字,finalize是一個方法名。

  final是修飾符,可以用來修飾類,表示該類不能被繼承;修飾方法,表示該方法不能被重寫;修飾變量,表示該變量的值不能被更改。

  finally是在異常處理時用來進行資源釋放的地方,finally中的代碼在異常處理結束傳回之前,一定會執行。

  finalize是垃圾收集器在對某個對象進行清除前調用的方法,在這個方法中做一些必要的清理工作。該方法是在Object中定義的,是以所有類都擁有這個方法,當對它進行重寫時,可以用來自定義地做些清理工作。