面試題目

數據結構

  1. 講一下 HashMap 中 put 方法過程?
    1. 對 Key 求 Hash 值,而後再計算 下標。
    2. 若是沒有碰撞,直接放入桶中,
    3. 若是碰撞了,以鏈表的方式連接到後面,
    4. 若是鏈表長度超過閥值(TREEIFY_THRESHOLD == 8),就把鏈表轉成紅黑樹。
    5. 若是節點已經存在就替換舊值
    6. 若是桶滿了(容量 * 加載因子),就須要 resize。
  2. HashMap 中 hash 函數怎麼是是實現的? 還有哪些 hash 的實現方式?
    1. 高 16bit 不變,低 16bit 和高 16bit 作了一個異或
    2. (n - 1) & hash --> 獲得下標
  3. HashMap 怎樣解決衝突,講一下擴容過程,假如一個值在原數組中,如今移動了新數組,位置確定改變了,那是什麼定位到在這個值新數組中的位置,
    1. 將新節點加到鏈表後,
    2. 容量擴充爲原來的兩倍,而後對每一個節點從新計算哈希值。
    3. 這個值只可能在兩個地方,一個是原下標的位置,另外一種是在下標爲 <原下標+原容量> 的位置。
    4. 拋開 HashMap,hash 衝突有那些解決辦法?
    5. 開放定址,鏈地址法
  4. 針對 HashMap 中某個 Entry 鏈太長,查找的時間複雜度可能達到 O(n),怎麼優化?
    1. 將鏈表轉爲紅黑樹, JDK1.8 已經實現了。
  5. 數組和 ArrayList 的區別;
    1. 數組能夠包含基本類型和對象類型,ArrayList 只能包含對象類型
    2. 數組大小固定,ArrayList 大小能夠動態變化
    3. ArrayList 提供了更多的特性(addAll、removeAll)。
  6. Arraylist 如何實現排序
    1. Collections.sort(List<T> list);
    2. sort(List<T> list, Comparator<? super T> c);
  7. HashMap
    1. 數組 + 鏈表方式存儲
  8. 默認容量: 16(2^n 爲宜,若定義的初始容量不是 2^n,容量會定義爲大於該初始容量的最小 2^n)
    1. 例如:初始容量爲 13,則真正的容量是 16.
  9. put:
    1. 索引計算 : ((key.hashCode() ^ (key.hashCode() >>> 16)) & (table.length - 1))
    2. 在鏈表中查找,並記錄鏈表長度,若鏈表長度達到了 TREEIFY_THRESHOLD(8),則將該鏈轉成紅黑樹。
    3. 若在鏈表中找到了,則替換舊值,若未找到則繼續
  10. 當總元素個數超過容量*加載因子時,擴容爲原來 2 倍並從新散列
    1. (元素的下標要麼不變,要麼變爲【原下標+原容量】)。
    2. 將新元素加到鏈表尾部
    3. 線程不安全
  11. HashTable
    1. 數組 + 鏈表方式存儲
    2. 默認容量: 11(質數 爲宜)
  12. put:
    1. 索引計算 : (key.hashCode() & 0x7FFFFFFF)% table.length
    2. 若在鏈表中找到了,則替換舊值,若未找到則繼續
    3. 當總元素個數超過容量*加載因子時,擴容爲原來 2 倍並從新散列。
    4. 將新元素加到鏈表頭部
    5. 對修改 Hashtable 內部共享數據的方法添加了 synchronized,保證線程安全。
  13. HashMap ,HashTable 區別
    1. 默認容量不一樣。
    2. 索引計算方式不一樣。
    3. HashMap 特有的將過長鏈表轉換爲紅黑樹。
    4. 新元素的位置不一樣。
    5. 線程安全性
  14. HashMap、ConcurrentHashMap 區別。
    1. 索引計算消除了最高位的影響
  15. 默認容量: 16(若定義了初始容量(c),容量會定義爲大於(c + (c >>> 1) +1) 的最小 2^n)
    1. 例如:初始容量爲 13,則真正的容量是 32.
  16. 線程安全,併發性能較好
    1. 併發性能好的緣由是 ConcurrentHashMap 並非定義 synchronized 方法,而是在鏈表頭上同步,不一樣的鏈表之間是互不影響的。
  17. ConcurrentHashMap 原理
  18. 最大特色是引入了 CAS(藉助 Unsafe 來實現【native code】)
    1. CAS有3個操做數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作。
    2. Unsafe 藉助 CPU 指令 cmpxchg 來實現
  19. 使用實例:
    1. 對 sizeCtl 的控制都是用 CAS 來實現的
  20. sizeCtl :默認爲0,用來控制 table 的初始化和擴容操做。
    1. -1 表明table正在初始化
    2. N 表示有 -N-1 個線程正在進行擴容操做
    3. 若是table未初始化,表示table須要初始化的大小。
    4. 若是table初始化完成,表示table的容量,默認是table大小的0.75倍,竟然用這個公式算0.75(n - (n >>> 2))。
  21. CAS 會出現的問題:ABA
    1. 對變量增長一個版本號,每次修改,版本號加 1,比較的時候比較版本號。
  22. TreeMap 和 TreeSet 區別和實現原理
    1. TreeSet 底層是 TreeMap,TreeMap 是基於紅黑樹來實現的。
  23. 若是想實現一個線程安全的隊列,能夠怎麼實現?
  24. 知道 LRU 嗎,20分鐘基於 HashMap 實現一個 LRU 算法,面試官給個地址,進去寫代碼,面試官遠程看
    1. 如何設計實現一個LRU Cache?
  25. 二叉樹的遍歷方式,前序、中序、後序和層序
    1. 能夠再寫一篇了。。
  26. 常見的排序算法時間複雜度(排序算法實現也要重點掌握)
    1. 常見排序算法實現(Java)
    2. B+樹的瞭解
    3. 多分支結構有效下降了樹的高度
    4. B 樹的各類操做能使 B 樹保持較低的高度,從而達到有效避免磁盤過於頻繁的查找存取操做,從而有效提升查找效率

 

 

