1. 程式人生 > >2016年網際網路面試總結

2016年網際網路面試總結

今年的找工作之旅也差不多到尾聲了,其實已經一兩個月沒有面試了,想了一下還是記錄一下面的幾個公司吧,只記得那些能記起來的了。
我面的崗位是Java研發工程師,所以涉及的都是這方面的知識點吧。。

實習篇

1.摩根士丹利

第一場面試就是摩根。。。面試官很nice,主要問的問題:
(1)介紹了一下專案並說說自己做的那一部分(介紹完才發現,自己做的太low了,還需準備)
(2)多型。c++中虛擬函式,在派生類中重寫虛擬函式,在執行時怎麼知道我具體是執行的哪個子類中的。
(3)java中常用的Collection有哪些
答: List,包括ArrayList和LinkedList。ArrayList內部是由陣列實現的,可改變長度。LinkedList是連結串列實現的,不可改變長度。
問:

你說的可變長度和不可變長度,是不是意味著你一般定義LinkedList的長度,比方說10,然後超過就不可以了?
答:不是的,不一定是要寫明LinkedList的長度,不定義的話應該是機器決定你的LinkedList最大能開闢多少的空間。。我只要在我需要的範圍內add資料。
問:那如果有很多很多的add操作,會遇到什麼問題,不可能無限的空間給你add啊
答:是啊。。。所以有一定的範圍,LinkedList最大能有多少空間我覺得應該是機器決定的吧,32位機和64位機應該不一樣吧(蒙,其實我不太清楚)
問:好吧,還有其他你常用的Collection嗎?
答: Set,主要有HashSet,TreeSet,LinkedHashSet,然後分別解釋了一下這三者之間的不同
問:
分析一下HashSet和TreeSet的複雜度,插入,查詢等時候。
答: HashSet應該跟它的hash有關吧,如果只是普通的雜湊碼,可能會造成很多衝突,這樣連結串列就會比較長,查詢的時候遍歷連結串列時就會比較慢,但是你用優化方法去解決衝突,例如二次探測什麼的,減少衝突,應該會比較快吧,TreeSet內部使用的紅黑樹,查詢和插入順序應該是O(log(N))吧。。。
然後就換另一問題了。。。沒再繼續問下去。

回頭查了一下,我的回答不太準確。
  對於ArrayList和LinkedList,我竟然忘記說ArrayList是基於動態素組實現的,所以查詢速度比較快,適用於頻繁查詢操作,LinkedList適合於頻繁插入、刪除的操作。。。
  至於ArrayList和LinkedList能儲存的最大容量,ArrayList理論上不能超過Integer.MAX_VALUE,看

文件說明
這裡寫圖片描述
  至於LinkedList,由於它是由連結串列實現的,理論上不限制長度,看記憶體空間到底有多大。但是要注意的是,LinkedList也有size()函式,返回值有一定的限制。

(4)解釋一下內部類,並寫一個內部類和匿名內部類
答:內部類就是將一個類的定義放在另一類的定義內部。
然後我舉了一個匿名內部類的例子,我們常用的Thread

Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

            }
        })

問:在你寫的run()函式中,可以用外部定義的變數嗎?
答:可以啊,匿名內部類總應該只能是final型別變數。。
問:你平常寫一般的內部類比較多還是匿名內部類比較多
答:普通的內部類啊
問:舉個例子
答:一時腦抽,想不起來具體的例子了,orz。。。。

補充:
  當生成一個內部類物件時,此物件與製造它的外圍物件之間就有一種聯絡,所以它能訪問其外圍物件的所有成員,而不需要任何特殊條件。此外,內部類還擁有其外圍類的所有元素的訪問權。
  想想我們為什麼要需要內部類?每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。由於類不能多繼承,內部類能有效的實現”多重繼承“
  舉個內部類的例子:
  把Node類放在LinkedList類內部,每次插入一個元素時,生成Node類的一個物件。

(5)由上一題引出問題,加了static的內部類和不加static的區別。然後說一下對static關鍵字的理解。
加了static關鍵字的內部類即巢狀類。普通的內部類物件隱式地儲存了一個引用,指向建立它的外部類物件,當內部類是static是,就不是這樣了,意味著:
1)要建立巢狀類的物件,並不需要其外部類的物件
2)不能從巢狀類的物件中訪問非靜態的外圍類物件。
普通內部類的欄位和方法,只能放在類的外部層次上,所以普通的內部類不能有static資料和欄位,也不能包含巢狀類。但是巢狀類可以包含以上所有東西。

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}

