Java初級工程師面試題精選1
說明:本面試題大多都是根據《Java面試問題集》、《Java程式設計師面試寶典》、《程式設計師面試寶典》等書籍概括精選而來,其中也補充了一些自己在找工作的過程中遇到的面試題,雖然不能遍及Java的所有知識點,但絕對都是面試會問到的高頻知識點。
1.Java中的作用域public,private,protected,以及不寫作用域(default)時有什麼區別?
Java中有四種作用域,按照作用域範圍由大到小排列一次是:public , protected , default , private。
private表示只能在當前類中使用;
default表示只能在當前類或者是同一個包下面使用;
protected表示可以在當前類,同一個包下,當前類的子類中使用;
public表示除了上面的情況外,還可以被其它包中的類使用。
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
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中定義的,所以所有類都擁有這個方法,當對它進行重寫時,可以用來自定義地做些清理工作。