美團面試,360面試 ,滴滴面試,阿里面試,百度面試,京東面試,搜狗面試:


一、基礎知識:
    1、CurrentHashMap的數據結構,Java1.8 與 java 1.7的區別,增加了那些特性
  這個其實是考了一下編程思路,hashMap(鏈表+數組)==》1.8之后變成了 鏈表+數組+紅黑樹,   

  參考:ConcurrentHashMap原理分析(1.7與1.8) 

        遍歷Map的方法有四種:

       參考:Java中如何遍歷Map對象的4種方法    

    HashMap,HashTable的數據結構,不同點, HashTable線程安全,HashMap線程不安全;

       參考:HashMap的實現原理--鏈表散列

      參考:Hashtable數據存儲結構-遍歷規則,Hash類型的復雜度為啥都是O(1)-源碼分析 

      參考:HashMap, HashTable,HashSet,TreeMap 的時間復雜度   

      參考:HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別 

      參考:ConcurrentHashMap原理分析(1.7與1.8)-put和 get 兩次Hash到達指定的HashEntry

 

   2、TreeMap 如何實現快速排序的?

    TreeMap其實是二叉排序樹的紅黑樹實現,:對於 TreeMap 而言,由於它底層采用一棵“紅黑樹”來保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比 HashMap 低:當 TreeMap 添加元素時,需要通過循環找到新增 Entry 的插入位置,因此比較耗性能;當從 TreeMap 中取出元素時,需要通過循環才能找到合適的 Entry,也比較耗性能。 

但 TreeMap、TreeSet 比 HashMap、HashSet 的優勢在於:TreeMap 中的所有 Entry 總是按 key 根據指定排序規則保持有序狀態,TreeSet 中所有元素總是根據指定排序規則保持有序狀態。

         參考 紅黑樹與AVL樹

  2、設計模式有哪些,關鍵是;舉例在項目中如何使用,它的優缺點,我竟然語塞了。 

  參考:Java設計模式 - 單例模式

  參考:Java設計模式之代理模式(Proxy)

  參考:設計模式-代理模式(Proxy)

  參考:設計模式-抽象工廠模式

  參考:設計模式-工廠模式-場景以及優缺點-目的就是應對變化 (國江面試回答的) 

  參考:23種設計模式介紹(三)---- 行為型模式

  參考:23種設計模式介紹(二)---- 結構型模式

  參考:23種設計模式介紹(一)---- 創建型模式 

    3、介紹JVM內存模型,垃圾回收機制,新生代垃圾回收用Copying算法,老年代用標記清理(Mark-Compact)

  參考:jvm內存模型-回收算法-和內存分配以及jdk、jre、jvm是什么關系(阿里,美團,京東面試題)

  美團面試官問:JVM的公有區和私有區有啥區別,為啥叫私有區,把我給問住了,

  后來查了一下:私有區指的是,這個區域的隨着線程的開始而開始,結束而結束,生命周期與線程的生命周期一樣,

         公有區:即使線程結束了,也可以訪問,不會回收;

   那么寄存器為什么設計為線程私有?

   我們知道所謂的多線程在一個指定的時間段里只會執行某一個線程的方法,CPU不停切換任務,那么為了能夠准備的記錄各個線程正在執行的當前的字節碼指令的地址,那么就設計為線程私有每個線程都分配一個寄    存器,這樣各個線程獨自記錄不會干擾。這是java虛擬機唯一一個沒有聲明OutOfMemoryError的內存區。;

  參考:java虛擬機學習之線程共享內存區和線程私有區

      4、 G1會stop-the-world嗎,

  答:會,不管選擇哪種算法,都會stop-the-world ,GC調優通常就是為了改善stop-the-world的時間

  參考:CMS收集器和G1收集器優缺點

      5、美團的面試問的太細了,標記-清理法是如何整理的,copying 是如何 划分兩部分的。為什么年輕代的划分是8:1:1,具體是如何進行清理內存的。

   6、什么是代理,反射,以及如何使用?

  參考:深入理解Java反射+動態代理

  7、一個Tomcat 接收請求 到DB 然后返回到用戶;

  Serverlet是單例的嗎?

  答:Servlet容器默認是采用單實例多線程

  Servlet生命周期,大致分為4部:Servlet類加載-->實例化-->服務-->銷毀        

