1. 程式人生 > >網際網路公司校招Java面試題總結及答案——阿里、騰訊

網際網路公司校招Java面試題總結及答案——阿里、騰訊

部分重複的我已經去掉了,所以顯得比較少,其他請參看我的系列文章:

---------------------------------------阿里--------------------------------------------------- 1.HashMap和HashTable的區別,及其實現原理。 HashTable底層是用HashMap實現的,與HashMap的區別是,HashTable是按存入順序排序的,而HashMap不是。HashMap的原理是有一個大的table陣列組成,每個陣列元素是一個Entry。為了處理衝突,通常會將Entry用連結串列實現。 ArrayList,LinkedList 和Vector的區別和實現原理。 ArrayList是基於陣列的可變長陣列,因為這個特性,所以它更適合實現get和set;LinkedList是基於雙向連結串列的,所以比較適合實現插入和刪除等操作;但以上兩個都是非執行緒安全的,Vector的實現和ArrayList差不多,改進的地方是使用synchronized實現了執行緒安全。 TreeMap和TreeSet區別和實現原理。 其中 TreeMap 是 Map 介面的常用實現類,而 TreeSet 是 Set 介面的常用實現類。TreeSet 底層是通過 TreeMap 來實現的
(如同HashSet底層是是通過HashMap來實現的一樣),因此二者的實現方式完全一樣。而 TreeMap 的實現就是紅黑樹演算法。 相同點:
  1. TreeMap和TreeSet都是有序的集合,也就是說他們儲存的值都是拍好序的。
  • TreeMap和TreeSet都是非同步集合,因此他們不能在多執行緒之間共享,不過可以使用方法Collections.synchroinzedMap()來實現同步
  • 執行速度都要比Hash集合慢,他們內部對元素的操作時間複雜度為O(logN),而HashMap/HashSet則為O(1)。
不同點:
  1. 最主要的區別就是TreeSet和TreeMap非別實現Set和Map介面
  • TreeSet只儲存一個物件,而TreeMap儲存兩個物件Key和Value(僅僅key物件有序)
  • TreeSet中不能有重複物件,而TreeMap中可以存在
  • TreeMap的底層採用紅黑樹的實現,完成資料有序的插入,排序。