算法題(劍指 Offer 上原題很多)

  1. 怎麼查詢一個單向鏈表的倒數第五個節點
  2. 判斷鏈表是否成環
  3. 兩條相交的單向鏈表,如何求他們的第一個公共節點
  4. 在無序數組中找最大的K個數?
  5. 給定n個數,尋找第k小的數,同時給出時間複雜度
  6. 找一個數組中的第三大數
  7. 找出數組中第一個出現2次的數,
  8. 求 1-N 中數字 1 的個數。
  9. 判斷一個數是否是醜數;
  10. 求第 K 個醜數;
  11. 10w行數據,每行一個單詞,統計出現次數出現最多的前100個。
  12. 一個文本文件,給你一個單詞,判斷單詞是否出現。
  13. 一進去要求敲代碼二叉排序樹的插入、刪除及查找
  14. 某海量用戶網站,用戶擁有積分,積分可能會在使用過程當中隨時更新。如今要爲該網站設計一種算法,在每次用戶登陸時顯示其當前積分排名。用戶最大規模爲2 億;積分爲非負整數,且小於 100 萬;
  15. 判斷一棵二叉樹是不是 BST。
  16. 一副撲克 54 張牌,如今分紅 3 份,每份 18 張,問大小王出如今同一份中的機率是多少;
  17. 50個白球50個紅球,兩個盒子,怎麼放讓人隨機在一個盒子裏抽到紅球機率最高。。。這個就是一個盒子放一個紅球,另外一個盒子放99個球。
  18. logN 查找一個有序數組移動後相似 4 5 6 7 1 2 3裏面的一個數
  19. 0 ~ n 連續 n + 1 數,如今有一個長度爲 n 的數組存放了上面 n + 1 個數的其中 n 個,找出哪個數沒有被放進數組
  20. 將M個平均長度爲N的有序隊列組合成一個有序隊列
  21. 10億條短信,找出前一萬條重複率高的
  22. 對一萬條數據排序,你認爲最好的方式是什麼
  23. 假若有100萬個玩家,須要對這100W個玩家的積分中前100名的積分,按照順序顯示在網站中,要求是實時更新的。積分可能由作的任務和得到的金錢決定。問如何對着100萬個玩家前100名的積分進行實時更新?
  • 除了前100名,後100W-100名玩家的積分,讓變化的積分跟第100名比較,若是比第100名高,那就替換的原則。

Java 基礎

  1. Java 的優點
    1. 語法簡單
    2. 跨平臺
    3. 當開發規模膨脹到必定程度,Java在規範、協做和性能調優上仍是佔有很大優點,在大型應用,尤爲是企業應用上,Java的地位仍然難以撼動
  2. boolean 佔幾個字節
    1. 若是 boolean 變量在棧上,那麼它佔用一個棧單元(32-bits)
    2. 若是在堆上,那麼就跟 JVM 的實現有關了
    3. 在 Oracle 的 JVM 實現,boolean[] 中每一個元素佔用一個字節(8-bits)
  3. Java 訪問修飾符權限的區別;
    1. public 全部類均可訪問
    2. protected 只容許包內、子類訪問。
    3. 默認 只容許包內訪問
    4. private 只容許類內訪問
  4. String 是否能夠繼承, 「+」 怎樣實現?
    1. String 是 final 類,不可繼承。
    2. + 是經過 StringBuilder(或 StringBuffer) 類,和 append 方法實現
  5. String,StringBuffer,StringBuilder,區別,項目中那裏用到了 StringBuffer 或者 StringBuilder
    1. String 不可變
    2. StringBuffer,可變,線程安全
    3. Stringbuilder,可變,線程不安全
  6. String爲啥不可變,在內存中的具體形態?
    1. String 使用 final char value[] 來存放字符序列。
  7. Comparable 接口和 Comparator 接口實現比較
    1. Comparable 是直接在"被比較"的類內部來實現的
    2. Comparator則是在被比較的類外部實現的
  8. Arrays 靜態類如何實現排序的?
    1. 雙軸快排
    2. 首先檢查數組長度,若是比閥值(286)小,直接使用雙軸快排
    3. 不然先檢查數組中數據的連續性,標記連續升序,反轉連續降序,若是連續性好,使用 TimSort 算法(能夠很好的利用數列中的原始順序)
    4. 不然使用雙軸快排 + 成對插入排序
  9. Java 中異常怎麼處理,何時拋出,何時捕獲;
    1. 通常原則是提前拋出,延遲捕獲
    2. 出現異常時,若當前沒法處理則拋,不然捕獲異常,嘗試恢復。
  10. Java 鎖機制
  11. 重入鎖、對象鎖、類鎖的關係
  12. 哪些方法實現線程安全?
  13. Java 中的同步機制,synchronized 關鍵字,鎖(重入鎖)機制,其餘解決同步的方 volatile 關鍵字 ThreadLocal 類的實現原理要懂。
  14. Synchronized 和 lock 區別
  15. 鎖的優化策略
    1. 讀寫分離
    2. 分段加鎖
    3. 減小鎖持有的時間
    4. 多個線程儘可能以相同的順序去獲取資源
  16. Java線程阻塞調用 wait 函數和 sleep 區別和聯繫,還有函數 yield,notify 等的做用。
    1. sleep 時線程的方法(讓出 CPU),wait 是對象的方法。
  17. 談談的 Java 反射的理解,怎麼經過反射訪問某各種的私有屬性
    1. 經過反射,咱們能夠獲取類的運行時內部結構。
    2. 反射 API 中有個方法 getDeclaredFields()
  18. 動態代理的原理
    1. 動態代理基於反射實現,調用者經過代理對象來訪問方法的時候,代理對象能夠作相應的處理,而後經過反射調用被代理對象的方法。
  19. 項目中都是用的框架,用過 Servlet 嗎? Servlet 是單例嗎?多線程下 Servlet 怎麼保證數據安全的?Servlet 的生命週期?
  20. Thread 狀態有哪些

阿里二面準備(Java 研發),精心準備200題(含答案)收割 offer

 

