阿里騰訊校招Java面試題總結及答案


阿里校招java面試題匯總

1.HashMap和HashTable的區別,及其實現原理。

 

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的,繼承自AbstractMap,Map interface的一個實現。

 

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。

 

還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

 

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。

 

ArrayList,LinkedList和Vector的區別和實現原理。

 

ArrayList是基於數組的可變長數組,因為這個特性,所以它更適合實現get和set;LinkedList是基於雙向鏈表的,所以比較適合實現插入和刪除等操作;但以上兩個都是非線程安全的,Vector的實現和ArrayList差不多,改進的地方是使用synchronized實現了線程安全。

 

TreeMap和TreeSet區別和實現原理。

 

其中 TreeMap是 Map接口的常用實現類,而 TreeSet是 Set接口的常用實現類。TreeSet底層是通過 TreeMap來實現的(如同HashSet底層是是通過HashMap來實現的一樣),因此二者的實現方式完全一樣。而 TreeMap的實現就是紅黑樹算法。

 

相同點:

 

TreeMap和TreeSet都是有序的集合,也就是說他們存儲的值都是拍好序的。

TreeMap和TreeSet都是非同步集合,因此他們不能在多線程之間共享,不過可以使用方法Collections.synchroinzedMap來實現同步

運行速度都要比Hash集合慢,他們內部對元素的操作時間復雜度為O(logN),而HashMap/HashSet則為O(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模式,以及自己實現的哈希表,線程之間怎樣同步等

 

 

騰訊校招java面試題匯總

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"

 

 

3、兩個線程如何同時監聽一個端口。

 

多個線程可以監聽同一個端口,但我們通常不這樣做。

 

多個進程也可以同時監聽一個端口,比如nginx。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM