1. 程式人生 > >java 筆試面試易錯題

java 筆試面試易錯題

最近收集了幾個java中易錯的問題,後續還會繼續更新。


1、存在使i + 1 < i的數嗎?
答案:存在。
分析:如果i為int型,那麼當i為int能表示的最大整數時,i+1就溢位變成負數了,此時不就<i了嗎。
延伸:存在使i > j || i <= j不成立的數嗎
答案:存在,比如Double.NaN或Float.NaN


2、不通過建構函式能否建立物件?
答案:能
分析:Java建立物件的幾種方式(重要):
(1) 用new語句建立物件,這是最常見的建立物件的方法。
(2) 運用反射手段,呼叫java.lang.Class或者java.lang.reflect.Constructor類的newInstance()例項方法。
(3) 呼叫物件的clone()方法。
(4) 運用反序列化手段,呼叫java.io.ObjectInputStream物件的 readObject()方法。(1)和(2)都會明確的顯式的呼叫建構函式 ;(3)是在記憶體上對已有物件的影印,所以不會呼叫建構函式 ;(4)是從檔案中還原類的物件,也不會呼叫建構函式。


3、下面的程式能正常執行嗎?


public class NULL {


    public static void haha(){
        System.out.println("haha");
    }
    public static void main(String[] args) {
        ((NULL)null).haha();
    }
}

答案:能,輸出為haha

分析:因為null值可以強制轉換為任何java類型別,(String)null也是合法的。但null強制轉換後是無效物件,其返回值還是為null,而static方法的呼叫是和類名繫結的,不借助物件進行訪問所以能正確輸出。反過來,沒有static修飾就只能用物件進行訪問,使用null呼叫物件肯定會報空指標錯了。

4、下面程式的執行結果?

public class Base {
    private String name = "hello";
    public Base() {
        callName();
    }
    public void callName(){
        System.out.println(name);
    }
    public static void main(String[] args) {
        new Sub();
    }
}
 
class Sub extends Base{
    private String name="world";
    public void callName(){
        System.out.println(name);
    }
}

答案:null

分析:程式執行的順序是  main 》new Sub()》 建立子類物件》子類物件先呼叫父類的無參構造方法》再呼叫子類的構造方法。因為子類重寫了父類的callName()方法,所以在呼叫父類的構造器的時候name在還沒有被初始化,所以輸出結果未null。

延伸:靜態程式碼塊,靜態方法,非靜態程式碼塊,構造方法的執行順序。

答案:靜態程式碼塊 》 非靜態程式碼塊 》 構造方法。

5、寫sql語句,刪除A表記錄在B表中不存在的資料?
答案:
1. 採用not exists 執行速度快
delete from T_AD where not exists (select 1 from T_AD_PLAY where T_AD.N_CODE =T_AD_PLAY.N_CODE ) 
2. 採用not in 執行速度慢
Delete From T_AD Where N_AD Not In(Select N_AD From T_AD_PLAY)
延伸:
select 1 from mytable;與select anycol(目的表集合中的任意一行) from mytable;與select * from mytable 作用上來說是沒有差別的,都是檢視{是否有記錄},一般是作條件用的。select 1 from 中的1是一常量,如果表中有值,那麼查詢出來的結果集合有多少個1代表表中有多少條表記錄,但從效率上來說,1>anycol>*,因為不用查字典表。


6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯
答:s1是short型別的,1是int型別的,s1+1會將結果自動轉換為int型別的,而你又用一個short型別的s1接受就會出錯。
分析:java中型別的隱式轉換和顯示轉換。


7、自動拆箱裝箱
Integer i = 10;   //int型別資料的自動裝箱,實際上執行的程式碼是:Integer i = Integer.ValueOf(10);
int t = i    //自動拆箱,實際上執行的程式碼是:int t = i.intValue();

8、下面不屬於HttpServletRequest介面完成功能的是?

A 讀取cookie
B 讀取HTTP頭
C 設定響應的content型別
D 讀取路徑資訊

答:C  解析:HttpServletRequest類主要解析1.讀取和寫入HTTP頭標2.取得和設定cookies3.取得路徑資訊4.標識HTTP會話。

而設定響應的content型別是有response來完成的。

9、下面有關java按值傳遞和引用傳遞,說法錯誤的是?


A  char型別的傳遞屬於按值傳遞
B  Array型別的傳遞屬於按引用傳遞
C  使用者自定義型別的傳遞屬於按引用傳遞
D  String型別的傳遞屬於按引用傳遞

解析:正確答案: D  大家可能看過這樣的一句話,java中的傳遞都是值傳遞,所以在這兒不仔細分析就直接選擇了A,其實是錯的。(1):“在Java裡面引數傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,所以統稱按值傳遞。 (2):在Java裡面只有基本型別和按照下面這種定義方式的String是按值傳遞,其它的都是按引用傳遞。就是直接使用雙引號定義字串方式:String str = “Java”;

10、下面有關java hashmap的說法錯誤的是?


A  HashMap 的例項有兩個引數影響其效能:“初始容量” 和 “載入因子”。
B  HashMap 的實現不是同步的,意味著它不是執行緒安全的
C  HashMap通過開放地址法解決雜湊衝突
D  HashMap中的key-value都是儲存在Entry陣列中的

解析:正確答案C .解決衝突主要有三種方法:定址法,拉鍊法,再雜湊法
HashMap是通過拉鍊法來解決碰撞衝突的,就是將碰撞的元素加入到連結串列裡。而開發地址發也是解決碰撞衝突的另一種辦法,它是通過線性探索,如果當前位置碰撞了,就+1,放下一個位置去,還是碰撞就繼續+1。原始碼程式中用到了一個重要的內部介面:Map.Entry,每個 Map.Entry 其實就是一個 key-value 對。當系統決定儲存 HashMap 中的 key-value 對時,完全沒有考慮 Entry 中的 value,僅僅只是根據 key 來計算並決定每個 Entry 的儲存位置。Entry是陣列,陣列中的每個元素上掛這個一條連結串列。連結串列法就是將相同hash值的物件組織成一個連結串列放在hash值對應的槽位;開放地址法是通過一個探測演算法,當某個槽位已經被佔據的情況下繼續查詢下一個可以使用的槽位。很顯然我們使用的不是開放地址法。

11、JAVA反射機制主要提供了以下哪些功能?

在執行時判斷任意一個物件所屬的類
在執行時構造任意一個類的物件
在執行時判斷任意一個類所具有的成員變數和方法
在執行時呼叫任意一個物件的方法

解析:正確答案: A B C D 。普通的java物件是通過new關鍵字把對應類的位元組碼檔案載入到記憶體,然後建立該物件的。
反射是通過一個名為Class的特殊類,用Class.forName("className");得到類的位元組碼物件,然後用newInstance()方法在虛擬機器內部構造這個物件(針對無參建構函式)。
也就是說反射機制讓我們可以先拿到java類對應的位元組碼物件,然後動態的進行任何可能的操作,
包括
在執行時判斷任意一個物件所屬的類
在執行時構造任意一個類的物件
在執行時判斷任意一個類所具有的成員變數和方法
在執行時呼叫任意一個物件的方法
這些都是反射的功能。
使用反射的主要作用是方便程式的擴充套件。