1. 程式人生 > >中高階 java面試題總覽

中高階 java面試題總覽

JAVA 基礎

1. JAVA 中的幾種基本資料型別是什麼,各自佔用多少位元組。

資料型別

關鍵字

內建類

記憶體佔用位元組數

布林型

boolean

Boolean

1位元組

字元型

char

Character

2位元組

位元組型

byte

Byte

1位元組

短整型

short

Short

2位元組

整形

int

Integer

4位元組

長整型

long

Long

8位元組

單精度型

float

Float

4位元組

雙精度型

double

Double

8

2. String 類能被繼承嗎,為什麼。

3. String,Stringbuffer,StringBuilder的區別。

4. ArrayList 和 LinkedList 有什麼區別。

5. 講講類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,當 new 的時候,他們的執行順序。

6. 用過哪些 Map 類,都有什麼區別,HashMap 是執行緒安全的嗎,併發下使用的 Map 是什麼,他們內部原理分別是什麼,比如儲存方式,hashcode,擴容,預設容量等。

當 HashMap 中的元素個數超過陣列大小 loadFactor時,就會進行陣列擴容,loadFactor的預設值為 0.75,這是一個折中的取值。也就是說,預設情況下,陣列大小為 16,那麼當 HashMap 中元素個數超過 16*0.75=12 的時候,就把陣列的大小擴充套件為 2*16=32,即擴大一倍,然後重新計算每個元素在陣列中的位置,而這是一個非常消耗效能的操作,所以如果我們已經預知 HashMap 中元素的個數,那麼預設元素的個數能夠有效的提高 HashMap 的效能。
 
HashMap 的效能引數
HashMap 包含如下幾個構造器:
 
HashMap():構建一個初始容量為 16,負載因子為 0.75 的 HashMap。
HashMap(int initialCapacity):構建一個初始容量為 initialCapacity,負載因子為 0.75 的 HashMap
 
ConcurrentHashMap適用於讀者數量超過寫者時,當寫者數量大於等於讀者時,CHM的效能是低於Hashtable和synchronized Map的。這是因為當鎖住了整個Map時,讀操作要等待對同一部分執行寫操作的執行緒結束。CHM適用於做cache,在程式啟動時初始化,之後可以被多個請求執行緒訪問。正如Javadoc說明的那樣,CHM是HashTable一個很好的替代,但要記住,CHM的比HashTable的同步性稍弱
 
ArrayList:預設長度是10  一次擴容50%
預設長度是10  一次擴容50%

7. JAVA8 的 ConcurrentHashMap為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何設計。

從Java 8開始,HashMap,ConcurrentHashMap和LinkedHashMap在處理頻繁衝突時將使用平衡樹來代替連結串列,
當同一hash桶中的元素數量超過特定的值便會由連結串列切換到平衡樹,這會將get()方法的效能從O(n)提高到O(logn)。


8. 有沒有有順序的Map 實現類,如果有,他們是怎麼保證有序的。

9. 抽象類和介面的區別,類可以繼承多個類麼,介面可以繼承多個介面麼,類可以實現多個介面麼。

10. 繼承和聚合的區別在哪。

一、聚合
為了能夠使用一條命令就能構建 account-email和 account-persist兩個模組,我們需要建立一個額外的名為 account-aggregator的模組,然後通過該模組構建整個專案的所有模組。 account-aggregator本身也是個 Maven專案,它的 POM如下
Xml程式碼  收藏程式碼
 
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-aggregator</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging> pom </packaging>  
        <name>Account Aggregator</name>  
         <modules>  
            <module>account-email</module>  
            <module>account-persist</module>  
         </modules>  
    </project>  
 
 注意:packaging的型別為pom ,module的值是一個以當前POM為主目錄的相對路徑。
 
二、繼承
 
可宣告父POM供子 POM繼承
 
父模組POM如下:
 
 
Xml程式碼   
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId> account-parent </artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging>pom</packaging>  
        <name>Account Parent</name>  
    </project>  
 
 子模組宣告繼承如下:
 
 
Xml程式碼   
    <project>  
        <modelVersion>4.0.0</modelVersion>  
          
        < parent >  
            <groupId>com.juvenxu.mvnbook.account</groupId>  
            <artifactId> account-parent </artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
            < relativePath >../account-parent/pom.xml</ relativePath>  
        </ parent >  
          
        <artifactId> account-email </artifactId>  
        <name>Account Email</name>  
      ...  
    </project>  
 
 最後,同樣還需要把 account-parent加入到聚合模組account-aggregator中。聚合的 POM如下:
 
 