Java 高級

  1. GC 算法,除了常見的複製算法,標記整理,標記清除算法,還有哪些?
  2. 增量算法。主要思想是垃圾收集線程與用戶線程交替執行。也能夠說一邊執行垃圾回收一遍執行用戶代碼。可是這種方法會形成系統吞吐量降低。
  3. 分代收集。這種方法沒有使用新算法,只是根據對象的特色將堆分爲年輕代和老年代,年輕代使用複製算法,老年代使用標記整理算法。
  4. 垃圾收集器
  5. 收集器收集算法收集區域線程停頓特色serial複製算法新生代單線程收集時必須停頓其餘全部工做線程簡單高效serial old標記整理老年代單線程收集時必須停頓其餘全部工做線程PerNew複製算法新生代多線程serial 的多線程版本Server 模式下首選parallel Scavenge複製算法新生代多線程收集時必須停頓其餘全部工做線程注重吞吐量,適合後臺計算多parallel old標記整理老年代多線程收集時必須停頓其餘全部工做線程同 parallel Scavenge

3.CMS(concurrent mark sweep)併發收集、低停頓java

阿里二面準備(Java 研發),精心準備200題(含答案)收割 offer

 

  1. 初始標記(CMS initial mark):僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快,須要「Stop The World」。
  2. 併發標記(CMS concurrent mark):進行GC Roots Tracing的過程,在整個過程當中耗時最長。
  3. 從新標記(CMS remark):爲了修正併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分對象的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但遠比並發標記的時間短。此階段也須要「Stop The World」。
  4. 併發清除(CMS concurrent sweep)

4.G1node

  1. 將整個Java堆劃分爲多個大小相等的獨立區域(Region),雖然還保留新生代和老年代的概念,但新生代和老年代再也不是物理隔離的了,而都是一部分Region(不須要連續)的集合。
  2. 總體使用標記整理,局部使用複製算法。

阿里二面準備(Java 研發),精心準備200題(含答案)收割 offer

 

  1. 初始標記(Initial Marking) 僅僅只是標記一下GC Roots 能直接關聯到的對象,而且修改TAMS(Nest Top Mark Start)的值,讓下一階段用戶程序併發運行時,能在正確能夠的Region中建立對象,此階段須要停頓線程,但耗時很短。
  2. 併發標記(Concurrent Marking) 從GC Root 開始對堆中對象進行可達性分析,找到存活對象,此階段耗時較長,但可與用戶程序併發執行。
  3. 最終標記(Final Marking) 爲了修正在併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分標記記錄,虛擬機將這段時間對象變化記錄在線程的Remembered Set Logs裏面,最終標記階段須要把Remembered Set Logs的數據合併到Remembered Set中,這階段須要停頓線程,可是可並行執行。
  4. 篩選回收(Live Data Counting and Evacuation) 首先對各個Region中的回收價值和成本進行排序,根據用戶所指望的GC 停頓是時間來制定回收計劃。此階段其實也能夠作到與用戶程序一塊兒併發執行,可是由於只回收一部分Region,時間是用戶可控制的,並且停頓用戶線程將大幅度提升收集效率。

5.G1 vs CMSlinux

6.咱們選擇哪一個收集器是由咱們垃圾回收的目標來決定的,主要考慮如下幾點:nginx

  1. 吞吐量
  2. 停頓時間
  3. 堆容量

7.G1 vs CMS面試

  1. G1 基本不用配置,低停頓,用於大容量的堆。可是他犧牲了應用程序的吞吐量和部分堆空間。
  2. CMS 配置比較複雜,合理的低停頓,用於中等或更小的堆。
  3. 因此當你以爲配置 CMS 太難了,或你的堆在 2 G 以上,或你想要顯式的指定停頓時間那麼你可使用 G1。不然使用 CMS

8.Java 內存模型算法

  1. 深刻理解 Java 虛擬機

9.問 JVM 內存分代機制(會問分爲那幾個代,各個代特色),分代回收的優勢(這個問了不少次)。spring

  1. 分爲年輕代和老年代,年輕代中的對象生命週期短,基本是朝生夕死,因此須要頻繁的回收;老年代中的對象通常都能熬過屢次 GC 因此他們不須要頻繁回收。分代收集利用了這種特色,年輕代使用複製算法,老年代使用標記整理算法,因此總的來講分代收集的效率相對仍是不錯的。

10.Java 虛擬機類加載機制,雙親委派模型數據庫

  1. 深刻理解 Java 虛擬機

