前言
面試了一周了,經歷了各種面試,好的壞的,時間長的時間短的,大公司小公司都有。經歷筆試的公司並不是太多,不過也有,這次就先總結經歷的筆試題,也有些筆試題我沒記錄下來,主要是覺得沒有什么意義,因為有的地方還問一下比較陳舊的技術,這種問題就直接不想答了,比如有的公司還在問JSP的九大內置對象。互聯網公司現在用JSP的已經寥寥無幾了吧。
前期先做一下總結,等找到工作后再做全面的面試經歷總結。為了確保對公司的隱私,公司的名字我就不寫了,以做什么內容代替吧。
筆試
某生鮮互聯網公司
一、單選題
1. 在發布-訂閱(publish-subscribe)消息模型中,訂閱者訂閱一個主題后,當該主題有新消息達到時,所有訂閱者都會受到通知。下面哪個設計模式最適合這個模型?
A. 適配器(Adapter) B. (Bridge)橋接模式 C.狀態模式(state) D. 觀察者模式(Observer)
【答】D.觀察者模式,這個要對這幾個設計模式有了解才能知道是哪個。
2. 棧和隊列的共同特點是
A. 只允許在端點處插入和刪除元素
B. 都是先進后出
C. 都是先進先出
D. 沒有共同點
【答】A. 只允許在端點處插入和刪除元素。這個了解了這兩種數據結構就明白了,排除法也能排除掉。
3. 下面哪個表達式是不合法的
A. List<? extends Number> foo = new ArrayList<Double>();
B. List<? super Number> foo = new ArrayList<Integer>();
C. List<? super Integer> foo = new ArrayList<Number>();
D. List<? extends Integer> foo = new ArrayList<Integer>();
【答】B. List<? super Number> foo = new ArrayList<Integer>(); 這個問題我沒有注意到中間兩項泛型里面是super,我看成了四個選項都是extends了,所以當時選的是C。
4. 假如某個JAVA進程的JVM參數配置如下:-Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3, 請問eden區最終分配的大小是多少?
A. 64M B. 500M C. 300M D. 100M
【答】C .300M 這題要對JVM內存結構有了解,-Xms1G 代表堆內存默認為1g容量,-Xmx2G 代表堆內存最大為2g容量, -Xmn500M 代表新生代的默認容量為500M, -XXMaxPermSize=64M 表示永久代最大容量64M, -XX:+UserConcMarkSweepGC 代表使用CMS垃圾收集器,-XX:SurvivorRatio=3, 代表eden區和兩個Survivor區的比值是3:1:1,所以eden區的大小為500M的五分之三300M。
5. 下列不屬於網絡層協議的為
A. TCP B. IP C. IPX D. ICMP
【答】A. TCP 哎。。。,網絡編程這塊是我最薄弱的地方,所以一些基本的只是我也不太清楚,這個沒答對,當時選的是D。
二、多選題
6. 文件aaa的訪問權限為rw-r--r--,現要增加所有用戶的執行權限和同組用戶的寫權限,下列哪些命令正確的是?
A. chmod a+x g+w aaa
B. chmod 764 aaa
C. chmod 775 aaa
D. chmod o+x g+w aaa
【答】AC , 在linux系統中,drwxrwxrwx —— 第一位表示文件類型,第一個rwx表示所有者的讀/寫/執行權限,第二個rwx表示同組用戶的讀/寫/執行權限,第三個rwx表示其他用戶的讀/寫/執行權限。根據題目要求,修改后的文件權限應該為rwxrwxr-x,即111111101 = 775。
7. ls -l顯示如下:-rwxrw-r-- 1 aaa bbb 0 3月 4 11:21 ccc ,下面哪些說法是正確的?
A. 該文件是個目錄
B. 該文件擁有者所在組用戶有權限修改文件
C. 該文件權限的數字表示是764
D. 該文件擁有者是bbb
【答】BC,ccc是一個文件,權限數字是764(-rwxrw-r--轉8進制),擁有者是aaa,所在用戶組是bbb,文件大小為0,最后修改時間為3月4日11:21
8. 以下有關http協議描述中,哪些是正確的?
A. Post請求一般用於修改服務器上的資源,對發送的消息數據量沒有限制,通過表單方式提交
B. http返回碼中302表示永久重定向,需要更新URI
C. 可以通過206返回碼實現斷點續傳
D. http1.1實現了持久連接和管線化操作以及主動通知功能,相比http1.0有大幅性能提升
【答】ACD , 這個網絡編程又到了我的軟肋了,這個真的不知道答案,正確答案也是后來在網上搜出來的,當時就蒙了一個D選項。網絡編程的書籍已經准備好了,馬上就要學習起來這塊的知識。
9. 以下哪個函數不能直接出現在WHERE子句中?
A. SUM B. COUNT C. ORDER BY D. GROUP BY
【答】AB,這個還是比較簡單的,聚合函數不能出現在where后面。
10. 假設系統按單道方式運行且采用短作業優先算法,有J1,J2,J3,J4 共4個作業同時到達,則以下哪幾種情況下的平均周轉時間為10分鍾?
A. 執行時間:J1: 1分鍾 J2: 5分鍾 J3: 9分鍾 J4: 13分鍾
B. 執行時間:J1: 1分鍾 J2: 4分鍾 J3: 7分鍾 J4: 10分鍾
C. 執行時間:J1: 2分鍾 J2: 4分鍾 J3: 6分鍾 J4: 8分鍾
D. 執行時間:J1: 3分鍾 J2: 6分鍾 J3: 9分鍾 J4: 12分鍾
【答】BC,以A選項為例:四個作業同時達到,由於采用單道方式運行且短作業優先,J1無需等待,執行1分鍾完成;J2等待1分鍾,執行5分鍾完成;J3等待6分鍾,執行9分鍾完成;J4等待15分鍾,執行13分鍾完成。—— 故四個作業平均周轉時間為:(J1*4+J2*3+J3*2+J4)/4
11. 以下哪些事件會直接導致Linux系統從用戶態切換到內核態?
A. 響應硬件中斷
B. 編譯程序源碼
C. 執行系統調用
D. 查看系統日志
【答】AC,系統調用、硬件中斷會觸發用戶態到內核態的切換。Linux的知識也不是太了解,這塊內容也是以后要惡補的地方(標注起來)。
12. 以下說法中正確的有?
A. StringBuilder是線程不安全的
B. Java類可以同時用abstract和final聲明
C. HashMap中,使用 get(key)==null可以判斷這個Hasmap是否包含這個key
D. volatile關鍵字不保證對變量操作的原子性
【答】AD,StringBuilder是線程不安全的是對的,Java類可以同時被abstract和final修飾,abstract修飾類是為了讓子類去實現自己的功能,而final修飾的類是表示不能有子類,這兩個關鍵字相互矛盾所以應該是不可以同時修飾一個類的,HashMap中是可以存在值為null的鍵值對的。所以不可以通過get(key)==null來判斷,volatile可以保證變量的可見性,不能保證變量操作的原子性,(例如:i++這種操作是需要轉變成 new AtomicInteger(i).incrementAndGet())。
13. 下列哪些類型能被throw語句拋出?
A. Error B. Exception C. Throwable D. Object
【答】ABC,Error也是可以被throw的,只是通常Error出現程序就中斷了,我們並不會去捕獲。
14. 以下不同的數據庫類型中,哪些不屬於關系型數據庫范疇?
A. MongoDB B. PostgreSQL C. Redis D. HBase
【答】ABD,這個用過這幾個數據庫的應該一下就能分辨出來。
三、主觀題
15. Java如何進行序列化
【答】Java中如果想要將某個對象序列化,該對象的類需要實現Serializable接口或者實現Externalizable接口。不同的是:實現Serializable接口無須實現任何方法,而實現Externalizable接口則必須為 writeExternal() 和 readExternal() 兩個空方法提供實現。—— 在目標類實現了接口以后,就可以通過 ObjectOutputStream 將目標類對象進行序列化並輸出了。
16. Exception,Error,RuntimeException在java異常處理中有什么不同
【答】Java中的異常分為 Error 和 Exception。其中Error一般指與虛擬機相關的錯誤,如系統崩潰、虛擬機錯誤、動態鏈接失敗等,應用程序無法處理這些錯誤;Exception則是指應用程序本身可以處理的異常,它分為Checked Exception和RuntimeException —— Checked異常,也叫編譯時異常,Java編譯器強制要求我們必須對出現的這種異常進行catch處理,否則程序就不能編譯通過;RuntimeException,即運行時異常,編譯器不會檢查運行時異常,我們也可以不處理,當出現這樣的異常時,總是拋出由虛擬機接管。當然運行時異常也是可以catch的。
17. wait(), notify()和notifyAll()在使用的時候需要放在同步方法/代碼塊中嗎?為什么?
【答】需要放在同步方法/同步代碼塊中,因為這三個方法必須由同步監視器對象來調用。在同步代碼塊中,同步監視器對象就是 synchronized() 括號中的對象;在同步方法中,同步監視器對象則是隱式的當前對象 this。—— 在調用wait()之前,當前線程已經通過synchronized獲得了同步監視器的對象鎖,調用了wait()以后,線程進入阻塞狀態,並釋放對象鎖;其他線程獲得了同步監視器的對象鎖以后,就開始執行它的同步方法/代碼塊了,在同步方法/代碼塊中如果調用了notify(),則會喚醒在同步監視器對象上wait的任一線程,等剩余的代碼執行完后,釋放對象鎖;被喚醒的線程嘗試獲取對象鎖,獲取到了以后線程繼續向下執行。notifyAll()和notify()類似,只不過notifyAll()是喚醒在同步監視器對象上wait的所有線程,這些線程后續會爭奪對象鎖,誰得到對象鎖誰繼續執行。
18. 編程:在一個整數的數組中刪除另外一個整數數組中的元素,並保留原數組的次序
輸入包括兩行:
1. 第一行是被刪除的整數列表(記為列表A),每個整數之間使用空格分隔
2. 第二行是需要刪除的整數列表(記為列表B),每個整數之間使用空格分隔
輸出只有一行,即列表A中刪除列表B元素后的整數列表,輸出元素按照在列表A中的次序排列,每個整數之間使用空格分隔
樣例輸入:
1 2 3 4 5
2 4
樣例輸出:
1 3 5
這道題的答案不唯一,我給出的思路是,兩個數組轉為兩個ArrayList然后通過兩次遍歷,把第一行數組中和第二行數組中相等的元素放到一個新的list中,最后直接用第一個數組的list調用removeAll刪除到新生成的list中的元素。
某SASS(人力方向的企業服務)公司
/*以下代碼通過給定某LinkedList的第一個元素firstNode,查找第倒數第n個元素,請補全代碼,並糾正其中的錯誤,讓它能夠通過java命令行直接運行,TestUtil不必實現*/
public abstract class Test { class LinkedListNode{ //不用自己實現 } LinkedListNode findTheLastElement(int n,LinkedListNode firstNode){ LinkedListNode found = firstNode; //TODO:具體實現 System.out.println("done"); return found; } static void main(String[] args){ LinkedListNode candidate = TestUtils.init(); Test.findTheLastElement(3,candidate); } }
【答】待糾正的錯誤是findTheLastElement方法不是靜態方法,不能直接使用Test類名調用,main方法沒有使用public修飾符。
具體的實現我一開始覺得比較簡單的,因為LinkedList是雙向鏈表,所以知道了第一個,要求倒數第3個的數量,就直接從第一個往前倒退三個元素就可以了。調用第一個元素的prev獲得倒數第一個元素,再調用倒數第一個元素的prev獲取倒數第二個,然后同樣方法就可以獲取到倒數第三個了。
后來在和第一個面試官聊的時候,如果說現在雙向鏈表改成單向鏈表了,怎么實現這個功能,我想了想,那就通過兩次遍歷來實現,第一次遍歷,知道了LinekedList的長度,長度減3就是目標元素,在第二次遍歷的時候遍歷到目標元素直接就可以取出來了。
后來這個面試官說我這樣雖然可以實現功能,但是麻煩了一些,還有其他的方式嗎?他給出了一種思路,例如:要獲得倒數第3個元素,可以在把前3個元素保存起來,遍歷完后3個元素后,保存的元素就變成了后3個元素,然后知道遍歷到最后一個元素為null,這樣如果說最后一組里遍歷到第一個元素就結束了,那保存起來的三個元素中間那個就是倒數第3個。
這樣一次遍歷就可以找出倒數第3個元素了。
某互聯網教育公司(做中小學生教育培訓的)
這家公司比較奇葩,筆試題七八頁,而且做完了面試題后就和HR聊了聊就讓回去了,我問為什么是先和HR聊,得到的結果是,我們每天約很多人來面試,如果面試官每個都和應聘者面試的話,那面試官一天就只能只面試了。我就呵呵了,面試官的時間是時間應聘者的時間就不是時間了?HR不懂裝懂的還問了問技術的問題,我也是醉了。好了有點跑偏,這家公司的面試題有點多,我就印象最深就是最后的3個邏輯題,其他的題都記不得了。所以就只把最后的3個邏輯推理題寫出來吧。
1. 李娜、葉楠和趙芳三位女性的特點符合下面的條件:
(1)恰有兩位非常學識淵博,恰有兩位十分善良,恰有兩位溫柔,恰有兩位有錢;
(2)每位女性的特點不能超過三個;
(3)對於李娜來說,如果她非常學識淵博,那么她也有錢;
(4)對於葉楠和趙芳來說,如果她十分善良,那么她也溫柔;
(5)對於李娜和趙芳來說,如果她有錢,那么她也溫柔。
哪一位女性並非有錢?
【答】如果李娜有錢,那她也溫柔。根據條件1、2,如果李娜既沒有錢也不學識淵博,那她也是溫柔。因此,無論哪一種情況,李娜總是溫柔。
根據條件4,如果趙芳非常善良,那她也溫柔;根據條件5,如果趙芳有錢,那她也溫柔;根據條件1、2,如果趙芳既不富有也不善良,那她也是溫柔。因此,無論哪一種情況,趙芳總是溫柔。
根據條件1,葉楠並非溫柔,根據條件4,葉楠並不善良,從而根據條件1、2,葉楠既學識淵博又有錢。再根據條件1,李娜和趙芳都非常善良。
根據條件2、3,李娜並不學識淵博。從而根據條件1,趙芳很學識淵博。最后,根據條件1、2,李娜應該很富有,而趙芳並非有錢。
2. 孫某和張某是考古學家老李的學生。有一天,老李拿了一件古物來考驗兩人,兩人都無法驗證出來這件古物是誰的。老李告訴了孫某擁有者的姓,告訴張某擁有者的名,並且在紙條上寫下以下幾個人的人名,問他們知道誰才是擁有者?紙條上的名字有:沈萬三、岳飛、岳雲、張飛、張良、張鵬、趙括、趙雲、趙鵬、沈括。
孫某說:如果我不知道的話,張某肯定也不知道。
張某說:剛才我不知道,聽孫某一說,我現在就知道了。
孫某說:哦,那我也知道了。
請問:那件古物是誰的?
【答】根據孫某說:如果我不知道的話,張某肯定也不知道。這句話可以判斷出來,張某拿到的名字肯定不是“萬三”、“良”;而且可以確定孫某知道的姓肯定不是“沈”和“張”,(因為如果張某拿的是“萬三”,張某肯定知道了答案,而孫某能確定張某肯定不知道,則孫某知道的那個“姓”肯定不是“沈”,同理亦不是“張”),
則剩下的名字還有 趙括、趙雲、趙鵬;岳飛、岳雲。
根據張某說:剛才我不知道,聽孫某一說,我現在就知道了。可以確定他知道的那個名字不是“雲”,(如果是“雲”,聽張某說了之后他還是不能確定答案,因為帶“雲”的名字有兩個)。
剩下的名字還有 趙括、趙鵬;岳飛。
第三句孫某說,他也知道了,可以確定是“岳飛”(如果是兩個“趙”姓 的 “趙括” 或者是 “趙鵬”,則孫某還是判斷不出來)
3. 填數字
3
13
1113
3113
132113
1113122113
( )
請問最后一個括號里應該填哪個數字?
這種找規律的題,一般問總會找一下相加、相乘、相除、或是前后相乘得后面等等這種規律,但是這個題的規律還是比較有意思的,規律是數數字。
還是簡單寫一下吧。
3 3
13 1個3
1113 1個1,1個3
3113 3個1,1個3
132113 1個1,1個3,1個2,2個1,1個3
1113122113 (把這個數字讀出來就得到最后的結果了) 3個1,1個3,1個1,2個2,2個1,1個3
所以最后的結果是:311311222113
寫在最后
其實做面試總結是對自己通過面試來認識到的不足,進行的補充,其實在沒有面試的時候已經認識到自己有哪些方面的不足了,但是臨時補也來不及了,有些東西也並不是臨時補充就能行的,還是要以后要檢查學習,堅持總結,通過認識到自己的不足來制定未來的學習計划,現在的計划是,設計模式->java網絡編程->Linux知識->數據結構與算法->深入理解微服務->spring以及mybatis等開源項目的源碼閱讀。
明天就又要繼續面試了,越挫越勇,加油吧!