Xml程式碼   
 
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-aggregator</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging> pom </packaging>  
        <name>Account Aggregator</name>  
        <modules>  
            <module>account-email</module>  
            <module>account-persist</module>  
            <module> account-parent</module>  
        </modules>  
    </project>  

11. 講講你理解的 nio。他和 bio 的區別是啥,談談 reactor 模型。 

Reactor模式首先是事件驅動的,有一個或多個併發輸入源,有一個Service Handler,有多個Request Handlers;這個Service Handler會同步的將
輸入的請求(Event)多路複用的分發給相應的Request Handle
http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html

12. 反射的原理,反射建立類例項的三種方式是什麼。

    //第一種表示方式--》實際在告訴我們任何一個類都有一個隱含的靜態成員變數class
    Class class1 = Foo.class;
    
    //第二種表示方式  已經知道該類的物件通過getClass方法
    Class class2 = foo1.getClass();
 
    //第三種表達方式
    class3 = Class.forName("com.imooc.reflect.Foo");
     

13. 反射中,Class.forName 和 ClassLoader 區別。

Class.forName(className)方法,內部實際呼叫的方法是  Class.forName(className,true,classloader);
第2個boolean引數表示類是否需要初始化,  Class.forName(className)預設是需要初始化。
一旦初始化,就會觸發目標物件的 static塊程式碼執行,static引數也也會被再次初始化。
JDBC  Driver原始碼如下,因此使用Class.forName(classname)才能在反射回去類的時候執行static塊
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

    

ClassLoader.loadClass(className)方法,內部實際呼叫的方法是  ClassLoader.loadClass(className,false);
第2個 boolean引數,表示目標物件是否進行連結,false表示不進行連結,由上面介紹可以,
不進行連結意味著不進行包括初始化等一些列步驟,那麼靜態塊和靜態物件就不會得到執行

14. 描述動態代理的幾種實現方式,分別說出相應的優缺點。

15. 動態代理與cglib 實現的區別。

       JDK的動態代理機制只能代理實現了介面的類,而不能實現介面的類就不能實現JDK的動態代理,
	cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,
	並覆蓋其中方法實現增強,但因為採用的是繼承,所以不能對final修飾的類進行代理。 
	採用非常底層的位元組碼生成技術

16. 為什麼CGlib 方式可以對介面實現代理。

17. final的用途。

final類不能被繼承,沒有子類,final類中的方法預設是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法

18. 出三種單例模式實現。

19. 如何在父類中為子類自動完成所有的 hashcode 和 equals 實現?這麼做有何優劣。

20. 請結合 OO 設計理念,談談訪問修飾符 public、private、protected、default 在應用設計中的作用。

21. 深拷貝和淺拷貝區別。

22. 陣列和連結串列資料結構描述,各自的時間複雜度。

23. error 和 exception 的區別,CheckedException,RuntimeException 的區別。

24. 請列出 5 個執行時異常。

25. 在自己的程式碼中,如果建立一個 java.lang.String 物件,這個物件是否可以被類載入器載入?為什麼。

http://blog.csdn.net/bbirdsky/article/details/8283143
字串類(Java.lang.String)是Java中使用最多的類,也是最為特殊的一個類,很多時候,我們對它既熟悉又陌生。在很多面試題中經常用String大做文章,只要掌握了String特性,對付它們就不再是困難了。
1、從根本上認識java.lang.String類和String池
首先,我建議先看看String類的原始碼實現,這是從本質上認識String類的根本出發點。
從原始碼中可以看到:
String類是final的,不可被繼承。public final class String。
String類是的本質是字元陣列char[], 並且其值不可改變。private final char value[];
 
然後開啟String類的API文件,從API中可以發現:
String類物件有個特殊的建立的方式,就是直接指定比如String x = "abc","abc"就表示一個字串物件。而x是"abc"物件的地址,也叫做"abc"物件的引用。
String物件可以通過“+”串聯。串聯後會生成新的字串。也可以通過concat()來串聯,這個後面會講述。
Java執行時會維護一個String Pool(String池),JavaDoc翻譯很模糊“字串緩衝區”。String池用來存放執行時中產生的各種字串,並且池中的字串的內容不重複。而一般物件不存在這個緩衝池,並且建立的物件僅僅存在於方法的堆疊區。
 
2、建立字串的方式
建立字串的方式很多,歸納起來有三類:
使用new關鍵字建立字串,比如String s1 = new String("abc");
直接指定。比如String s2 = "abc";
使用串聯生成新的字串。比如String s3 = "ab" + "c"。
 