11.GC roots 不可達的對象是能夠回收的。後端

  1. 棧中的引用的對象
  2. 方法區常量引用的對象
  3. 方法區靜態域引用的對象

12.介紹一下 Java 的強軟弱虛四種引用,問何時使用軟引用設計模式

  1. 通常 new 出來的對象都是強引用,GC 不會回收強引用的對象
  2. 軟引用:軟引用的對象不那麼重要,當內存不足時能夠被回收。很是適合於建立緩存。
  3. 弱引用:只是引用一個對象,若一個對象的全部引用都是弱引用的話,下次 GC 會回收該對象。通常用在集合類中,特別是哈希表。
  4. 虛引用:通常用於對實現比較精細的內存使用控制。對於移動設備來講比較有意義

13.RPC 原理;

  1. 你應該知道的 RPC 原理

三大框架

  1. Spring 主要思想是什麼,回答 IOC 和AOP,怎麼本身實現 AOP ?
    1. IOC 的好處:阿里一面總結 12 題
    2. 使用基於反射的動態代理
  2. SpringAOP 用的哪種代理
    1. JDK 動態代理,這種是通常意義上的動態代理;用一個代理類來間接調用目標類的方法。目標類若是實現了接口那就用這種方式代理。
    2. cglib 動態代理。經過框架轉換字節碼生成目標類的子類,並覆蓋其中的方法實現加強,由於採用的是繼承,因此不能對 final 類進行代理。目標類沒有實現任何接口,就使用這種方法
  3. spring bean 初始化過程
    1. 讀取 XML 資源,並解析,最終註冊到 Bean Factory 中
  4. spring bean 對象的生命週期
    1. 當一個 bean 被實例化時,它須要執行一些初始化(init-method)使它轉換成可用狀態。一樣,當 bean 再也不須要,而且從容器中移除時,須要作一些清除工做(destroy-method)
  5. 講講 Spring 中 ApplicationContext 初始化過程。
  6. SpringMVC 處理請求的流程
    1. 收到用戶請求
    2. dispatcher Servlet 將請求轉發到相應的 Controller
    3. 經過 View Resolver 進行視圖解析
    4. 返回給用戶

7.SpringMVC 的設計模式

8.Spring 的 annotation 如何實現

9.Spring攔截器怎麼使用,Controller是單例嗎

  1. 基於 XML 配置文件
  2. 基於註解
  3. 基於 Spring 定義的 MethodInterceptor 接口

 

 

數據庫

  1. SQL 優化方案
  2. 根據我目前的知識水平,大概分爲兩類:
    1. 多表鏈接時不直接鏈接表,而是先用 where 篩選出符合條件的記錄而後進行鏈接。通常狀況下,篩選一次會除去至關多的無效記錄,這會極大的提升效率。
    2. 判斷當前的 SQL 是否合理的使用了索引。若是設置的索引沒有使用的話,會致使全表掃描。效率上會差不少。沒有利用索引的狀況通常有如下幾種:
      1. 以「%」開頭的LIKE語句,模糊匹配
      2. OR 語句先後沒有同時使用索引
      3. 數據類型出現隱式轉化(如varchar不加單引號的話可能會自動轉換爲int型)
      4. where 子句中對字段進行表達式操做
      5. 在where子句中對字段進行函數操做
  3. 索引有哪些?分別有什麼特色?
    1. 從底層數據結構來劃分的話,主要有兩種:一種是基於 B+ 樹的索引,一種是基於哈希表的索引。基於哈希表的索引在等值查詢上有絕對的優點,但其餘方面就不是很好了。B+ 樹是一種多分支的樹結構,相比二叉樹來講高度下降了不少,可以有效的減小磁盤 IO,因此咱們平時使用的都是基於 B+ 樹的索引
  4. 索引爲何用 B 樹不用二叉樹,有什麼好處?
    1. 基於 B 樹的索引實現,下降了樹的高度,減小了磁盤 IO 的次數。
  5. 數據庫索引優勢和缺點
    1. 優勢:有效加速查詢;
    2. 缺點:操做數據時須要對索引進行更新,效率上稍微差一點;索引須要佔用必定的空間。
  6. 數據庫事務的四個隔離級別,MySql 在哪個級別