1、Web Client向Servlet容器(Tomcat)發出Http請求。

2、Servlet容器接收Client端的請求。

3、Servlet容器創建一個HttpRequest對象,將Client的請求信息封裝到這個對象中。

4、Servlet創建一個HttpResponse對象。

5、Servlet調用HttpServlet對象的service方法,把HttpRequest對象和HttpResponse對象作為參數傳遞給HttpServlet對象中。

6、HttpServlet調用HttpRequest對象的方法,獲取Http請求,並進行相應處理。

7、處理完成HttpServlet調用HttpResponse對象的方法,返回響應數據。

8、Servlet容器把HttpServlet的響應結果傳回客戶端。

 

        參考:servlet單實例多線程模式

  參考:Servlet 生命周期、工作原理-是單實例多線程

        8、ThreadLocal 變量 的用處,以及 如果想跟蹤一個請求,從接收,處理到返回結果。threadlocal可以在線程的任何位置傳遞參數,獲取這個參數,

             參考:Threadlocal 傳遞參數(百度二面)

       9、String x="ABC";String y=new String(“ABC”); (a)==,(b) equals是否相等,如果使用HashSet添加是否能把兩個都加上;

      答:   x ,y的內存地址不同;因此 (a) x==y的判斷為false;但是String重寫了equals(),判斷值是否相等,因此(b) a.equals(b)的判斷為true; HashSet 只能加上一個;

            參考: Java中String直接賦字符串和new String的區別 如String str=new String("a")和String str = "a"有什么區別?

  

       10、Java 有哪8中基本的數據類型:

  (a)四種整數類型(byte、short、int、long):   

    byte:8 位,用於表示最小數據單位,如文件中數據,-128~127   

    short:16 位,很少用,-32768 ~ 32767   

    int:32 位、最常用,-2^31-1~2^31  (21 億)   

    long:64 位、次常用    注意事項:    int i=5; // 5 叫直接量(或字面量),即 直接寫出的常數。   

    整數字面量默認都為 int 類型,所以在定義的 long 型數據后面加 L或 l。    小於 32 位數的變量,都按 int 結果計算。    強轉符比數學運算符優先級高。見常量與變量中的例子。 

  (b)兩種浮點數類型(float、double):   

    float:32 位,后綴 F 或 f,1 位符號位,8 位指數,23 位有效尾數。   

    double:64 位,最常用,后綴 D 或 d,1 位符號位,11 位指數,52 位有效尾    

  (c)一種字符類型(char):    char:16 位,是整數類型,用單引號括起來的 1 個字符(可以是一個中文字符),使用 Unicode 碼代表字符,0~2^16-1(65535) 。 

  (d)一種布爾類型(boolean):true 真  和 false 假。

 

二、SPRING知識:

  1、Spring 中的BeanFactory和FactoryBean的區別;,Spring的好處。

    參考:BeanFactory 和FactoryBean的區別

  2、spring MVC 原理,AOP,IOC, 請求如何使用DispatchSolove轉發請求。
  3、Spring Cloud的五大神獸,zookeeper的服務發現,數據移植性。

          zookeeper 如何管理集群服務的;如何實現高可用性的

    參考:SpringCloud分布式開發五大神獸

    參考:Spring Cloud 架構 五大神獸的功能

          參考:zookeeper 負載均衡 核心機制 包含ZAB協議(滴滴,阿里面試)

          參考:zookeeper如何實現負載均衡的?(具體連接哪一個zookeeper服務器的選擇?)阿里面試

       參考:Zookeeper 3、Zookeeper工作原理(詳細)

  4、百度的面試官問我,IOC,AOP的原理,如果讓你自己設計IOC功能如何設計

    其實IOC,AOP都是基於反射的機制的,

    AOP更高級一點,用了動態代理

     參考:Spring IOC AOP的原理(百度二面) 如果讓你自己設計IOC,AOP如何處理

    Spring 的Bean的生命周期(阿里的人問過)

      參考:Spring學習10- bean的生命周期(阿里面試題目兩次面試均提到)

 