3、String物件的建立的特性
String物件的建立也很講究,關鍵是要明白其原理。
 
特性1:
當使用任何方式來建立一個字串物件s時,Java執行時(執行中JVM)會拿著這個字串的內容在String池中找是否存在內容相同的字串物件,如果不存在,則在池中建立一個字串s,否則,不在池中新增。
 
特性2:
Java中,只要使用new關鍵字來建立物件,則一定會(在堆區或棧區)建立一個新的物件。
 
特性3:
使用直接指定、使用純字串串聯或者在編譯期間可以確定結果的變量表達式來建立String物件,則僅僅會檢查維護String池中的字串,池中沒有就在池中建立一個,有則罷了!但絕不會在堆疊區再去建立該String物件;
1、 直接指定,例如:下面程式碼執行結果為true;
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
2、 使用純字串串聯,例如:下面程式碼執行結果為true;
String str1 = "abc";
String str2 = "ab" + "c";
System.out.println(str1 == str2);
3、 在編譯期間可以確定結果的變量表達式,例如:下面程式碼執行結果為true。
final String str1 = "c"; //final型別的變數在編譯時當常量處理
String str2 = "ab" + "c";
String str3 = "ab" + str1;
System.out.println(str2==str3);
 
否則使用包含編譯期間無法確定結果的變數的表示式來建立String物件,則不僅會檢查維護String池,而且還會在堆疊區建立一個String(由StringBuilder.toString()生成)物件。
1、普通變量表達式進行建立字串,例如:下面程式碼執行結果為false;
String str1 = "c";
String str2 = "ab" + "c";
String str3 = "ab" + str1;
System.out.println(str2==str3);

26. 說一說你對 java.lang.Object 物件中 hashCode 和 equals 方法的理解。在什麼場景下需要重新實現這兩個方法。

27. 在 jdk1.5 中,引入了泛型,泛型的存在是用來解決什麼問題。

28. 這樣的 a.hashcode() 有什麼用,與 a.equals(b)有什麼關係。

1、equals方法用於比較物件的內容是否相等(覆蓋以後)
2、hashcode方法只有在集合中用到
3、當覆蓋了equals方法時,比較物件是否相等將通過覆蓋後的equals方法進行比較(判斷物件的內容是否相等)。
4、將物件放入到集合中時,首先判斷要放入物件的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該物件放入集合中。
如果hashcode值相等,然後再通過equals方法判斷要放入物件與集合中的任意一個物件是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。

29. 有沒有可能 2 個不相等的物件有相同的 hashcode。

equals()相等的兩個物件,hashcode()一定相等;
equals()不相等的兩個物件,卻並不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個物件,hashcode()有可能相等。

30. Java 中的 HashSet 內部是如何工作的。

31. 什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決。

JVM 知識

1. 什麼情況下會發生棧記憶體溢位。

至於是堆記憶體溢位還是方法區記憶體溢位還是棧記憶體溢位,其實可以用一些工具比如
JConsole來監視

2. JVM 的記憶體結構,Eden 和 Survivor 比例。

3. jvm 中一次完整的 GC 流程是怎樣的,物件如何晉升到老年代,說說你知道的幾種主要的 jvm 引數。

4. 你知道哪幾種垃圾收集器,各自的優缺點,重點講下 cms,包括原理,流程,優缺點

5. 垃圾回收演算法的實現原理。

6. 當出現了記憶體溢位,你怎麼排錯。

記憶體溢位分析
JAVA dump檢視執行緒執行情況:

1.查詢java程式pid(兩種方案,二選一)
  1).檢視所有程序 埠號和PID: sudo netstat -antup 
  2).root 通過埠號查PID :netstat -anp |grep 9638 

2.使用jstack [-l] pid > xxx.log將所有執行緒資訊輸入到指定檔案中

  1)如果程式正常執行:使用jstack [-l] pid > xxx.log將所有執行緒資訊輸入到指定檔案中 

  2)如果程式無響應:使用 jstack -F [-m] [-l] pid >xxx.log強制列印棧資訊 

3.使用top命令找出佔用cpu高(或者執行時間很長)的程式pid 

4.使用top -H -p pid找出佔用cpu高(或執行時間長)的執行緒pid 

5.將佔用cpu高的執行緒pid轉換成16進位制(window自帶計算器) 

6.jmap -dump:format=b,file=檔名 [pid]   將轉換後的pid在開始輸出的dump檔案(xxx.log)中搜索對應執行緒資訊 

7.eclipse Memory Analyzer 對dump檔案分析