ConcurrentHashMap實現原理(鎖分離技術)。String和StringBuffer,StringBuilder區別和聯絡,String為啥不可變,在記憶體中的具體形態。 String:字串常量,字串長度不可變。 StringBuffer:字串變數(Synchronized,即執行緒安全)。如果要頻繁對字串內容進行修改,出於效率考慮最好使用StringBuffer,如果想轉成String型別,可以呼叫StringBuffer的toString()方法。 StringBuilder:字串變數(非執行緒安全)。在內部,StringBuilder物件被當作是一個包含字元序列的變長陣列。 StringBuilder與StringBuffer有公共父類AbstractStringBuilder(抽象類
)。 2.java中多執行緒機制,實現多執行緒的兩種方式(繼承Thread類和實現Runnable介面)的區別和聯絡。 3.java執行緒阻塞呼叫wait函式和sleep區別和聯絡,還有函式yield,notify等的作用。 wait是Object的方法,sleep是Thread類的方法; wait讓出CPU資源的同時會放棄鎖,sleep讓出CPU資源的同時不會釋放鎖; wait需要notify或者notifyall來喚醒,sleep在沉睡指定時間後,會自動進入就緒狀態; 4.java中的同步機制,synchronized關鍵字,鎖(重入鎖)機制,其他解決同步的方volatile關鍵字ThreadLocal類的實現原理要懂。 5.java中異常機制 Throwable是Error和Exception的父類,Error一般是指JVM丟擲的錯誤,不需要捕獲,Exception是程式錯誤,需要捕獲處理; 6.comparable介面和comparator介面實現比較的區別和用法,Arrays靜態類如下實現排序的。 7.問快排的優化,怎麼選基準,我就說隨機化,防止退化。談談快排,於是3種快排4種優化方式,以及partition函式的應用。 3種快排,是指3中基數的選擇方法:固定位置、隨機、三數取中; 4種優化:(1)當待排序序列的長度分割到一定大小後,使用插入排序; (2)在一次分割結束後,可以把與Key相等的元素聚在一起,繼續下次分割時,不用再對與key相等元素分割; (3)優化遞迴操作; (4)使用並行或多執行緒處理子序列; 隨機化可以解決當陣列有序或者部分有序時的退化,但是當陣列元素全部重複的時候,時間複雜度依然很高; 三數取中:對待排序序列中low、mid、high三個位置上資料進行排序,取他們中間的那個資料作為樞軸,並用0下標元素儲存樞軸。這個方法還是無法解決重複陣列的問題。 在一次分割結束後,可以把與Key相等的元素聚在一起,繼續下次分割時,不用再對與key相等元素分割,可以明顯提高重複陣列的效率。 STL中的Sort函式:當資料量較大時採用快速排序,分段遞迴。一旦分段後的資料量小於某個閥值,為避免遞迴呼叫帶來過大的額外負荷,便會改用插入排序。而如果遞迴層次過深,有出現最壞情況的傾向,還會改用堆排序。STL採用的做法稱為median-of-three,即取整個序列的首、尾、中央三個地方的元素,以其中值作為樞軸。 8.在棧上為什麼不能用變數做陣列的長度,堆上可以嗎? 9.問了我的專案,QQ聊天系統,怎麼實現的,客戶端為什麼要用TCP和UDP結合,用UDP協議有什麼好處,訊息是怎樣定義的,怎樣區分不同的 訊息,怎麼知道使用鎖的。我給他說了epoll、執行緒池,Reactor模式,以及自己實現的雜湊表,執行緒之間怎樣同步等 ---------------------------------------------騰訊----------------------------------------------------- 1.TCP/UDP區別,TCP三次握手,SYN攻擊 TCP是面向連線的可靠傳輸,需要三次握手,保證可靠通訊;有重傳機制; UDP是無連線的不可靠傳輸,但是速度快,適用於視訊和電話會議等實時應用場景; TCP三次握手是:SYN=x(SYN_SEND)、ACK=x+1,SYN=y(SYN_RECV)、ACK=y+1(ESTABLISHED); SYN攻擊是:SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費CPU和記憶體資源。 檢測SYN攻擊非常的方便,當你在伺服器上看到大量的半連線狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。 一類是通過防火牆、路由器等過濾閘道器防護,另一類是通過加固TCP/IP協議棧防範。過濾閘道器防護主要包括超時設定,SYN閘道器和SYN代理三種。調整tcp/ip協議棧,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連線和縮短超時時間等。 但一般伺服器所能承受的連線數量比半連線數量大得多 2.SHA,MD5 SHA(安全雜湊演算法):該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預對映或資訊),並把它們轉化為長度較短、位數固定的輸出序列即雜湊值(也稱為資訊摘要或資訊認證程式碼)的過程。可以對任意長度的資料運算生成一個160位的數值。SHA將輸入流按照每塊512位(64個位元組)進行分塊,併產生20個位元組的被稱為資訊認證程式碼或資訊摘要的輸出。SHA-1是不可逆的、防衝突,並具有良好的雪崩效應。 MD5(資訊-摘要演算法5):MD5將任意長度的“位元組串”對映為一個128bit的大整數。MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。 兩者比較: (1)對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。 (2)對密碼分析的安全性:由於MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。 (3)速度:在相同的硬體上,SHA-1的執行速度比MD5慢。
3.瞭解的網路攻擊手段,可以怎麼預防 拒絕服務攻擊: (1)SYN拒絕服務攻擊:目標計算機如果接收到大量的TCP SYN報文,而沒有收到發起者的第三次ACK迴應,會一直等待,處於這樣尷尬狀態的半連線如果很多,則會把目標計算機的資源(TCB控制結構,TCB,一般情況下是有限的)耗盡,而不能響應正常的TCP連線請求。 (2)ICMP洪水:。這樣如果攻擊者向目標計算機發送大量的ICMP ECHO報文(產生ICMP洪水),則目標計算機會忙於處理這些ECHO報文,而無法繼續處理其它的網路資料報文,這也是一種拒絕服務攻擊(DOS)。 (3)UDP洪水; (4)死亡之PING:TCP/IP規範要求IP報文的長度在一定範圍內(比如,0-64K),但有的攻擊計算機可能向目標計算機發出大於64K長度的PING報文,導致目標計算機IP協議棧崩潰。 (5)IP地址欺騙:如果一個攻擊者向一臺目標計算機發出一個報文,而把報文的源地址填寫為第三方的一個IP地址,這樣這個報文在到達目標計算機後,目標計算機便可能向毫無知覺的第三方計算機迴應。這便是所謂的IP地址欺騙攻擊。 4.10億條簡訊,找出前一萬條重複率高的 (1)首先將文字匯入資料庫,再利用select語句某些方法得出前10條簡訊。(索引)但是這個時間效率很低; (2)使用hash計算並存儲次數,然後遍歷一次找出top10;

5.對一萬條資料排序,你認為最好的方式是什麼 申請長度為一千萬位的位向量bit[10000000],所有位設定為0,順序讀取待排序檔案,每讀入一個數i,便將bit[i]置為1。當所有資料讀入完成,便對bit做從頭到尾的遍歷,如果bit[i]=1,則輸出i到檔案,當遍歷完成,檔案則已排好序。本機執行耗時9秒49毫秒。 (這種方法要求陣列中的資料沒有重複,且都不超過最大值) 1、10w行資料,每行一個單詞,統計出現次數出現最多的前100個。 (1)可以使用小根堆; (2)在linux中實現:cat words.txt | sort | uniq -c | sort -k1,1nr | head -10 uniq -c: 顯示唯一的行,並在每行行首加上本行在檔案中出現的次數 sort -k1,1nr:  按照第一個欄位,數值排序,且為逆序 2、一個文字檔案,給你一個單詞,判斷單詞是否出現。 grep -wq "fail" 123.txt && echo "no"||echo "yes" 新手推薦看 http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf 進階推薦看 http://www.tldp.org/LDP/abs/abs-guide.pdf 3、兩個執行緒如何同時監聽一個埠。 多個執行緒可以監聽同一個埠,但我們通常不這樣做。 多個程序也可以同時監聽一個埠,比如nginx。