三、struct2掌握

  參考:Struts2 入門

  參考:三大框架(struct、spring、hibernate)的優缺點

四、服務器搭建部署:

  1、什么是Docker,Docker常用的命令,Docker的優點,

    參考下面的文章,注意多看看后面的總結,阿里抓着常用命令和優點不放,好好看

    參考:Docker 入門 到部署Web 程序- (阿里面試常用的docker命令和優點)

    參考:Docker 入門 到部署Web 程序

  2、Dubble,SOAP,重點就是Dubbo,Dubbo不了解,這是硬傷,一定要好好看看,很多企業都用Dubbo一定要好好看看

    參考:Dubbo:來自於阿里巴巴的分布式服務框架

  3、SOA 架構面向服務,那么他如何提供服務,Web Servcie 包含了三種主流的Web實現方式,他們彼此的區別和聯系,: 

         (a) REST:表征狀態轉變 (基於HTTP協議),主要在分布式框架中使用
      (b) SOAP:簡單對象訪問協議(基於任何傳輸協議,TCP,HTTP,SMTP,MSMQ)
      (c) XML-RPC:遠程過程調用協議 (已經慢慢被SOAP取代)RPC(跨越了傳輸層和應用層,基於HTTP和TCP)

          面試人員問:REST協議與RPC協議的區別和聯系(sougou ,等等:

    參考:SOA,SOAP,RPC,以及 RPC協議與 REST 協議之間的關系(搜狗)

  4、互聯網分布式事務,微服務,比如現在有個系統很大,很多不同的部門進行開發,語言也很多,就使用微服務。用戶管理之類的;

  5、RPC(是否使用過,這個京東,美團,360 的面試多次提及)

    參考:RPC-原理及RPC實例分析

    參考:RPC架構-美團,京東面試題目

    參考:Java實現簡單的RPC框架(美團面試)

  6、對高並發的限流措施類似於CDN轉發,反向代理之類的

            限流措施考慮漏桶算法,令牌桶算法,參考:互聯網應對高峰流量控制- 漏桶算法和令牌桶算法(滴滴面試)

           分布式鎖,參考:分布式鎖簡單入門以及三種實現方式介紹(滴滴)

  7、LVS如何實現負載均衡的,

     (a)NAT(Virtual Server via Network Address Translation NAT(VS/NAT) 大名鼎鼎的IP負載均衡,工作在傳輸層

       (b)TUN (Virtual Server via IP Tunneling(VS/TUN)

       (c) DR Virtual Server via Direct Routing(VS/DR)  直接修改報文的MAC地址,工作在數據鏈路層

       下面的文章感覺不太清楚,但是大體介紹了方向:

       參考:LVS:三種負載均衡方式比較+另三種負載均衡方式

             這個文章更清楚:六大Web負載均衡原理與實現

  8、Zookeeper 如何實現負載均衡的,與kakfa的數據一致性有何區別

    比如兩個IP同時去注冊中心注冊服務,考慮數據移植性的問題。

       參考:zookeeper 負載均衡 核心機制 包含ZAB協議

          參考:zookeeper如何實現負載均衡的?(具體連接哪一個zookeeper服務器的選擇?)阿里面試

       參考:六大Web負載均衡原理與實現

        與kafka的區別和聯系:

      參考:kafka 數據一致性-leader,follower機制與zookeeper的區別;

  9、Tomcat,Jboss,Apache,Weblogic的區別,Tomcat,Jboss,Weblogic都可以部署包,有區別嗎?

    參考:Tomcat Jboss Apache WebLogic區別與比較(阿里面試)

   10、Web容器,Servlet容器、SpringMVC容器的區別:

          我們平時所說的J2EE包含了 標准版:Web容器 (JSF java標准版)和 EJB容器(Java企業版)

         Web容器 里面包含了JSP和 Servlet容器,Servlet用來處理請求;

         比如Tomcat 是Web容器,只能做JSP和Servlet的Container,不支持EJB

                Jboss  它不但是Servlet容器,而且是EJB容器(同時支持EJB的優化版tomcat)

             WebLogic Server是專門為企業電子商務應用系統開發的它不但是Servlet容器,而且是EJB容器

         具體Web容器與Servlet容器的區別聯系:Tomcat Jboss Apache WebLogic區別與比較(阿里面試)

         SpringMVC原理:參考:Spring學習 6- Spring MVC (Spring MVC原理及配置詳解)

  11、自己定義了一個HashMap,按照tomcat的類加載順序,如果別人寫了個hashmap.jar包,你引用了,會不會有問題呢; 

    答,一定不會,webappclassloader類加載器是相互隔離的,tomcat雖然不遵循類加載機制但是上層的還是遵循類加載機制

    參考:圖解Tomcat類加載機制(阿里面試題)

       12、Tomcat 的組成,包含幾部分,如何處理並發數的;

           默認的連接是200個 

 

五、數據結構知識:

        1、 ArrayList 和LinkedList 的區別,另外請說明 ArrayList 的數組的默認大小,以及當超出默認大笑之后,內存如何處理;               

  1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
  2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。
  3.對於新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。

    還有個 ArrayList 如何默認  List<String> abc=new ArrayList<String>(); 

    這個默認是10,現在有個問題,如果我們往下面添加的數據大於10,數組如何存儲:

    這樣,數組會從新拷貝一個新的數組,這個數組的長度如下:

    那么容量變化的規則是什么呢?請看下面的公式:
    ((舊容量 * 3) / 2) + 1  
  注:這點與C#語言是不同的,C#當中的算法很簡單,是翻倍。

  然后把之前的元素拷貝進來,然后,原來的回收掉,變成現在的數組,如果后續繼續大於現在的新size;則還會按照這個模式進行遞增;


  1、目前數據庫有10億數據,如何設計
    使用單組多讀也就是說,一個主數據庫負責讀寫, 其他的從數據庫負責讀,不負責寫,不然延遲太高了。
    然后使用BinLog將主數據庫的數據進行實時同步到從數據庫;

  2、紅黑樹,查找樹,二叉遍歷樹概念 ,紅黑樹的樹高是多少?

    答:紅黑樹高是2log(n+1)

    (1)  紅黑樹的樹高度是2log(n+1)

    (2) 左旋,將“x的右孩子”設為“x的父親節點”;即,將 x變成了一個左節點(x成了為z的左孩子)!

    (3)右旋:將“x的左孩子”設為“x的父親節點”;即,將 x變成了一個右節點(x成了為y的右孩子)!

    (4)紅黑樹的特性:

     R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查找樹。紅黑樹的每個節點上都有存儲位表示節點的顏色,可以是紅(Red)或黑(Black)。
  (1)每個節點或者是黑色,或者是紅色。
  (2)根節點是黑色。
  (3)每個葉子節點(NIL)是黑色。 [注意:這里葉子節點,是指為空(NIL或NULL)的葉子節點!]
  (4)如果一個節點是紅色的,則它的子節點必須是黑色的。
  (5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。   

     參考:紅黑樹(一)之 原理和算法詳細介紹

    參考:紅黑樹與AVL樹

    參考:二叉樹 Java 實現 前序遍歷 中序遍歷 后序遍歷 層級遍歷 獲取葉節點 寬度 ,高度,隊列實現二叉樹遍歷 求二叉樹的最大距離

    參考:平衡二叉樹,AVL樹之圖解篇

     6、單鏈表反轉,兩種方式,迭代和遞歸

       參考:鏈表翻轉的圖文講解(遞歸與迭代兩種實現)

 

六、多線程知識:

       1、什么是線程池,為什么要用,如何實現的,多線程runnable thread 的區別和聯系 

  關於runnable和 thread: 參考:Java 多線程 -Thread 和Runnable 的區別和聯系

  多線程專題:參考:Java-線程池專題 (美團面試題)

  數據庫的連接池專題:MySql數據庫連接池專題

  1、線程的五個狀態,

    參考:Java線程的5種狀態及切換(透徹講解)-京東面試

  2、如何解決多線程的安全問題,無非兩個方法:synchronized 和 lock,它的如何實現的,

    lock使用了AQS(AbstractQueueSynchronzied)隊列實現,

    reentracelock可重入指的是什么?  

    答:可重入的意思是某一個線程是否可多次獲得一個鎖,比如synchronized就是可重入的,ReentrantLock也是可重入的,如何實現的,

    參考:解決多線程安全問題-無非兩個方法synchronized和lock 具體原理(百度)

       3、如何用lock 實現一個synchronized方法體;(lock很簡單,拿到鎖之后,做什么。之類的;)

    參考:使用synchronized實現一個Lock-美團面試題目

    4、線程池的workQueue的拒絕策略是什么?   

       當線程池的任務緩存隊列已滿並且線程池中的線程數目達到maximumPoolSize,如果還有任務到來就會采取任務拒絕策略,通常有以下四種策略: 

ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執行任務(重復此過程) ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務

     參考:深入理解Java之線程池(愛奇藝面試) 

 5、多線程的線程池中,如果是無界隊列那么MaxPoolSize就沒有意義了;

    6、   線程池如何停止線程的?以及interrupt()函數的理解

  ThreadPoolExecutor提供了兩個方法,用於線程池的關閉,分別是shutdown()和shutdownNow(),其中:

               (a) shutdown():調用了Interrupt(); 不會立即終止線程池,而是要等所有任務緩存隊列中的任務都執行完后才終止,但再也不會接受新的任務

               (b) shutdownNow():調用了不安全的stop()函數,強行停止了線程池,類似於斷電關電腦,立即終止線程池,並嘗試打斷正在執行的任務,並且清空任務緩存隊列,返回尚未執行的任務  

     參考:深入理解Java之線程池(愛奇藝面試)

     參考:Java結束線程的三種方法(愛奇藝面試)

  

  7、sleep 和wait()區別:

    參考:sleep、yield、wait、join的區別(阿里面試)

     8、 樂觀鎖,悲觀鎖,的使用場景?

    先說樂觀鎖和悲觀鎖的機制:
    1. 樂觀鎖是一種思想,具體實現是,表中有一個版本字段,第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次查看該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從數據庫加鎖。
    2. 悲觀鎖是讀取的時候為后面的更新加鎖,之后再來的讀操作都會等待。這種是數據庫鎖

樂觀鎖優點程序實現,不會存在死鎖等問題。它解決不了臟讀的問題,他的適用場景也相對樂觀。阻止不了除了程序之外的數據庫操作。

悲觀鎖是數據庫實現,他阻止一切數據庫操作。

  應用場景:

    悲觀鎖:Synchroinzed 和ReentrantLock 都是悲觀鎖,傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。 

    樂觀鎖:數據庫的多版本並發控制,MVCC,就是典型的樂觀鎖。

    參考:Mysql 的InnoDB事務方面的 多版本並發控制如何實現 MVCC

    MVCC注意:

  只有read-committed和 repeatable-read 兩種事務隔離級別才能使用mVcc

  read-uncommited由於是讀到未提交的,所以不存在版本的問題

  而serializable 則會對所有讀取的行加鎖。  

  再來說更新數據丟失,所有的讀鎖都是為了保持數據一致性。樂觀鎖如果有人在你之前更新了,你的更新應當是被拒絕的,可以讓用戶從新操作。悲觀鎖則會等待前一個更新完成。這也是區別。具體業務具體分析 

  參考:Mysql 的InnoDB事務方面的 多版本並發控制如何實現 MVCC

      9、分布式鎖,比如如何高效率的處理秒殺的業務

   參考:分布式鎖簡單入門以及三種實現方式介紹(滴滴)

七、數據庫知識:

  1、redis與memeched的區別:

    redis 和 memeched 都可以做集群,但是redis 可以master-slave備份。(阿里面試)

    參考:Redis和Memcache的區別總結-京東阿里面試

   2、Redis中的Set的時間復雜度是多少,數據結構是什么樣的,Redis的優點和缺點,支持哪五種類型。

    時間復雜度是O(1) 因為Set是value為null的HashMap而已,參考:

  參考:redis 數據類型詳解 以及 redis適用場景場合 

  3、索引掌握,關鍵是啥叫聚簇索引,聚集索引,非聚集索引都是啥啊

    參考:主鍵就是聚集索引嗎?

    參考:索引-數據庫 索引創建默認是非聚集索引

    參考:數據庫-索引 (聚集索引和非聚集索引)

    參考:數據庫索引- 復合索引(多列索引)

    參考: 索引都有哪些類型

    參考:什么時候用索引

    參考:sql-索引的作用(超詳細)

    參考:SQL有三個類型的索引,唯一索引 不能有重復,但聚集索引,非聚集索引可以有重復

  4、SQL 后面有個加號,(+)含義是什么

    參考:oracle的SQL語句中的(+)是干什么用的?

  5、SQL優化一個很大的SQL很慢,如何處理;用profile分析;

    參考:MySQL專題3 SQL 優化 

  6、DB連接池,常用的是兩個:DBCP,C3P0

     DBCP的常用參數包含了

    MaxActive:最大連接數

    MaxIdle 最大空閑數

    MinIdle 最小空閑數

    InitSize初始化連接數

    MaxWait 接池中連接用完時,新的請求等待時間,毫秒 MaxWait是最大等待秒鍾數

      參考:MySql數據庫連接池專題  

     7、Mysql中InnoDB與MyIsam的區別,以及InnoDB支持的三種鎖,行鎖,間隙鎖,next-key鎖;

           最大的區別是:InnoDB支持事務,MyIsam不支持事務。 

           Mysql的MVCC不能解決幻讀的問題,但是Mysql有間隙鎖功能,Mysql的間隙鎖工作在Repeatable Read隔離級別下面,可以防止幻讀, 

      參考:Mysql 間隙鎖原理,以及Repeatable Read隔離級別下可以防止幻讀原理(百度)

    參考:MySql的多存儲引擎架構, 默認的引擎InnoDB與 MYISAM的區別(滴滴)

          8、mysql多版本控制

        原子性(Atomicity), 一致性(Consistency),隔離性(Isolation),持久性(Durability)

       參考:MySql中啟用InnoDB數據引擎簡介 以及 InnoDB與 MYISAM的區別和聯系

              參考MySql的多存儲引擎架構

           參考:數據庫事務的四大特性以及4種事務的隔離級別-以及對應的5種JDBC事務隔離級別

           參考:Mysql 的InnoDB事務方面的 多版本並發控制如何實現 MVCC

          數據庫連接池專題:MySql數據庫連接池專題

八、編程技巧知識:

  JVM調優:jstate查看內存使用,jmap的dump導出日志等

  參考:Jvm dump介紹與使用(內存與線程)

  參考:如何在Windows下查看JAVA端口占用情況(阿里面試)

   參考:jvm調優-從eclipse開始

  參考:Java JVM- jstat查看jvm的GC情況[轉]

九、Maven

  1、如何解決Maven的版本沖突問題

  參考:Maven 3-Maven依賴版本沖突的分析及解決小結 (阿里,美團,京東面試)

      2、關於MAVEN的問題:Release 版本與SNAPSHOT之間的區別

   參考:maven snapshot和release版本的區別

    參考:Maven學習——1、安裝與修改Maven的本地倉庫路徑

 

十、ELK日志收集系統:

  參考:通過ELK快速搭建一個你可能需要的集中化日志平台

十一、對Hadoop的理解

   hadoop中的HBase,Hive,

十二、Hibernate的理解

      1、Hibernate的延遲加載是如何實現的:使用了動態代理

          參考:Hibernate學習--hibernate延遲加載原理-動態代理(阿里電面) 

十三、協議 SOCKET,IO,HTTP ,TCP部分:

     1、 七層架構模型 +和四層架構模型(網絡接口層-->網絡層-->傳輸層 -->應用層)

            TCP三次握手,四次揮手,具體的SYN,ACK指代的含義 

           參考:TCP協議詳解7層和4層解析(美團面試,阿里面試) 尤其是三次握手,四次揮手 具體發送的報文和狀態都要掌握

    2、BIO,NIO(Non-blocked IO),AIO的區別

    參考:IO復用,AIO,BIO,NIO,同步,異步,阻塞和非阻塞 區別(百度)

   3、select,poll,epoll的區別: 

       select,poll,epoll都是IO多路復用的機制   

        (1)select==>時間復雜度O(n)

       它僅僅知道了,有I/O事件發生了,卻並不知道是哪那幾個流(可能有一個,多個,甚至全部),我們只能無差別輪詢所有流,找出能讀出數據,或者寫入數據的流,對他們進     行  操作。所以select具有O(n)的無差別輪詢復雜度,同時處理的流越多,無差別輪詢時間就越長。

       (2)poll==>時間復雜度O(n)

       poll本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢每個fd對應的設備狀態, 但是它沒有最大連接數的限制,原因是它是基於鏈表來存儲的,但是同樣      有一個缺點:

        (3)epoll==>時間復雜度O(1)

        epoll可以理解為event poll,不同於忙輪詢和無差別輪詢,epoll會把哪個流發生了怎樣的I/O事件通知我們。所以我們說epoll實際上是事件驅動(每個事件關聯上fd)的,此時        我們對這些流的操作都是有意義的。(復雜度降低到了O(1))

    參考:select、poll、epoll之間的區別(搜狗面試)

   4、IO 與NIO(New IO)的區別

        參考:Java NIO:IO與NIO的區別 -阿里面試題

     5、Http的數據結構,包含了兩類;response,request;分別是

          (a) Request:請求行,請求頭,空行,請求體

       (b) Response 狀態行,相應頭,空行,相應體

          參考:HTTP協議 結構,get post 區別(阿里面試)

     6、 cookie 和session的區別, session是無狀態的嗎?那如何知道是誰訪問的,怎么過來的,AppSession;

          參考:Session, Cookie區別

十四、即時問題:

  微信如何做到,用手機的微信掃碼就可以登錄電腦客戶端的:

  分析:

    現在有三方,服務器,微信手機端,微信電腦端,

  在電腦端點擊使用微信掃碼登錄,會彈出二維碼,這時候,電腦端會跟服務器端建立長連接。等待服務器指令。

  微信手機端掃碼后,如果手機端登陸了會將登陸的唯一標識傳給服務器,服務器收到唯一標識后,發送報文給微信電腦端,可以登陸了。(一定是微信電腦端先去連接服務器,不能反過來)

 

十五、框架部署知識:

  1、現在我有mysql 3台 Master +2 slave; 我想這樣 請求 Master 承擔20% 兩個 Slave 各自承擔40%如何處理:

  使用:DBProxy(),可以做到這樣,不用改源碼,直接分配請求;

  參考:LVS+Keepalived實現DBProxy的高可用

  我們知道 主從mysql數據庫,通過BinLog進行同步,到底是如何同步的

  答:有個IO線程,一個負責拉取log,另一個負責SQL寫日志,

  2、Spring Cloud 如何處理服務熔斷的,A->B->C 出了問題,如何處理使用Hystrix,目前C服務 是C1,C2,C3三個服務器提供的負載均衡,C1壞了,請求直接發送到C2,C3如何實現負載均衡的?

   通過長連接,心跳的方式,健康檢查,每隔一段時間就發信息如果收不到請求,認為服務器宕機了。

  3、Spring Cloud 和 Dubble的區別; 

    參考:Dubbo和Spring Cloud微服務架構比較

  4、Dubble支持異步嗎? 是長鏈接嗎

    答: Dubbo 缺省協議采用單一長連接和 NIO 異步通訊,適合於小數據量大並發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。

    參考:Dubbo和Spring Cloud微服務架構比較

  5、目前有個服務器我希望 請求每分鍾3萬次,如果超了自動拒絕,如何處理

    使用漏桶算法算法,令牌桶算法,

    參考:互聯網應對高峰流量控制- 漏桶算法和令牌桶算法(滴滴面試)

  6、我現在想服務器每分鍾接收一個用戶的請求小於60個,如何處理:

    使用Redis 緩存服務器,可以設置key=用戶ID value不停地加一到了60就停止,然后把 redis的緩存時間設置為1分鍾,過了一分鍾就 失效;

  7、現在A->B->C 三個服務相互依賴,有個用戶請求訪問了A->B->C,如何跟蹤,使用隱式傳參的方法,傳遞了上下文。 taskmasterid 

使用ThreadLocal參數隱式傳參

 

十六、Java 緩存知識Ehcache,redis

  參考:Hibernate性能優化之EHCache緩存

  參考:ehcache詳細解讀

  參考:5個強大的Java分布式緩存框架推薦

  參考:ehcache、redis應用場景比較

十七、 Java調度任務:

  可以使用Quartz 包含了兩部分:JobDetails 和Trigger,它可以持久化到硬盤,

  Quartz源碼:

  SchedulerFactory schedFact=new StdSchedulerFactory();
        Scheduler sched=schedFact.getScheduler();
        sched.start();
        //創建一個JobDetail,指明 name,groupname,以及具體的Job類名,該Job負責定義具體的執行任務;
        JobDetail jobDetail=new JobDetail("myJob","myJobGroup",QuartzTest.class);
        jobDetail.getJobDataMap().put("type","FULL"); 
//         定義調度觸發規則,比如每1秒運行一次,共運行8次
           SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");
//         馬上啟動
           simpleTrigger.setStartTime(new Date());
//         間隔時間
           simpleTrigger.setRepeatInterval(1000);
//         運行次數
           simpleTrigger.setRepeatCount(8);           
        //用scheduler將JobDetail與Trigger關聯在一起,開始調度任務;
        sched.scheduleJob(jobDetail,simpleTrigger);

  參考:深入解讀Quartz的原理

  參考:Quartz集成springMVC 的方案二(持久化任務、集群和分布式)

  阿里的面試官問,如果現在很多調度任務,如何優化,可以使用調度池,Java1.5之后,引入了ScheduledExecutor,參考:ScheduledExecutor,

  源碼:

 ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

  參考:Java 幾種調度任務的Timer、ScheduledExecutor、 開源工具包 Quartz、開源工具包 JCronTab

   十八、消息隊列知識MQ:

       1、Kafka的消息隊列的特征,kafka實現的原理: 

       參考:Kafka 簡介

       參考:kafka 數據一致性-leader,follower機制與zookeeper的區別;

  十九、Linux知識

     1、Linux 如何查詢上下五行 

    如果在只是想匹配模式的上下幾行,grep可以實現。      
$grep -5 'parttern' inputfile //打印匹配行的前后5行 
 
$grep -C 5 'parttern' inputfile //打印匹配行的前后5行

$grep -A 5 'parttern' inputfile //打印匹配行的后5行 

$grep -B 5 'parttern' inputfile //打印匹配行的前5行

 查看mysql慢日志中ip地址為192.168.0.10發送過來的SQL語句的后面三行

tail -50 /usr/local/mysql/data/sql-slow.log |grep -3 '192.168.0.10'  

匹配PHP錯誤日志中某一個字段  

tail -100 /data/logs/php/php_error_5.3.log  | grep  "Memcache::get()";

查看某一個文件第5行和第10行

 sed -n '5,10p' filename 這樣你就可以只查看文件的第5行到第10行。

 

 

 動手題目: 

       (1) 讓兩個有序隊列 合並成一個有序隊列;

 

  

 其他 

1、修改簡歷,把hadoop去掉;Android去掉;  

2、搜索引擎的架構,如何做到搜素的,原理是什么?

Mysql索引結構及常見索引的區別

Mybatis的理解;

 


免責聲明!

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



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