7. JVM 記憶體模型的相關知識瞭解多少,比如重排序,記憶體屏障,happen-before,主記憶體,工作記憶體等。

8. 簡單說說你瞭解的類載入器。

9. 講講 JAVA 的反射機制。

10. 你們線上應用的 JVM 引數有哪些。

11. g1 和 cms 區別,吞吐量優先和響應優先的垃圾收集器選擇。

12. 請解釋如下 jvm 引數的含義:

-server -Xms512m -Xmx512m -Xss1024K
 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
 
http://blog.csdn.net/a503921892/article/details/39048889
Xmx3550m:設定JVM最大可用記憶體為3550M。
-Xms3550m:設定JVM初始記憶體為3550m。此值可以設定與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體。
-Xss128k: 設定每個執行緒的堆疊大小。在相同物理內 存下,減小這個值能生成更多的執行緒。但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,
經驗值在3000~5000左右
-XX:MaxPermSize=16m:設定持久代大小為16m
 -XX:MaxTenuringThreshold=0:設定垃圾最大年齡。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。
如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概論。

 系統學習JVM知識這篇文章講的比較清楚

開源框架知識

1. 簡單講講 tomcat 結構,以及其類載入器流程。

2. tomcat 如何調優,涉及哪些引數。

3. 講講 Spring 載入流程。

4. 講講 Spring 事務的傳播屬性。

PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

5. Spring 如何管理事務的。

6. Spring 怎麼配置事務(具體說出一些關鍵的 xml元素)。

tx:advice,aop:config

7. 說說你對 Spring 的理解,非單例注入的原理?它的生命週期?迴圈注入的原理,aop 的實現原理,說說 aop 中的幾個術語,它們是怎麼相互工作的。

8. Springmvc 中 DispatcherServlet初始化過程。

1. 使用者向伺服器傳送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
2. DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandlerMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回;
3. DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
4.  提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
      HttpMessageConveter: 將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊
      資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等
      資料根式化:對請求訊息進行資料格式化。 如將字串轉換成格式化數字或格式化日期等
      資料驗證: 驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中
5.  Handler執行完成後,向DispatcherServlet 返回一個ModelAndView物件;
6.  根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
7. ViewResolver 結合Model和View,來渲染檢視

作業系統

1. Linux 系統下你關注過哪些核心引數,說說你知道的。

2. Linux 下 IO 模型有幾種,各自的含義是什麼。

3. epoll 和 poll 有什麼區別。

4. 平時用到哪些 Linux 命令。

5. 用一行命令檢視檔案的最後五行。

輸出test檔案的後五行:
 
[email protected]:~/Desktop > tail -n 5 test
 
輸出test檔案的前五行:
 
[email protected]:~/Desktop > head -n 5 test

6. 用一行命令輸出正在執行的 java 程序。

7. 介紹下你理解的作業系統中執行緒切換過程。

8. 程序和執行緒的區別。

多執行緒

1. 多執行緒的幾種實現方式,什麼是執行緒安全。

2. volatile 的原理,作用,能代替鎖麼。

3. 畫一個執行緒的生命週期狀態圖。

4. sleep 和 wait 的區別。

5. Lock 與 Synchronized 的區別。

6. synchronized 的原理是什麼,解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。

7. 用過哪些原子類,他們的原理是什麼。

8. 用過執行緒池嗎,newCache 和 newFixed 有什麼區別,他們的原理簡單概括下,建構函式的各個引數的含義是什麼,比如 coreSize,maxsize 等。

9. 執行緒池的關閉方式有幾種,各自的區別是什麼。

10. 假如有一個第三方介面,有很多個執行緒去呼叫獲取資料,現在規定每秒鐘最多有 10 個執行緒同時呼叫它,如何做到。

11. spring 的 controller 是單例還是多例,怎麼保證併發的安全。

singleton : bean在每個Spring ioc 容器中只有一個例項。
prototype:一個bean的定義可以有多個例項。
request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。

12. 用三個執行緒按順序迴圈列印 abc 三個字母,比如 abcabcabc。

思路:解題思路大概是這樣的,開啟三個執行緒,每個執行緒一次列印一個字母,並且按照一定的順序列印,當列印A的時候,其他執行緒處於阻塞狀態,列印完A以後,
將執行緒解鎖,讓列印B的那個執行緒開啟,其他執行緒處於阻塞狀態,同理列印C的時候,阻塞其他執行緒,這三個執行緒順序迴圈,就達到順序多次列印ABC的目的了。
 