阿里二面準備(Java 研發),精心準備200題(含答案)收割 offer

 

MySQL 默認隔離級別爲 Repeatable read

操做系統

  1. 進程和線程的區別
    1. 進程是擁有資源的基本單位,線程是 CPU 調度的基本單位
    2. 進程擁有獨立的地址空間,同一個進程的線程共享該進程的地址空間
    3. 進程上下文切換相對線程上下文切換會消耗更多的資源
    4. 一個進程必須至少擁有一個線程
    5. 一個線程死掉就等於整個進程死掉,因此多進程的程序相對於多線程的程序來講會更健壯
    6. 通訊方式不一樣,線程經過進程內的資源進行通訊,進程的通訊有多種方式,包括管道、共享內存、消息等等。
  2. 進程間通訊
    1. 管道(Pipe)及有名管道(named pipe):管道可用於具備親緣關係進程間的通訊,有名管道克服了管道沒有名字的限制,所以,除具備管道所具備的功能外,它還容許無親緣關係進程間的通訊;
    2. 信號(Signal):信號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於進程間通訊外,進程還能夠發送信號給進程自己;
    3. 報文(Message)隊列(消息隊列):消息隊列是消息的連接表。有足夠權限的進程能夠向隊列中添加消息,被賦予讀權限的進程則能夠讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。
    4. 共享內存:使得多個進程能夠訪問同一塊內存空間,是最快的可用IPC形式。是針對其餘通訊機制運行效率較低而設計的。每每與其它通訊機制,如信號量結合使用,來達到進程間的同步及互斥。
    5. 信號量(semaphore):主要做爲進程間以及同一進程不一樣線程之間的同步手段。
    6. 套接口(Socket):更爲通常的進程間通訊機制,可用於不一樣機器之間的進程間通訊。
  3. 在共享內存中如何使用 mutex
  4. select 和 epoll
  5. 操做系統由哪幾部分組成,進程結構
  6. 多進程和多線程的區別
  7. 何時使用多線程,何時使用多進程
  8. Java 多線程與操做系統線程的關係
  9. 通常線程和守護線程的區別
  10. 多線程與多線程的實現方式
  11. 死鎖的條件,死鎖避免。
    1. 互斥條件
    2. 佔有和等待條件
    3. 不剝奪條件
    4. 循環等待
  12. linux中如何查看進程等命令
  13. 不一樣進程打開了同一個文件,那麼這兩個進程獲得的文件描述符(fd)相同嗎
    1. 不必定,由於打開文件有三個表,inode 表,系統文件描述符表,進程文件描述符表。不一樣進程的文件描述符的範圍是同樣的,有可能恰好相同,也有可能不相同
  14. 兩個線程如何同時監聽一個端口。
    1. SO_REUSEPORT 參數。

計算機網絡

  1. HTTP 狀態碼有哪些,一一解釋含義
  2. 1xx 消息
    1. 100 服務器僅接收到部分請求,可是一旦服務器並無拒絕該請求,客戶端應該繼續發送其他的請求。
  3. 2xx 成功
    1. 200 OK 請求成功(其後是對GET和POST請求的應答文檔。)
  4. 3xx 重定向
    1. 304 Not Modified 未修改的文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
  5. 4xx: 客戶端錯誤
    1. 400 Bad Request 服務器未能理解請求。
    2. 404 Not Found 服務器沒法找到被請求的頁面。
  6. 5xx: 服務器錯誤
    1. 500 Internal Server Error 請求未完成。服務器遇到不可預知的狀況。
  7. HTTP 請求頭有哪些,介紹平時見過的,怎麼利用這些信息來進行先後端調試
    1. Host, 請求的域名
    2. User-Agent,用戶的瀏覽器版本信息
    3. Accept,響應的內容類型
    4. Accept-Language, 接受的語言
    5. Accept-Encoding, 可接受的編碼方式
    6. Cookie,本地的 Cookie 信息
    7. if-Modified-Since, 本地有緩存,若是在那以後沒有作修改,則能夠直接使用本地緩存。
  8. TCP 和 UDP 的區別