對於static變數或方法等,不需要例項化類的物件就可以呼叫,它不是“面向物件”的。
(6)介面和抽象類的區別,自己寫一個抽象類和介面的例子。例如你常用的介面有哪些
答:
介面與抽象類的區別:
1)抽象類可以有建構函式,介面沒有
2)抽象類中有普通成員變數,介面中沒有普通成員變數
3)抽象類中可以有抽象方法和非抽象方法,介面中的方法都是抽象的
4)抽象類中的抽象方法的訪問型別可以是public,protected的,但是介面中的抽象方法只能是public的,預設是public static型別
5)抽象類中可以包含靜態方法,但是介面中不能包含靜態方法。
6)一個類可以實現多個介面,但是隻能繼承一個類。

常用的介面Runnable,,HttpServletRequest ,,HttpServletResponse 等等

其實感覺自己說的並不怎麼好。
總結一些知識點:
常見的介面:Comparable ,Collection,Set,Map,List,Runnable等等
常用的類:java.lang.Object、java.lang.String、java.lang.StringBuffer、java.lang.Math、java.lang.System,java.util.Vector,java.util.Date,java.text.DecimalFormate
常用的包:java.lang、java.awt 、java.io 、java.util 、java.sql
常見的執行時錯誤:
Exception:
java.lang.NullPointerException,java.lang.ClassNotFoundException, java.lang.ArrayIndexOutOfBoundsException,java.lang.IllegalargumentException,
java.lang.InterruptedException

Error:
java.lang.StackOverflowError
java.lang.OutOfMemoryError

具體也可檢視文件:點此

阿里

一面(2016.3.25)

1.自我介紹
2.介紹一下專案
3.根據專案(我有一個專案涉及到爬蟲,就問了一點關於爬蟲的問題)。給定一些爬取頁面的url關係圖,怎麼判斷現在遍歷到的頁面已經爬過了?有沒有快速一點的方法?
4.講一下List,Set,Map之間的區別。給出一串數字,要按輸入的順序輸出,用哪種容器來存?如果我已經規定要用Map來存,那滿足這種條件的話用什麼Map,等等等等
5.java是一門面向物件的語言,講一下其面向物件的特徵
6.函式重寫和函式覆蓋的區別
7.抽象類和介面的區別
8.多執行緒一般怎麼實現,什麼時候用Runnable?什麼時候選擇用Thread,你的專案中有用過多執行緒嗎?用在什麼地方?
Runnable主要還是考慮到程式的擴充套件,因為java不支援多繼承。
9.你會如何實現一個單例模式?
延遲載入 執行緒不安全
直接建立 執行緒安全