這道題看似思路簡單,其實主要需要用到wait()方法和notify()方法,還有關鍵字synchronized,只有充分理解了這些,才能解出這道題。下面我有必要講解一下這兩個方法,
還有關鍵字synchronized。

13. ThreadLocal 用過麼,用途是什麼,原理是什麼,用的時候要注意什麼。

14. 如果讓你實現一個併發安全的連結串列,你會怎麼做。

http://blog.csdn.net/iter_zc/article/details/41115021

15. 有哪些無鎖資料結構,他們實現的原理是什麼。

ConcurrentLinkedQueue
從原始碼角度來看整個入隊過程主要做二件事情。第一是定位出尾節點,第二是使用CAS演算法能將入隊節點設定成尾節點的next節點,如不成功則重試。
http://blog.csdn.net/iter_zc/article/details/4111502

16. 講講 java 同步機制的 wait 和 notify。

17. 多執行緒如果執行緒掛住了怎麼辦。

18. countdowlatch 和 cyclicbarrier的內部原理和用法,以及相互之間的差別。

19. 使用 synchronized 修飾靜態方法和非靜態方法有什麼區別。

 所有的非靜態同步方法用的都是同一把鎖——例項物件本身,也就是說如果一個例項物件的非靜態同步方法獲取鎖後,
  該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放鎖後才能獲取鎖,
  可是別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法用的是不同的鎖,
  所以毋須等待該例項物件已獲取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖。
 
  而所有的靜態同步方法用的也是同一把鎖——類物件本身,這兩把鎖是兩個不同的物件,
  所以靜態同步方法與非靜態同步方法之間是不會有競態條件的。但是一旦一個靜態同步方法獲取鎖後,
  其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同一個例項物件的靜態同步方法之間,
  還是不同的例項物件的靜態同步方法之間,只要它們同一個類的例項物件!

20. 簡述 ConcurrentLinkedQueue 和 LinkedBlockingQueue 的用處和不同之處。

21. 導致執行緒死鎖的原因?怎麼解除執行緒死鎖。

22. 非常多個執行緒(可能是不同機器),相互之間需要等待協調,才能完成某種工作,問怎麼設計這種協調方案。

CountDownLatch,CyclicBarrier

23. 正確使用 Volatile 變數

正確使用 volatile 變數的條件
 
您只能在有限的一些情形下使用 volatile 變數替代鎖。要使 volatile 變數提供理想的執行緒安全,必須同時滿足下面兩個條件:
 
1對變數的寫操作不依賴於當前值。
2該變數沒有包含在具有其他變數的不變式中。
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

TCP  HTTP

1. http1.0 和 http1.1 有什麼區別。

在http1.0中,當建立連線後,客戶端傳送一個請求,伺服器端返回一個資訊後就關閉連線,
當瀏覽器下次請求的時候又要建立連線,顯然這種不斷建立連線的方式,會造成很多問題。
   
在http1.1中,引入了持續連線的概念,通過這種連線,瀏覽器可以建立一個連線之後,
傳送請求並得到返回資訊,然後繼續傳送請求再次等到返回資訊,也就是說客戶端可以連續傳送多個請求,而不用等待每一個響應的到來。

2. TCP 三次握手和四次揮手的流程,為什麼斷開連線要 4次,如果握手只有兩次,會出現什麼。

3. TIME_WAIT 和 CLOSE_WAIT 的區別。

4. 說說你知道的幾種 HTTP 響應碼,比如 200, 302, 404。

5. 當你用瀏覽器開啟一個連結的時候,計算機做了哪些工作步驟。

6. TCP/IP 如何保證可靠性,說說 TCP 頭的結構。

7. 如何避免瀏覽器快取。

8. 簡述 Http 請求 get 和 post 的區別以及資料包格式。

GET提交,請求的資料會附在URL之後(就是把資料放置在HTTP協議頭<request-line>中
POST提交:把提交的資料放置在是HTTP包的包體<request-body>中

9. 簡述 HTTP 請求的報文格式。

一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求資料4個部分組成
http://blog.csdn.net/zhangliang_571/article/details/23508953

10. HTTPS 的加密方式是什麼,講講整個加密解密流程。

架構設計與分散式

1. 常見的快取策略有哪些,你們專案中用到了什麼快取系統,如何設計的。

2. 用 java 自己實現一個 LRU。

3. 分散式叢集下如何做到唯一序列號。

4. 設計一個秒殺系統,30 分鐘沒付款就自動關閉交易。

5. 如何使用 redis 和 zookeeper 實現分散式鎖?有什麼區別優缺點,分別適用什麼場景。

6. 如果有人惡意建立非法連線,怎麼解決。

7. 分散式事務的原理,優缺點,如何使用分散式事務。

8. 什麼是一致性 hash。

9. 什麼是 restful,講講你理解的 restful。

10. 如何設計建立和保持 100w 的長連線。

11. 如何防止快取雪崩。

12. 解釋什麼是 MESI 協議(快取一致性)。

13. 說說你知道的幾種 HASH 演算法,簡單的也可以。

14. 什麼是 paxos 演算法。

15. 什麼是 zab 協議。

16. 一個線上文件系統,文件可以被編輯,如何防止多人同時對同一份文件進行編輯更新。

17. 線上系統突然變得異常緩慢,你如何查詢問題。

18. 說說你平時用到的設計模式。 

19. Dubbo 的原理,資料怎麼流轉的,怎麼實現叢集,負載均衡,服務註冊和發現。重試轉發,快速失敗的策略是怎樣的。

20. 一次 RPC 請求的流程是什麼。

21. 非同步模式的用途和意義。

22. 快取資料過期後的更新如何設計。

23. 程式設計中自己都怎麼考慮一些設計原則的,比如開閉原則,以及在工作中的應用。

24. 設計一個社交網站中的“私信”功能,要求高併發、可擴充套件等等。畫一下架構圖。

25. MVC 模式,即常見的 MVC 框架。

26. 聊了下曾經參與設計的伺服器架構。

27. 應用伺服器怎麼監控效能,各種方式的區別。

28. 如何設計一套高併發支付方案,架構如何設計。

29. 如何實現負載均衡,有哪些演算法可以實現。

30. Zookeeper 的用途,選舉的原理是什麼。

31. Mybatis 的底層實現原理。

MyBatis底層就是JDBC   所以他的核心就是配置檔案  :
 
      1:全域性配置檔案 (配置資料來源 事務執行時資訊)
      2:對映檔案(執行statement的相關資訊,包括SQL語句,輸入引數,輸出結果)
      MyBatis把全域性配置檔案載入到內容中 構建出SqlSessionFactory    ,這個工廠的作用相當於生產物件生產SqlSession。
     SqlSession   :它是一個面向程式設計師的介面,可以操作資料庫。 介面有一個預設實現DefaultSqlSession。
在SqlSession   中有一個executor 執行器。  SqlSession   本身不能操作資料庫 需要通過這個執行器去操作。有2個實現 一個叫做基本執行器,還有一個快取執行器
(預設)。 MappedStatement:封裝了執行Statement資訊,包括SQL語句 輸入引數,輸出結果。由它去操作資料庫。
 
輸入輸出引數型別:
            1:基本型別
            2:自定義型別
            3:hashmap
 
根據原始碼:看到Sqlsession內部並不能直接操作資料庫。而是利用內部的一個執行器去操作資料庫。執行器執行的時候會去執行MappedStatement 
到最後才去真正執行資料庫。

32. 請思考一個方案,設計一個可以控制快取總體大小的自動適應的本地快取。

33. 請思考一個方案,實現分散式環境下的 countDownLatch。

34. 後臺系統怎麼防止請求重複提交。

35. 如何看待快取的使用(本地快取,集中式快取),簡述本地快取和集中式快取和優缺點。本地快取在併發使用時的注意事項。

36. 描述一個服務從釋出到被消費的詳細過程。

37. 講講你理解的服務治理。

38. 如何做到介面的冪等性。

介面冪等性,只要保證介面內的邏輯不涉及介面外的物件狀態累積或變遷即可。

譬如說需求是:
當用戶點選贊同時,將答案的贊同數量+1。
改為:
當用戶點選贊同時,確保答案贊同表中存在一條記錄,使用者、答案。
贊同數量由答案贊同表統計出來

39.redis和memcached的區別

1、Redis和Memcache都是將資料存放在記憶體中,都是記憶體資料庫。不過memcache還可用於快取其他東西,例如圖片、視訊等等;
2、Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,hash等資料結構的儲存;
3、虛擬記憶體--Redis當實體記憶體用完時,可以將一些很久沒用到的value 交換到磁碟;
4、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10;
5、分散式--設定memcache叢集,利用magent做一主多從;redis可以做一主多從。都可以一主一從;
6、儲存資料安全--memcache掛掉後,資料沒了;redis可以定期儲存到磁碟(持久化);
7、災難恢復--memcache掛掉後,資料不可恢復; redis資料丟失後可以通過aof恢復;
8、Redis支援資料的備份,即master-slave模式的資料備份;
9、應用場景不一樣:Redis出來作為NoSQL資料庫使用外,還能用做訊息佇列、資料堆疊和資料快取等;Memcached適合於快取SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等。

演算法

1. 10 億個數字裡裡面找最小的 10 個。

2. 有 1 億個數字,其中有 2 個是重複的,快速找到它,時間和空間要最優。

3. 2 億個隨機生成的無序整數,找出中間大小的值。

4. 給一個不知道長度的(可能很大)輸入字串,設計一種方案,將重複的字元排重。

5. 遍歷二叉樹。

6. 有 3n+1 個數字,其中 3n 箇中是重複的,只有 1 個是不重複的,怎麼找出來。

7. 寫一個字串反轉函式。

8. 常用的排序演算法,快排,歸併、冒泡。 快排的最優時間複雜度,最差複雜度。氣泡排序的優化方案。

9. 二分查詢的時間複雜度,優勢。

10. 一個已經構建好的 TreeSet,怎麼完成倒排序。

11. 什麼是 B+樹,B-樹,列出實際的使用場景。

SQL

1. 行轉列

姓名       課程       分數

---------- ---------- -----------

張三       語文        74

張三       數學        83

張三       物理        93

李四       語文        74

李四       數學        84

李四       物理        94

SELECT 姓名,
 max(CASE 課程 WHEN'語文' THEN 分數 ELSE 0 END) 語文,
 max(CASE 課程 WHEN'數學' THEN 分數 ELSE 0 END) 數學,
 max(CASE 課程 WHEN'物理' THEN 分數 ELSE 0 END) 物理
FROM tb
GROUP BY 姓名
 
姓名       語文        數學        物理
---------- ----------- ----------- -----------
李四        74          84          94
張三        74          83          93

2. MySQL儲存引擎- MyISAM與InnoDB區別

InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表型別,這兩個表型別各有優劣,視具體應用而定。基本的差別為:MyISAM型別不支援事務處理等高階處理,
而InnoDB型別支援。MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而InnoDB提供事務支援以及外部鍵等高階資料庫功能。
 
兩種型別最主要的差別就是Innodb 支援事務處理與外來鍵和行級鎖。而MyISAM不支援.所以MyISAM往往就容易被人認為只適合在小專案中使用

中介軟體

Dubbo提供了多種均衡策略,預設為random隨機呼叫。

隨機按權重設定隨機概率。

在一個截面上碰撞的概率高,但呼叫量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

輪循,按公約後的權重設定輪循比率。

存在慢的提供者累積請求問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。

使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。

一致性Hash,相同引數的請求總是發到同一提供者。

當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。

叢集容錯模式:

失敗自動切換,當出現失敗,重試其它伺服器。(預設)

通常用於讀操作,但重試會帶來更長延遲。

可通過retries="2"來設定重試次數(不含第一次,預設就是2)

快速失敗,只發起一次呼叫,失敗立即報錯。

通常用於非冪等性的寫操作,比如新增記錄。

失敗安全,出現異常時,直接忽略。

通常用於寫入審計日誌等操作。

失敗自動恢復,後臺記錄失敗請求,定時重發。

通常用於訊息通知操作。

並行呼叫多個伺服器,只要一個成功即返回。

通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。

可通過forks="2"來設定最大並行數。

廣播呼叫所有提供者,逐個呼叫,任意一臺報錯則報錯。(2.1.0開始支援)

通常用於通知所有提供者更新快取或日誌等本地資源資訊。

重試次數配置如:(failover叢集模式生效)

MQ分散式系統事務一致性解決方案

redis分散式快取

相關推薦

中高階 java試題總覽

JAVA 基礎 1. JAVA 中的幾種基本資料型別是什麼,各自佔用多少位元組。 資料型別 關鍵字 內建類 記憶體佔用位元組數 布林型 boolean

75 道 BAJT 中高階 Java 試題,你能答上幾道?

整理了下 BATJ 關於 JAVA 的面試題目,大家參考下吧,希望對大家有所幫助,可以幫大家查漏不缺。 答對這些面試題,PASS 掉 80 % 的求職競爭者。 1.hashcode相等兩個類一定相等嗎?equals呢?相反呢? 2.介紹一下集合框架? 3.hash

JAVA試題總覽--JVM知識

注:JAVA面試題總覽下的所有的題目都是由群:329019348 的群主和群友于2017-03-02 整理的,我只寫上自己的答案 1. 什麼情況下會發生棧記憶體溢位。 a.方法建立了一個很大的物件,如List,Array b.是否產生了迴圈呼叫、死迴圈 c.是否引用了較

2017.03 JAVA 試題 中高階

2017年3月份,從北京跳槽來到深圳,各種面試,面試的大部分公司都發了offer,現整理出面試的問答題目,如下: 一.基礎知識: 1)集合類:List和Set比較,各自的子類比較(ArrayList,Vector,LinkedList;HashSet,TreeSet);

