Java 軟件高級工程師筆試題
【智力部分】(30分)
1. 燒一根不均勻的繩要用一個小時,如何用它來判斷半個小時?(5分)
兩頭同時燒
2. 4,4,10,10,加減乘除,怎么出24點?四個數字分別只能用一次(5分)
(10*10-4)/4
3. 如果你有無窮多的水,一個容積為3L的和5L的提桶,你如何准確稱出 4L的水?(5分)
第一步:向5L的通中放兩次3L水,這時3L水桶剩1L水。
第二步:將3L水桶中的1L水倒入5L的水桶中,這時5L的水桶中有1L水。
第三步:再用3L水桶盛滿水全部倒入5L的水桶,4L水就稱出來了。
4. 一只蝸牛從井底爬到井口,每天白天蝸牛要睡覺,晚上才出來活動,一個晚上蝸牛可以向上爬3尺,但是白天睡覺的時候會往下滑2尺,井深10尺,問蝸牛幾天可以爬出來?(5分)
8天。
前七天是(3-1)*7 =7
第八天晚上又爬了3尺,這時已經到井口了。在井口睡覺想滑也滑不下去了。
5. 有一種細菌,經過一分鍾分裂為2個,再過一分鍾,分裂為4個,這樣,將一個細菌放在一個瓶子里面,一個小時后瓶子被細菌充滿了。現在假設一開始放入瓶中的為兩個細菌,那么到充滿瓶子要多長的時間?(10分)
59分鍾。
一個放了一個細菌的瓶子經過一分鍾分裂,就有兩個細菌了。第二個瓶子直接就有了兩個細菌,也就相當於調過了第一個瓶子在第一分鍾的情況了。以后的情況就完全一致了,所以是59分鍾。
【專業部分】(70分)
1. 簡述一下面向對象的特征,並舉例說明你對面向對象的理解?(5分)
面向對象是基於萬物皆對象這個哲學觀點,把一個帝鄉抽象成類,具體就是你吧一個對象的靜態特征和動態特征抽象成屬性和方法,也就是把一類事務的算法和數據結構封裝在一個類之中,程序就是多個對象和互相間的通信組成的。
面向對象具有封裝性,繼承性,多態性。封裝隱蔽了對象內部不需要暴漏的細節,似的內部細節的變動跟外界脫離,只依靠接口進行通信。封裝性降低了編程的復雜性。通過繼承,使得新建一個類變得容易,一個類從派生類哪里獲得其非私有的方法和公用屬性的繁瑣工作交給了編譯器。而繼承和實現接口和運行時的類型標定機制所產生的多態,使得不同的類所產生的對象能夠對相同的消息做出不同的反映,記得提高了代碼的通用性。
總之,面向對象的特性提高了大型程序的重用性和可維護性。
2. ArrayList和HsahSet的區別,HashMap和Hashtable的區別?(5分)
ArrayList和HashSet的區別:
ArrayList是一組有序的集合,存放的是對象的引用,而不是對象本身。存放的對象是可以重復的。
HashSet存放的對象是不可重復的。
HashMap和Hashtable的區別:
- 繼承的類不同
- HashTable是線程安全的,而HashMap是非線程安全的。
- HashMap的key,value是允許null的,而HashTable不允許。且HashMap效率高。
3. 線程同步的關鍵字是什么?sleep() 和 wait() 有什么區別?怎么喚醒wait()停止的線程?(5分)
線程同步的關鍵字:synchronized
Sleep()和Wait()的區別:
- 父類不同Sleep()來自Thread類,wait()來自Objcet類
- 最主要的是sleep()方法沒有釋放鎖,而wait方法釋放了所,使得其他線程可以使用同步空值快或者方法。
Sleep不讓出系統資源;wait是進入線程等待池等待,讓出系統資源,其他線程可以占用cpu,且需要notify,notifyAlll來喚醒等待池中的線程。
- 使用范圍:wait,notify和notifyAll只能在同步空值方法或者同步控制塊里使用,而sleep可以在任何地方使用
- Sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
4. 列舉你在項目中常用的設計模式(偽代碼或類圖),並說明每種設計模式的具體應用場景。(5分)
單例模式
Public class Singleton{
private static volatile Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
多線程中多次獲取某個對象的實例,而不必每次都去new。
4. Spring中事務管理支持哪幾種方式以及每種方式的具體使用方法。(5分)
實現方式兩種:
編碼方式;
聲明式事務管理方式。
聲明式事務管理是通過AOP技術實現的,實質就是:在方法執行前后進行攔截,然后在目標方法開始之前創建並加入事務,執行完成目標方法后根據執行情況提交后回滾事務。
聲明式事務管理有兩種方式:基於XML配置文件(攔截器 AOP),通過標簽@Transaction注解
另一種答案:
1.每個bead都有一個事務代理
- Hibernate的緩存等級及其特點(5分)
一級緩存:session級別的緩存,session關閉后,緩存就沒有了
二級緩存:sessionFactory級別的緩存,它緩存的是對象
查詢緩存:查詢緩存也是sessionFactory級別的緩存,它緩存的是sql語句
一般二級緩存要和查詢緩存配合使用,避免N+1的問題。更建議使用mamcatched單獨做緩存。
5. 至少寫出一種11位手機號碼的正則表達式。(5分)
^[1][358][0-9]{9}$
6. 用簡短的代碼實現字符串“s tr in g”到“s tr in g”轉換。即將多個空格轉換為一個空格(5分)
String s = “s tr in g”;
S=s.replaceAll(“ +”,” ”);
7. 使用Socket編寫一個程序,客戶端向服務器端發送請求(發送字符串即可),服務端接收后發送反饋信息.(10分)
TCP協議
網上例子很多 自己找。代碼過長
8. 用SQL語句實現Oracle分頁查詢。(10分)
Select * from (select ROWNUM rn,t.* from tableName T where t.rn <=40) TT where tt.rn >=10
Select * from tableName where userID limit 0,20;
- aa,bb表都有20個字段,且記錄數量都很大,aa,bb表的X字段(非空)上有索引, 請用SQL列出aa表里面存在的X在bb表不存在的X的值,請寫出認為最快的語句,並解譯原因。(10分)
select a.x from aa a where not exists (select 1 from bb b where a.x = b.x)