阿里二面準備(Java 研發),精心準備200題(含答案)收割 offer

 

  1. HTTP1.0 和 1.1 的區別
    1. 最主要的區別是 1.1 支持持久鏈接。Connection 請求頭的值爲 Keep-Alive 時,客戶端通知服務器返回本次請求結果後保持鏈接;Connection 請求頭的值爲 close 時,客戶端通知服務器返回本次請求結果後關閉鏈接。
    2. 1.1 支持斷點續傳。RANGE:bytes=XXX 表示要求服務器從文件 XXX 字節處開始傳送
    3. 還有一些其餘的改進,有興趣能夠自行查閱相關資料
  2. HTTP 和 HTTPS 的主要區別
    1. 安全。HTTP 直接與 TCP 通訊,而 HTTPS 是先與 SSL(加密) 通訊,而後再由 SSL 和 TCP 通訊
  3. 滑動窗口算法
    1. 又稱回退 N 步(go-back-N),發送方的窗口滑動是由接收方是否已成功收到數據包來決定的。即接收方的窗口向前滑動後發送方的窗口才會向前滑動。//TODO
  4. 域名解析詳細過程
  5. IP 地址分爲幾類,每類都表明什麼,私網是哪些
    1. A:前 1 byte 爲網絡標識,剩下的是主機標識
    2. B:前 2 bytes 爲網絡標識
    3. C:前 3 bytes 爲網絡標識
    4. D:爲多播地址,最高位爲 1110
    5. E:特殊 IP。例如 0.0.0.0,127.0.0.1,255.255.255.255 等等
  6. IP 頭組成;
  7. 計算機網絡中的同步和異步
  8. 發現百度上不去,怎麼辦
    1. 查看 DNS 解析是否正確。如有錯誤,刪除本地 DNS 緩存
    2. 若 DNS 沒有問題,使用 traceroute 檢測路徑,若路徑不通則說明網路阻塞,暫時就別上網了
    3. traceroute 沒有問題,ping 也能通通常就是服務器端出問題了。

分佈式/集羣等高級主題

  1. 負載均衡算法
    1. 隨機:負載均衡方法隨機的把負載分配到各個可用的服務器上。
    2. 輪詢:按順序將新的鏈接請求分配給下一個服務器
    3. 加權輪詢:每臺服務器接受到的鏈接數按權重分配,通常是用在應用服務器的處理能力大小不一樣的狀況下。
    4. 最少鏈接:把新鏈接分配給當前鏈接最少的服務器
    5. BLABAL...
  2. 分佈式數據庫
    1. 分佈式數據庫提供了原來集中式數據庫不具有的高可用性和拓展能力

技術開放題

  1. 如何設計一個高併發的系統
    1. 數據庫的優化,包括合理的事務隔離級別、SQL語句優化、索引的優化
    2. 使用緩存,儘可能減小數據庫 IO
    3. 分佈式數據庫、分佈式緩存
    4. 服務器的負載均衡
  2. 如今一個網頁響應速度明顯變慢了,假如我把這個任務交給你,你怎麼處理這個問題
  3. 負載均衡的大題,數千萬的負載部署到機器上,要求對問題進行抽象,建模,提出解決方案。
  4. 美團面試官來到一個城市面試應聘者,面試有三天,天天面試官上午能夠面試三場,下午能夠面試四場,怎麼設計面試系統,面試者能夠選擇面試日期,面試時間和麪試官。
  5. 有一些爬蟲IP不斷的訪問美團網站,如今美團設定一個IP5分鐘以內訪問美團網站超過100次,就斷定爲爬蟲IP,怎麼設計這個程序?若是100改爲10000,怎麼設計?
  6. 假設在某一時刻由幾萬個併發請求同時產生,請設計一個方案來處理這種狀況。
  7. 問我簡歷上學校 oj 平臺這個項目怎麼實現1000人併發?併發的性能瓶頸在哪?
    1. 由於還沒完成,現處於開發階段,只跟面試官說了下本身的構想,nginx+tomcat集羣,性能瓶頸可能出如今網絡io和java gc上,而後說了下jvm gc的優化,如何實現session共享。最後我問了下面試官這樣設計能夠嗎,他說這樣設計不行可能有問題,沒有告訴我問題出如今哪裏。
相關文章
相關標籤/搜索