Java試題和解答(三)

增加 自旋 println class 答案 logs 聯網 get link 1、這段代碼大多數情況下運行正常,但是某些情況下會出問題。什麽時候會出現什麽問題?如何修正? public class MyStack { private List<S

java試題

調用 strong 同步鎖 記錄 沒有 拋出異常 數據 sleep wait sleep()和wait()的區別  sleep是線程類的方法,它會讓出cpu去執行其他線程,當指定時間過後,會從新回到此線程上,但是雖然讓出了CPU ,並不會釋放對象鎖,   wait是obje

java試題

情況 減少 元素 pro pin 內存大小 java_opts req -xms 個人的一點參考總結,如有雷同,純屬巧合! 1、hashmap的實現原理以及hashtable的線程安全是怎麽實現的?HashMap其實也是一個線性的數組實現的,所以可以理解為其存儲數據的容

java試題-java基礎

runtime 都是 缺點 子類 true 大數 virtual 過程 面向連接 1.1java與其他語言相比,有什麽優點和缺點?   首先,java與c、c++相比,java是一種完全的面對對象的語言,雖然他的底層(運行時庫)使用c語言開發的,可是並不依賴於c,因為jav

Java(試題):字符串截取

int lan out 試題 void trace 題目 replace odi 在Java中,字符串“abcd”與字符串“ab你好”的長度是一樣,都是四個字符。 但對應的字節數不同,一個漢字占兩個字節。 定義一個方法,按照指定的字節數來取子串。 如:對於“ab你好”,如果

Java試題和解答(四)

aio sys main sina 數據 由於 ssd shm 檢測 1、JVM什麽情況下會GC,GC策略有哪些 當應用程序分配新的對象,GC的代的預算大小已經達到閾值,比如GC的第0代已滿;代碼主動顯式調用System.GC.Collect();其他特殊情況,比如,系統

100+經典Java試題及答案解析

是什麽 自定義 我們 計數 接口類 同步方法 main err ans 面向對象編程(OOP) Java是一個支持並發、基於類和面向對象的計算機編程語言。下面列出了面向對象軟件開發的優點: 代碼開發模塊化,更易維護和修改。 代碼復用。 增強代碼的可靠性和靈活

java試題2

pan ole light [0 -i att turn mat [] 1.冒泡排序 public static void test(){ int[] array = new int[]{1,4,5,8,9,34,4,32,65}; int tmp; for(

10個經典的Java試題集合

支持 獲得 equal 效率 可用 ash 很快 鍵值對 shm 1.Java的HashMap是如何工作的? HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。 HashMap 基於 hashing 原理,我們通過 put ()和 g

Java試題-線程安全

通過 釋放 運行時 ica work 面試題 條件 同時 strong 1. 什麽叫線程安全?servlet是線程安全嗎? 答:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其

java試題(二)

imap 產生 java面試 大型 過程 ets ibm apache服務 廣泛 11、說出Servlet的生命周期,並說出Servlet和CGI的區別? Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣

java試題整理(1)

pmap 復制 java對象 試題 取出 樹形 年輕代和老年代 com 足夠 1、Equals與==的區別?   ==是判斷兩個變量或者實例是不是指向同一個內存地址   equals是判斷兩個變量或者實例所指向的內存地址中的值是不是相同 2、Object有哪些公用方法?  

java試題01

讀寫 esc direct syn 做到 window sele 開始 run 一、JAVA基礎 1、簡述你所知道的JAVA修飾符及各自的使用機制?(public、abstract、final、synchronized、super…) 01.public:允許所有客戶訪問

java試題02

操作 保存 代碼 strac 重寫 exception pos api 內部使用 1.JAVA內部使用的編碼格式是(utf-8) 2. public class Threads2 implements Runnable { @Overridepublic void run(

java試題03

程序 point 優先 參與 response oid 指定 switch語句 超過 1、一個”.java”源文件中是否可以包含多個類(不是內部類)?有什麽限制?一個".java"源文件中是否可以包括多個類(不是內部類)?有什麽限制?這個是可以的,一個“.java”源文件裏

java試題05

error .config prototype finall get方法 all ssh error: com 1.寫一個冒泡排序的算法 升序排列: int[] nums = {5,6,9,10,20,30,28,27,15}; for(int i = 0;i<n