public class Singleton{
    //類載入時就初始化
    private static final Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

還可以參考下這個連結的內容
10.瞭解jvm嗎?堆記憶體結構
11.資料庫索引。假設我有一張表,在姓名name欄位建立了索引,現在要找姓王的所有使用者,sql語句怎麼寫? 什麼時候建立的索引有效,什麼時候建立的索引會失效? 如果在性別欄位(只有男和女兩種情況),有沒有必要建索引?
select * from tb where name like “王%”
左匹配的時候可以用索引
有匹配的時候索引失效。 “%琴”這種,雖然name欄位建立了一個索引,但是沒有用。
12.專案用了什麼框架?
13.講講你對spring框架的理解?它有什麼優點?
14.jsp 的四個作用域 :page、request、session和application的區別
15.session是怎麼跟蹤使用者資訊的?我怎麼知道這個使用者就是之前登入的使用者?
16.OOM,碰到過哪些?一般怎麼想辦法解決的?
17.bean中作用域singleton和prototype的區別?
18.程序與執行緒的區別

二面(2016.4.6)

1.自我介紹
2.介紹專案,碰到什麼難點,怎麼解決的? 我說了一些,然後說要改些什麼,問那有什麼改進的想法了嗎。。
3.講一下jvm類載入過程
4.有沒有做過開源專案,看過的開源專案
5.對未來有什麼規劃
6.關於崗位的(意思是如果換崗,會接收嗎?)
7.有什麼想問的問題

網易(2016.4.6)

一面

1.專案用到哪些技術
2.spring框架有哪些優點
3.AOP。。一般你是怎麼實現的?答:代理。。哪些代理? 動態代理和cglib動態代理區別
4.用過哪些集合。寫一個連結串列中刪除元素的程式碼。(我有用迭代器+remove操作),remove操作可能會出現什麼問題
5.給一個連結串列,怎麼實現排序(答,繼承Comparable介面重寫compareTo函式,或者自定義比較函式),問兩者又有什麼區別。。
6.執行緒。專案中用到多執行緒嗎?什麼情況下用?
7.如何返回執行緒的狀態(答的currentThread()是獲取當前執行緒的狀態,答錯了。。。)

Class A()
{
    .........
    synchronized(this)//(1)
    {
    }
    synchronized(A.class)//(2)
    {
    }
}

Thread t1,t2指向的是同一個物件,當t1進入(1),t2能進入(1)嗎?能進入(2)嗎?延伸好多,記不太清

8.在寫同步的時候要注意的問題,例如用synchronized時會出現什麼問題?(答,可能會出現死鎖之類的,舉了個例子,不知道答得在不在點上)
9.jvm。。學了些什麼,說一說。就介紹了一下類載入等過程
10.接觸過哪些設計模式。舉例
11.hashMap,ConcurrentHashMap

二面

1.描述在瀏覽器中敲入一個網址後所發生的事情
2.DNS埠號
3.get/post區別
4.紙上寫題,字串反轉
5.有沒有接觸過分散式,hadoop之類的
6.執行緒有哪些實現方式
7.垃圾回收過程
8.給出2G的記憶體,大概可以建多少個執行緒

校招一面

被虐。。
1.資料庫:事務(包括ACID屬性), Innodb
有一張表,id,userid,type,money
(1)求出前五項消費最高的類目
(2)求出每個類目下消費最高的使用者id
2.網路程式設計
3.作業系統
4.專案中要到多執行緒的地方,包括爬蟲用到多執行緒的地方都要了解
5.jvm記憶體管理,GC,檢視GC的命令

騰訊

1.C++多型,常用的STL
2.vector,list區別,其內部的排序演算法用的是哪種排序
給出一個連結串列,能用快排進行排序嗎?(不能開闢額外空間)
3.用過網路程式設計嗎?(木有) TCP 連線,斷開過程,視窗,擁塞控制
4.記憶體管理
5.map是怎麼實現的,hash key值時複雜度,如果不用hash,用平衡二叉樹怎麼樣?兩者有什麼優劣?map插入刪除時如果多執行緒的話怎麼保證執行緒安全?如果用的是hash演算法,當連結串列太長是,需要rehash,怎麼保證執行緒安全。。。
5.檔案系統,linux (不會,orz)
6.手寫程式,給出一顆完全二叉樹,現在要插入下一個節點,怎麼實現,時間複雜度多少?(我寫了一個log2Nlog2N 的。。)
貌似就這些,中間展開比較多,還談了一些比賽,專案。。

微軟

一面:

1.聊了一部分專案
2.有一個大檔案,裡面存著URL,現要隨機取K個URL,怎麼隨機抽取並寫入到檔案。
可以參考這個部落格

二面:

1.給出一個int範圍內的數,例如10,轉換成二進位制數為0000….1010,求出這個二進位制數中有多少個0構成的塊,0000…00001010 ,有3個0構成的塊
2.給出含有n個元素的int型別的陣列和一個int型別的數K,求陣列中的那些元素乘積等於K,給出所有元素的組合

三面:

1.有兩個字串,例如S1=abcbcd,S2=abcd,求S2是否包含在S1中,如果有,則輸出每種結果對應的下標,例如S1=abcbcd,S2=abcd時,下標的組合:{0125,0145,0345}
2.現有32G的資料,但是隻有8G的記憶體,怎麼對這些數進行排序。
3.有一個大檔案,裡面存著電話號碼,現給出一個電話號碼,判斷該電話號碼在不在該檔案中。
4.現有一個大檔案,存著電話號碼該該電話號碼對應的話費記錄,選出前10000個消費最高的電話號碼(NlogK)

校招篇

京東

1.介紹簡歷中的專案
2.爬蟲url去重,bloomfilter原理,影響bloomfilter效率的兩個引數
3.資料庫。我說了mybatis,引數中$和#的區別;悲觀鎖、樂觀鎖;Innodb和MyISAM的區別;資料庫優化,索引,怎麼快速檢視索引建立的索引有沒有生效;資料庫執行計劃;。
4.sql注入和防範方法;垂直越權。
5.實現多執行緒的幾種方法;Future的特點。
6.開放題。如果伺服器上運行了一個程式,過一段時間發現他執行越來越慢,費時了,可能是什麼原因造成的,你會從哪些角度來考慮?
答:分析一下日誌,有可能是記憶體問題,導致一直產生full gc,那可能就影響速度了。。比如一開始分配記憶體不足,所需的物件又佔較大記憶體。。。blabla
問:那怎麼找到這個有問題的物件。。
答:blabla。。。
問:現在假設記憶體是正常的,那有可能是什麼原因?
答:那可能程式有bug等,執行費時的程式。。jvm沒有優化等等。。
問:那怎麼找到有問題的程式碼。。orz
答:blabla。。
問:現在假設這些都不是問題,線下測試是正常的,線上比較慢。。又是什麼原因?
答:網路問題吧。。地址解析。。有沒有快取等,或者防火牆攔截?。。blabla。。
感覺在亂答。。orz。。
7.手寫程式,寫一段你認為最好的單例模式的程式碼
8.有沒有用linux,hadoop等,有哪些你認為是自己的有點我沒有提到的?有什麼想問我的。。
還有哪些。。忘記了。。。

網易

一面

spring AOP,IOC,bean預設:singleton
spring MVC
synchronized和lock
Collection
jvm:記憶體都組成,GC
HashMap和CurrentHashMap的不同,HashMap的內部實現所用的結構
快取,一級快取,二級快取
執行緒池
紅黑樹

二面

Collection和Collections
IO和NIO
jvm:-Xmn,-Xms,-Xmx分別代表什麼,-XX:SurvivorRatio的含義
優先佇列的內部實現
斐波那契的實現
關係型資料庫,非關係型資料庫
生產者和消費者
開放題:
瞭解的一些中介軟體
在看的相關領域的書
java比較流行的一些框架

好像還有華為,騰訊之類的,騰訊二面跪了,各種分散式的知識,剛好碰到來了自己不熟了一塊,打的不好,校招面試差不多和實習的類似,就不記了。
總而言之,實習面試就是刷經驗的,第一場面試擔心的要死,面到後來都麻木了,也不太會緊張了,所以實習面試的時候要多刷一下。

準備資料

  面試主要還是考察基礎知識扎不紮實。當然,我們這個專業,專案經驗也是豐富一點的好,主要能說出自己參與的內容,幾個亮點。
  整理一下我主要看的一些書:

基礎篇(Java)

  《Java程式設計思想》(一些基礎,遇到不熟的時候翻一翻)
  《Effective Java》
  《Java併發程式設計實踐》
  《深入理解Java虛擬機器》
  《Java面試寶典》(雖然看了,但是感覺很一般。。還是看看其他系統的書,早點準備的好)
  上面是我看的一部分Java的書,都還是不錯的,但是書畢竟是理論,還是要結合工程等,時間操作一遍印象更深刻。
  能看一些原始碼是最好不過了,可以學到不少。簡短一點的,MyBatis的原始碼可以看看,還是能看的,也能學到不少設計模式等知識。

網路篇

  網路的相關知識在面試中也是經常遇到。下面的書可做參考:
  《HTTP權威指南》
  《TCP-IP協議族》
  《TCP-IP詳解卷1:協議》(有好幾卷,基礎的話看看卷1好了)
  網路我基礎不太好,面試中當然也是問一些很基礎的網路知識,把基礎補補好。
  

資料庫

  資料庫的其實看的不多。這邊還不錯吧
  《高效能MySQL》

分散式

  我對分散式不熟悉,但是其實蠻重要的,要在實踐中去學,面試其實面的不多,就騰訊什麼的好像問到了。
  《大型分散式網站架構 設計與實踐》
  《大型網站技術架構 核心原理與案例分析》
  我就稍微看了一點上面兩本書,還可以,面試的問題其實書上也提到過的,只是我自己沒有相關的專案實踐,所以面試的時候也沒答好,能配合專案去操作一遍再好不過吧。

演算法篇

  演算法的話,還是看你要面試什麼公司吧,外企什麼的那可能要演算法啦,耍耍leetcode之類的。其他國內的網際網路公司其實問的不多,就面試到最後問個一題,或者乾脆不問。要面試外企的則要好好刷題。
  《程式設計之美》
  《劍指offer》
  演算法光看書沒什麼軟用,需自己把書上的題自己實現一遍,《劍指offer》上的題很多在leetcode上是有的,可以去那邊刷一下驗證一下自己的想法。

其他

  作業系統很慚愧,我沒有好好準備這一塊,一塊軟肋。。
  《設計模式 可複用面向物件軟體的基礎》(這本看起來挺枯燥的,我一般看網上的資料,然後看一眼這本書中的介紹。單例模式當然是問的比較多的,幾種實現方法要能寫出來。設計模式需掌握各3-4種比較常見的)
  《瘋狂Java講義》
  要需要了解一些框架,比如Spring,知道AOP,IoC之類的概念,MVC等,這個做過相關工程的話應該還是能說上一些的。

  面試的準備貌似就看了上面的一些書吧。重在實踐2333。雖是投了Java開發崗,肯定還是不能只關注於此,做實驗處理資料什麼的就覺得Python比Java好用多了。。(●’◡’●)
  還有關注一些網際網路的事實,一些發展,可以扯扯淡,主要用於面試到後期的情況吧,前期主要面基礎。。別再基礎面掛了就好,哈哈哈。