Java面試題目彙總

3年工做經驗出去面試的面試問題:

1. mysql數據庫的優化

1、表的設計要符合三範式。html

2、添加適當的索引,索引對查詢速度影響很大,必須添加索引。主鍵索引,惟一索引,普通索引,全文索引前端

3、添加適當存儲過程,觸發器,事務等。java

4、讀寫分離(主從數據庫)node

5、對sql語句的一些優化,(查詢執行速度比較慢的sql語句)mysql

6、分表分區linux

分表:把一張大表分紅多張表。分區:把一張表裏面的分配到不一樣的區域存儲,nginx

7、對mysql服務器硬件的升級操做。程序員

 

2. mysql數據庫查詢使用limit,兩次查詢結果會不會不一致,爲何?

MySQLlimit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇降低。一樣是取10條數據,下面兩句就不是一個數量級別的。web

 

1面試

select * from table limit 10000,10

2

select * from table limit 0,10

這個可能和我們的數據庫的數據有關

 

3. 如何建立索引查詢數據庫?

http://jingyan.baidu.com/article/da1091fbd166ff027849d687.html

這個網頁裏面是數據庫建立索引的步驟!本身理解一下,由於在面試過程當中這個問題問的比較多

4redis中的事務和mysql中的事務有什麼區別?

1Redis中的事務(transaction)是一組命令的集合。事務同命令同樣都是Redis最小的執行單位,一個事務中的命令要麼都執行,要麼都不執行。Redis事務的實現須要用到 MULTI  EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,而後依次發送須要在本次事務中處理的命令,最後再發送 EXEC 命令表示事務命令結束。

2mysql的事務特性,要求這組操做,要不全都成功,要不全都失敗,這樣就避免了某個操做成功某個操做失敗。利於數據的安全

 

5zookeeper爲何能夠作註冊中心?原理是什麼?

首先咱們要知道什麼是zookeeperzookeeper是一個爲分佈式應用提供一致性服務的軟件,它是開源的Hadoop項目中的一個子項目!

(1)配置管理
集中式的配置管理在應用集羣中是很是常見的,通常商業公司內部都會實現一套集中的配置管理中心,應對不一樣的應用集羣對於共享各自配置的需求,而且在配置變動時可以通知到集羣中的每個機器。

Zookeeper很容易實現這種集中式的配置管理,好比將APP1的全部配置配置到/APP1 znode下,APP1全部機器一啓動就對/APP1這個節點進行監控(zk.exist("/APP1",true)),而且實現回調方法Watcher,那麼在zookeeper上/APP1 znode節點下數據發生變化的時候,每一個機器都會收到通知,Watcher方法將會被執行,那麼應用再取下數據便可(zk.getData("/APP1",false,null));

以上這個例子只是簡單的粗顆粒度配置監控,細顆粒度的數據能夠進行分層級監控,這一切都是能夠設計和控制的。     

(2)集羣管理 
應用集羣中,咱們經常須要讓每個機器知道集羣中(或依賴的其餘某一個集羣)哪些機器是活着的,而且在集羣機器由於宕機,網絡斷鏈等緣由可以不在人工介入的狀況下迅速通知到每個機器。

Zookeeper一樣很容易實現這個功能,好比我在zookeeper服務器端有一個znode叫/APP1SERVERS,那麼集羣中每個機器啓動的時候都去這個節點下建立一個EPHEMERAL類型的節點,好比server1建立/APP1SERVERS/SERVER1(可使用ip,保證不重複),server2建立/APP1SERVERS/SERVER2,而後SERVER1和SERVER2都watch /APP1SERVERS這個父節點,那麼也就是這個父節點下數據或者子節點變化都會通知對該節點進行watch的客戶端。由於EPHEMERAL類型節點有一個很重要的特性,就是客戶端和服務器端鏈接斷掉或者session過時就會使節點消失,那麼在某一個機器掛掉或者斷鏈的時候,其對應的節點就會消失,而後集羣中全部對/APP1SERVERS進行watch的客戶端都會收到通知,而後取得最新列表便可。

另外有一個應用場景就是集羣選master,一旦master掛掉可以立刻能從slave中選出一個master,實現步驟和前者同樣,只是機器在啓動的時候在APP1SERVERS建立的節點類型變爲EPHEMERAL_SEQUENTIAL類型,這樣每一個節點會自動被編號,

咱們默認規定編號最小的爲master,因此當咱們對/APP1SERVERS節點作監控的時候,獲得服務器列表,只要全部集羣機器邏輯認爲最小編號節點爲master,那麼master就被選出,而這個master宕機的時候,相應的znode會消失,而後新的服務器列表就被推送到客戶端,而後每一個節點邏輯認爲最小編號節點爲master,這樣就作到動態master選舉。

6、手寫一個單例模式

Java的設計模式比較多可是咱們在面試前面至少有看幾個設計面試,

1.餓漢式單例類

//餓漢式單例類.在類初始化時,已經自行實例化

public class Singleton1 {

    //私有的默認構造子

    private Singleton1() {}

    //已經自行實例化

    private static final Singleton1 single = new Singleton1();

    //靜態工廠方法

    public static Singleton1 getInstance() {

        return single;

    }

}

2.懶漢式單例類

//懶漢式單例類.在第一次調用的時候實例化

public class Singleton2 {

    //私有的默認構造子

    private Singleton2() {}

    //注意,這裏沒有final    

    private static Singleton2 single=null;

    //靜態工廠方法

    public synchronized  static Singleton2 getInstance() {

         if (single == null) {  

             single = new Singleton2();

         }  

        return single;

    }

}

3.登記式單例類

import java.util.HashMap;

import java.util.Map;

//登記式單例類.

//相似Spring裏面的方法,將類名註冊,下次從裏面直接獲取。

public class Singleton3 {

    private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();

    static{

        Singleton3 single = new Singleton3();

        map.put(single.getClass().getName(), single);

    }

    //保護的默認構造子

    protected Singleton3(){}

    //靜態工廠方法,返還此類唯一的實例

    public static Singleton3 getInstance(String name) {

        if(name == null) {

            name = Singleton3.class.getName();

            System.out.println("name == null"+"--->name="+name);

        }

        if(map.get(name) == null) {

            try {

                map.put(name, (Singleton3) Class.forName(name).newInstance());

            } catch (InstantiationException e) {

                e.printStackTrace();

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            }

        }

        return map.get(name);

    }

    //一個示意性的商業方法

    public String about() {    

        return "Hello, I am RegSingleton.";    

    }    

    public static void main(String[] args) {

        Singleton3 single3 = Singleton3.getInstance(null);

        System.out.println(single3.about());

    }

}

 

7.maven的插件有哪些

Maven 提供如下兩種類型插件:

類型

描述

構建插件

在生成過程當中執行,並在 pom.xml 中的<build/> 元素進行配置

報告插件

在網站生成期間執行,在 pom.xml 中的 <reporting/> 元素進行配置

如下是一些常見的插件列表:

插件

描述

clean

編譯後的清理目標,刪除目標目錄

compiler

編譯 Java 源文件

surefile

運行JUnit單元測試,建立測試報告

jar

從當前項目構建 JAR 文件

war

從當前項目構建 WAR 文件

javadoc

產生用於該項目的 Javadoc

antrun

從構建所述的任何階段運行一組 Ant 任務

 

8.maven如何處理依賴衝突的問題?

下面是maven 

解決maven傳遞依賴中的版本衝突

 

首先在pom.xml中添加:

<reporting>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId> maven-project-info-reports-plugin </artifactId>

</plugin>

</plugins>

</reporting>

 

若是用的是eclipse,那就用run as-build-Goals那個框框裏輸入:

project-info-reports:dependencies,若是實在dos環境下,

mvn project-info-reports:dependencies。而後就會在target的文件夾下,生成一個site文件夾,裏邊有個dependency.html,進去就能看到詳細的依賴的信息。

或者直接在eclipse中打開pom.xml文件

會看到打開的窗口中有一個dependency hie開頭的選項卡。

這個選擇卡頁面左半部分顯示了詳細的jar包依賴樹。右半部分則是maven將會下載的jar包。

好比咱們看到右半部分有2asmjar,版本不一樣。

如今須要排除其中低版本的jar(好比xwork-core下的某個jar依賴的asm版本相對較低,不必定說是xwork-core依賴,而是它的依賴的依賴,即多重依賴的asm都是能夠的)

<dependency>

<groupId>org.apache.struts.xwork</groupId>

<artifactId>xwork-core</artifactId>

<version>${struts.version}</version>

<exclusions>

<exclusion>

<artifactId>asm</artifactId>

<groupId>asm</groupId>

</exclusion>

</exclusions>

</dependency>

固然咱們也能夠在dependency hie開頭的選項卡中右半部分直接選中那個低版本的asm.jar

而後右鍵exclude maven...點擊肯定會自動生成上面的。

 

若是你這個是步驟解決問題的步驟!在面試的時候我們是能夠用語言打動面試官

maven引入依賴的時候,有的時候會發生循環依賴的狀況,形成依賴失敗,例如A依賴於BB又依賴於CC又依賴於A,形成一種環路,這樣的話會失敗。

假設依賴A依賴於B,D也依賴於BBpom中有2個版本B1B2(有多是直接依賴,也有多是間接依賴),那麼maven會經過如下機制引入依賴: 
若是A直接依賴於B1A-B1D間接依賴於B2,例如D-C-B2,那麼maven會有優先選擇依賴路徑短的那個版本,即依賴B1,而不依賴B2。假設B1B2都是間接依賴,例如A-C-B1D-C-B2,那麼在選擇B的依賴版本的時候,誰在pom文件中優先聲明依賴了,那麼就依賴哪一個,假設A-C-B1pom文件中優先D-C-B2聲明瞭,那麼將引入B1.

這樣面試官會認爲你真正作過開發,而且本身遇到這樣的問題!offer就在向你招手

9.電商項目中是如何解決高併發和高可用的?

1、儘可能將請求的頁面靜態化 靜態化的頁面爲.html(.htm)不須要web服務器從新加載項解析,只須要生成一次,之後每次都直接下載到客戶端,效率高不少。javaWeb靜態化的技術有freemarkVelocity等。

2fastDFS圖片服務器:

將網站系統的web服務器、數據庫服務器、圖片和文件服務器分開,經過將服務器專業化分工,以提升網站訪問速度。由於圖片和文件在下載的時候不管是IISApache等服務器都會有很大壓力。

3數據緩存服務器 redis

能夠設置專門的數據緩存服務器,將大量數據放到緩存數據區,在訪問量少得時候存入數據,減小鏈接直接操做數據庫的開銷。

4、數據庫集羣、庫表散列數據庫的各類優化、數據庫的拆分)

5、鏡像(這個本人原理也是不是明白)    

鏡像是大型網站常採用的提升性能和數據安全性的方式,鏡像的技術能夠解決不一樣網絡接入商和地域帶來的用戶訪問速度差別,好比ChinaNetEduNet之間的差別就促使了不少網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這裏不闡述太深,有不少專業的現成的解決架構和產品可選。也有廉價的經過軟件實現的思路,好比Linux上的rsync等工具。

6、負載均衡nginx

負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的高端解決辦法。

7、最新:CDN加速技術(這個鏡像好用

什麼是CDN?    CDN的全稱是內容分發網絡。其目的是經過在現有的Internet中增長一層新的網絡架構,將網站的內    容發佈到最接近用戶的網絡邊緣,使用戶能夠就近取得所需的內容,提升用戶訪問網站的響應速度。

10.nginx的做用?如何實現負載均衡的,原理是什麼?

nginx的做用:1http服務2負載均衡3解決高並

這個在上課的時候老師是有文檔的!

 

11.若是redis廣告位節點中存入的大量數據(十萬條),當添加新廣告數據時,是否也要刪掉十萬廣告對應的key?是否有其餘解決方案保證能redis中數據是最新的?

Redis做用   1 Redis不只僅支持簡單的k/v類型的數據,同時還提供listsetzsethash等數據結構的存儲。 

2 Redis支持數據的備份,即master-slave模式的數據備份。
 3 Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。

 Redis經常使用數據類型

Redis最爲經常使用的數據類型主要有如下:

String

Hash

List

Set

Sorted set

pub/sub

Transactions

 

12.activemq的事務管理?

在建立session時能夠選擇開啓事務控制。所謂事務控制,即將消息生成發送,或接受,消費操做放入一個事務中。但不能同時控制發送與消費這一整個過程。由於事務都是基於一個session下的操做。

以下代碼即開啓了事務處理:

ActiveMQSession session = connection.createSession(true,Session.CLIENT_ACKNOWLEDGE);

在事務狀態下進行發送操做,消息並未真正投遞到中間件,而只有進行session.commit操做以後,消息纔會發送到中間件,再轉發到適當的消費者進行處理。若是是調用rollback操做,則代表,當前事務期間內所發送的消息都取消掉。此時不管commit或rollback,會從新打開一個事務。

與此同時,在rollback以後,隨着新的事務打開,一些持久化的消息會從新接收。緣由在於當傳送模式處於持久話的狀態,產生的消息如若沒有被及時簽收確認,則消息會被中間件持久化。此時,當客戶端從新鏈接或新的事務開啓,消息會被再次發送到客戶端。

爲何commit以後,不會有持久的消息從新傳送呢?

緣由在於commit操做會自動將爲簽收確認的消息進行簽收確認,若是是當前接收但未簽收確認的消息,都會被確認處理。於是在commit以後不會有持久化的消息出現。

 

 

13.this is a dog」是如何添加到索引庫中的?(solr)

索引

Solr/Lucene採用的是一種反向索引,所謂反向索引:就是從關鍵字到文檔的映射過程,保存這種映射這種信息的索引稱爲反向索引

 

  • 左邊保存的是字符串序列
  • 右邊是字符串的文檔(Document)編號鏈表,稱爲倒排表(Posting List)

字段串列表和文檔編號鏈表二者構成了一個字典。如今想搜索」lucene」,那麼索引直接告訴咱們,包含有」lucene」的文檔有:2,3,10,35,92,而無需在整個文檔庫中逐個查找。若是是想搜既包含」lucene」又包含」solr」的文檔,那麼與之對應的兩個倒排表去交集便可得到:三、十、3五、92。

索引建立

假設有以下兩個原始文檔:
文檔一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文檔二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
建立過程大概分爲以下步驟:

一:把原始文檔交給分詞組件(Tokenizer)
分詞組件(Tokenizer)會作如下幾件事情(這個過程稱爲:Tokenize),處理獲得的結果是詞彙單元(Token)

  1. 將文檔分紅一個一個單獨的單詞
  2. 去除標點符號
  3. 去除停詞(stop word)
  • 所謂停詞(Stop word)就是一種語言中沒有具體含義,於是大多數狀況下不會做爲搜索的關鍵詞,這樣一來建立索引時能減小索引的大小。英語中停詞(Stop word)如:」the」、」a」、」this」,中文有:」的,得」等。不一樣語種的分詞組件(Tokenizer),都有本身的停詞(stop word)集合。通過分詞(Tokenizer)後獲得的結果稱爲詞彙單元(Token)。上例子中,便獲得如下詞彙單元(Token)

"Students""allowed""go""their""friends""allowed""drink""beer""My""friend""Jerry""went""school""see""his""students""found""them""drunk""allowed"

二:詞彙單元(Token)傳給語言處理組件(Linguistic Processor)
語言處理組件(linguistic processor)主要是對獲得的詞元(Token)作一些語言相關的處理。對於英語,語言處理組件(Linguistic Processor)通常作如下幾點:

  1. 變爲小寫(Lowercase)。
  2. 將單詞縮減爲詞根形式,如」cars」到」car」等。這種操做稱爲:stemming。
  3. 將單詞轉變爲詞根形式,如」drove」到」drive」等。這種操做稱爲:lemmatization。

語言處理組件(linguistic processor)處理獲得的結果稱爲詞(Term),例子中通過語言處理後獲得的詞(Term)以下:

"student""allow""go""their""friend""allow""drink""beer""my""friend""jerry""go""school""see""his""student""find""them""drink""allow"

通過語言處理後,搜索drive時drove也能被搜索出來。Stemming 和 lemmatization的異同:

  • 相同之處:
  1. Stemming和lemmatization都要使詞彙成爲詞根形式。
  • 二者的方式不一樣:
  1. Stemming採用的是」縮減」的方式:」cars」到」car」,」driving」到」drive」。
  2. Lemmatization採用的是」轉變」的方式:」drove」到」drove」,」driving」到」drive」。
  • 二者的算法不一樣:
  1. Stemming主要是採起某種固定的算法來作這種縮減,如去除」s」,去除」ing」加」e」,將」ational」變爲」ate」,將」tional」變爲」tion」。
  2. Lemmatization主要是採用事先約定的格式保存某種字典中。好比字典中有」driving」到」drive」,」drove」到」drive」,」am, is, are」到」be」的映射,作轉變時,按照字典中約定的方式轉換就能夠了。
  3. Stemming和lemmatization不是互斥關係,是有交集的,有的詞利用這兩種方式都能達到相同的轉換。

三:獲得的詞(Term)傳遞給索引組件(Indexer)

  1. 利用獲得的詞(Term)建立一個字典
  2. Term    Document ID
  3. student     1
  4. allow       1
  5. go          1
  6. their       1
  7. friend      1
  8. allow       1
  9. drink       1
  10. beer        1
  11. my          2
  12. friend      2
  13. jerry       2
  14. go          2
  15. school      2
  16. see         2
  17. his         2
  18. student     2
  19. find        2
  20. them        2
  21. drink       2

allow       2

  1. 對字典按字母順序排序:
  2. Term    Document ID
  3. allow       1
  4. allow       1
  5. allow       2
  6. beer        1
  7. drink       1
  8. drink       2
  9. find        2
  10. friend      1
  11. friend      2
  12. go          1
  13. go          2
  14. his         2
  15. jerry       2
  16. my          2
  17. school      2
  18. see         2
  19. student     1
  20. student     2
  21. their       1

them        2

  1. 合併相同的詞(Term)成爲文檔倒排(Posting List)鏈表
  • Document Frequency:文檔頻次,表示多少文檔出現過此詞(Term)
  • Frequency:詞頻,表示某個文檔中該詞(Term)出現過幾回

對詞(Term) 「allow」來說,總共有兩篇文檔包含此詞(Term),詞(Term)後面的文檔鏈表總共有兩個,第一個表示包含」allow」的第一篇文檔,即1號文檔,此文檔中,」allow」出現了2次,第二個表示包含」allow」的第二個文檔,是2號文檔,此文檔中,」allow」出現了1次

至此索引建立完成,搜索」drive」時,」driving」,」drove」,」driven」也可以被搜到。由於在索引中,」driving」,」drove」,」driven」都會通過語言處理而變成」drive」,在搜索時,若是您輸入」driving」,輸入的查詢語句一樣通過分詞組件和語言處理組件處理的步驟,變爲查詢」drive」,從而能夠搜索到想要的文檔。

搜索步驟

搜索」microsoft job」,用戶的目的是但願在微軟找一份工做,若是搜出來的結果是:」Microsoft does a good job at software industry…」,這就與用戶的指望偏離太遠了。如何進行合理有效的搜索,搜索出用戶最想要得結果呢?搜索主要有以下步驟:

一:對查詢內容進行詞法分析、語法分析、語言處理

  1. 詞法分析:區分查詢內容中單詞和關鍵字,好比:english and janpan,」and」就是關鍵字,」english」和」janpan」是普通單詞。
  2. 根據查詢語法的語法規則造成一棵樹
  3. 語言處理,和建立索引時處理方式是同樣的。好比:leaned–>lean,driven–>drive

二:搜索索引,獲得符合語法樹的文檔集合
三:根據查詢語句與文檔的相關性,對結果進行排序

咱們把查詢語句也看做是一個文檔,對文檔與文檔之間的相關性(relevance)進行打分(scoring),分數高比較越相關,排名就越靠前。固然還能夠人工影響打分,好比百度搜索,就不必定徹底按照相關性來排名的。

如何評判文檔之間的相關性?一個文檔由多個(或者一個)詞(Term)組成,好比:」solr」, 「toturial」,不一樣的詞可能重要性不同,好比solr就比toturial重要,若是一個文檔出現了10次toturial,但只出現了一次solr,而另外一文檔solr出現了4次,toturial出現一次,那麼後者頗有可能就是咱們想要的搜的結果。這就引伸出權重(Term weight)的概念。

權重表示該詞在文檔中的重要程度,越重要的詞固然權重越高,所以在計算文檔相關性時影響力就更大。經過詞之間的權重獲得文檔相關性的過程叫作空間向量模型算法(Vector Space Model)

影響一個詞在文檔中的重要性主要有兩個方面:

  • Term Frequencey(tf),Term在此文檔中出現的頻率,ft越大表示越重要
  • Document Frequency(df),表示有多少文檔中出現過這個Trem,df越大表示越不重要
    物以希爲貴,你們都有的東西,天然就不那麼貴重了,只有你專有的東西表示這個東西很珍貴,權重的公式:

空間向量模型

文檔中詞的權重看做一個向量

Document = {term1, term2, …… ,term N}

Document Vector = {weight1, weight2, …… ,weight N}

把欲要查詢的語句看做一個簡單的文檔,也用向量表示:

Query = {term1, term 2, …… , term N}

Query Vector = {weight1, weight2, …… , weight N}

把搜索出的文檔向量及查詢向量放入N維度的空間中,每一個詞表示一維:

夾角越小,表示越類似,相關性越大

 

補充:Lucene: 全文檢索的基本原理

http://www.cnblogs.com/guochunguang/articles/3641008.html 這個裏面有一些解釋!lucenesolr的區別是在於:Solr是基於Lucene開發的全文檢索服務器,而Lucene就是一套實現了全文檢索的api,其本質就是一個全文檢索的過程。全文檢索就是把原始文檔根據必定的規則拆分紅若干個關鍵詞,而後根據關鍵詞建立索引,當查詢時先查詢索引找到對應的關鍵詞,並根據關鍵詞找到對應的文檔,也就是查詢結果,最終把查詢結果展現給用戶的過程。

 

 

14.http的三次握手?socket有幾種狀態?socket底層編程?

http的三次握手

TCP(Transmission Control Protocol) 傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的鏈接服務,採用三次握手確認創建一個鏈接:

位碼即tcp標誌位,6種標示:SYN(synchronous創建聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)

Sequence number(順序號碼) Acknowledge number(確認號碼)

TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。 
第一次握手:創建鏈接時,客戶端發送syn(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認; 
第二次握手:服務器收到syn包,必須確認客戶的SYNack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態; 第三次握手:客戶端收到服務器的SYNACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據.

socket有幾種狀態

 

CLOSED

沒有使用這個套接字

LISTEN

套接字正在監聽入境鏈接

SYN_SENT

套接字正在試圖主動創建鏈接

SYN_RECEIVED

正在處於鏈接的初始同步狀態

ESTABLISHED

鏈接已創建

CLOSE_WAIT

遠程套接字已經關閉:正在等待關閉這個套接字

FIN_WAIT_1

套接字已關閉,正在關閉鏈接

CLOSING

套接字已關閉,遠程套接字正在關閉,暫時掛起關閉確認

LAST_ACK

遠程套接字已關閉,正在等待本地套接字的關閉確認

FIN_WAIT_2

套接字已關閉,正在等待遠程套接字關閉

TIME_WAIT

這個套接字已經關閉,正在等待遠程套接字的關閉傳送

 

socket底層編程(這個能夠不用瞭解)

http是網絡上層協議。底層仍是socket短鏈接是發送數據時進行聯接。發送完關閉(咱們作完電商項目以後這些有了解一下)

 

15.你所知道的通信協議?

ip網絡中,傳輸層主要協議是:tcpudp。在web,應用層也用http傳輸。

在網絡io中,目前主要有:bio(阻塞)nio(非阻塞)aio(異步jdk7中新特性)。具體不做解析能夠看相關文檔。

在傳輸中應用層的協議及規範主要有:

RMI(java原生的),用java自身的序列化技術。

xml-rpc  xml+http

Binary-RPC  用二進制+http

soap,能夠說是xml-rpc的一種封裝

COBRA,加入了jdk

jms,這個是一種規範,基於隊列模型的

主要的實現框架,能夠組合使用。

activeMQ:jms的一種實現

mina:基本是包裝了nio.Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easilyIt provides an abstract · event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.

Hessian:Hessian是一個輕量級的remoting onhttp工具.採用的是二進制RPC協議,由於採用的是二進制協議,因此它很適合於發送二進制數據.本身實現序列化。

Burlap:Hessian差很少,基於xml-RPC的實現

mule esb: 直接看官方文檔http://www.mulesoft.org/  基於總線模型

spring-Remoting 重量級的

Jboss-Remoting 重量及的

EJB3

 

 

16redis集羣中,某個節點宕機怎麼辦?你碰見過嗎?你的解決思路是什麼?

redis集羣:通常的是至少是2服務器,主從服務器若是redis集羣的服務器掛沒有關係還有備服務器

 

其餘面試問題彙總:

 

1hibernate mybetis的異同之處?

 Mybatishibernate不一樣,它不徹底是一個ORM框架,由於MyBatis須要程序員本身編寫Sql語句,不過mybatis能夠經過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。
 
    Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,由於這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。可是靈活的前提是mybatis沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件則須要自定義多套sql映射文件,工做量大。
 
    Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件(例如需求固定的定製化軟件)若是用hibernate開發能夠節省不少代碼,提升效率。可是Hibernate的缺點是學習門檻高,要精通門檻更高,並且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate須要具備很強的經驗和能力才行。
總之,按照用戶的需求在有限的資源環境下只要能作出維護性、擴展性良好的軟件架構都是好架構,因此框架只有適合纔是最好。 

 

2、用戶在app訂閱業務,使用什麼設計模式實現?應用場景是什麼?

觀察者模式又叫作發佈-訂閱(Publish/Subscribe)模式。觀察者模式定義了一種一對多地依賴模式,讓多個觀察者同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知全部的觀察者對象,使它們可以自動更新本身。這裏的主題對象就是指通知者,又叫作發佈者。觀察者又叫訂閱者。

3springmvc 如何聲明一個controller? 註解

若是不基於註解:   該類須要繼承  CommandController   或者 其餘不少 參見  spring幫助

            若是基於註解:在類名前  加上         @controller   

      補充:將類名前加上該註解,當spring啓動  或者web服務啓動  spring會自動掃描全部包(固然,這個能夠設置)

         做用就是告訴服務器  這個類是MVC中的C    這個類能夠接收用戶請求    處理用戶請求

 

 

4、設計模式有哪些?單例,工廠,觀察者.觀察者模式的應用場景?

常見的設計模式:單例模式、工廠模式、觀察者模式、裝飾模式與適配器模式橋接模式代理模式

 

 

5、怎麼聲明事物?spring配置文件中聲明

spring支持編程式事務管理和聲明式事務管理兩種方式。

        編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate

        聲明式事務管理創建在AOP之上的。其本質是對方法先後進行攔截,而後在目標方法開始以前建立或者加入一個事務,在執行完目標方法以後根據執行狀況提交或者回滾事務。聲明式事務最大的優勢就是不須要經過編程的方式管理事務,這樣就不須要在業務邏輯代碼中摻瑣事務管理的代碼,只需在配置文件中作相關的事務規則聲明(或經過基於@Transactional註解的方式),即可以將事務規則應用到業務邏輯中。

       顯然聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式。聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上註解就能夠得到徹底的事務支持。和編程式事務相比,聲明式事務惟一不足地方是,後者的最細粒度只能做用到方法級別,沒法作到像編程式事務那樣能夠做用到代碼塊級別。可是即使有這樣的需求,也存在不少變通的方法,好比,能夠將須要進行事務管理的代碼塊獨立爲方法等等。

         聲明式事務管理也有兩種經常使用的方式,一種是基於txaop名字空間的xml配置文件,另外一種就是基於@Transactional註解。顯然基於註解的方式更簡單易用,更清爽。

 

 

6、編寫匹配字符串(求質數)的程序

http://blog.csdn.net/xianfajushi/article/details/50133965

7、分詞技術

1、       爲何要進行中文分詞?

詞是最小的可以獨立活動的有意義的語言成分,英文單詞之間是以空格做爲天然分界符的,而漢語是以字爲基本的書寫單位,詞語之間沒有明顯的區分標記,所以,中文詞語分析是中文信息處理的基礎與關鍵。

Lucene中對中文的處理是基於自動切分的單字切分,或者二元切分。除此以外,還有最大切分(包括向前、向後、以及先後相結合)、最少切分、全切分等等。

 

IK分析器的分詞原理本質上是詞典分詞。如今內存中初始化一個詞典,而後在分詞過程當中逐個讀取字符,和字典中的字符相匹配,把文檔中的全部的詞語拆分出來的過程。

8、不開啓服務,頁面怎麼實現熱更新!

項目打成war包發在服務器裏面,直接運行

 

面試問題分類:

1、Java基礎
1.String類爲何是final的。

 


2.HashMap的源碼,實現原理,底層結構。
3.反射中,Class.forNameclassloader的區別
4.sessioncookie的區別和聯繫,session的生命週期,多個服務部署時session管理。
5.Java中的隊列都有哪些,有什麼區別。
6.Java的內存模型以及GC算法
7.Java7Java8的新特性
8.Java數組和鏈表兩種結構的操做效率,在哪些狀況下(從開頭開始,從結尾開始,從中間開始),哪些操做(插入,查找,刪除)的效率高
9.Java內存泄露的問題調查定位:jmapjstack的使用等等

2、框架
1.struts1struts2的區別

Struts 1要求Action類要擴展自一個抽象基類。Struts 1的一個共有的問題是面向抽象類編程而不是面向接口編程。
Struts 2Action類實現了一個Action接口,連同其餘接口一塊兒實現可選擇和自定義的服務。Struts 2提供一個名叫ActionSupport的基類實現通常使用的接口。雖然,Action接口不是必須的。任何使用execute方法的POJO對象能夠 被看成Struts 2Action對象使用。 
程模型
Struts 1 Action類是單例類,因只有一個示例控制全部的請求。單例類策略形成了必定的限制且給開發帶來了額外的煩惱。Action資源必須是程安全或者同步 的。
Struts 2 Action對象每個請求都實例化對象,因此沒有程安全的問題。(實踐中,servlet容器生許多丟的對象對於每個請求,多於一個的對象並不影響垃 圾收集)
Servlet 依賴
Struts 1Action類依賴於servlet APIHttpServletRequestHttpServletResponse做參數傳給execute方法當Action被調用時。
Struts 2Action不和容器有關。Servlet上下文被表現簡單的Maps,容許Action被獨立的測試。Struts 2Action能夠訪問最初的請求和相應,若是須要的話。然而,其餘的架構元素少或者排除直接訪問HttpServletRequest或者 HttpServletResponse的須要。 
易測性
測試Struts 1的主要障礙是execute方法暴露了Servlet API。第三方的擴展,Struts測試用例,提供Struts 1的集合對象。
Struts 2Action能夠經過實例化Action測試,設置屬性,而後調用方法。依賴注入的支持也是測試變得更簡單。
接受輸入
Struts 1使用ActionForm對象捕獲輸入。象Action同樣,全部的ActionForm必須擴展基類。因其餘的JavaBean不能做 ActionForm使用,開發者常常建立多餘的類捕獲輸入。DynaBeans能夠被用來做替代ActionForm的類建立。可是開發者能夠從新描述 已經存在的JavaBean
Struts 2 Action屬性做輸入屬性,排除第二個輸入對象的須要。輸入屬性可能有豐富的對象類型這些類型有他們本身的屬性。Action的屬性能夠經過標籤庫訪 問。Struts 2也支持ActionForm形式。豐富的對象類型,包含業務或者域對象,能夠被看成輸入或者輸出對象使用。饃型驅動特性簡化標籤對POJO輸入對象的引 用。
表達式語言
Struts 1整和JSTL,因此它使用JSTL的表達式語言。表達式語言有基本的圖形對象移動,可是相對很弱的集合和被索引的屬性支持。
Struts 2使用JSTL,可是框架也支持更大和更靈活的表達式,叫作對象圖形符號語言OGNL)。
將值綁定要視圖上
Struts 1使用標準JSP機制來綁定對象到頁面上下文。
Struts 2使用「ValueStack」技術了標籤庫能夠不用連接你的視圖到對象的表現類型訪問值。ValueStack策略容許重用視圖。
類型轉換
Struts 1ActionForm屬性常常都是String的。Struts 1使用Commons-Beanutils類型轉換。轉換每個類,不是每個實例配置。
Struts 2使用OGNL類型轉換。框架包含轉換器基本的和共同的對象類型和原始類型。
驗證
Struts 1支持手動驗證憑藉ActionFormvalidate方法,或者經過擴展的公用驗證器。類能夠有不一樣的驗證上下文未相同的類,可是不能不能包括驗證 子對象。
Struts 2支持手動驗證憑藉validate方法和XWork驗證框架。Xwork驗證框架支持一連串的驗證子屬性使用的驗證了屬性類的類型和嚴正上下文而定義。
Action執行的控制
Struts 1支持獨立的請求處理器對於每個模型,可是全部在模型中的Action必須共享同一個生命週期。
Struts 2支持在每個Action基礎上憑藉攔截棧建立不一樣的生命週期。自定義棧能夠被建立且使用不一樣的所需 的Action

 


2.struts2springMVC的區別

①springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。

②springmvc是基於方法開發,傳遞參數是經過方法形參,能夠設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是經過類的屬性,只能設計爲多例。
③Struts採用值棧存儲請求和響應的數據,經過OGNL存取數據, springmvc經過參數解析器是將request對象內容進行解析成方法形參,將響應數據和頁面封裝成ModelAndView對象,最後又將模型數據經過request對象傳輸到頁面。 Jsp視圖解析器默認使用jstl。

④ Struts2有漏洞,springmvc目前尚未漏洞出現。若是使用struts2,建議下載最新包。

 


3.spring框架中須要引用哪些jar包,以及這些jar包的用途

Spring3.X之後jar包進行了重構,取消了原來2.X版本中的總的spring.jar包,而是把總包中的功能所有分開打包。正在向osgi靠攏。
Spring官網提供了共20個包,各個包的做用以下:

org.springframework.aop-3.0.6.RELEASE

Spring的面向切面編程,提供AOP(面向切面編程)實現

org.springframework.asm- 3.0.6.RELEASE

Spring獨立的asm程序,Spring2.5.6的時候須要asmJar 包3.0.6開始提供他本身獨立的asmJar

org.springframework.aspects- 3.0.6.RELEASE

Spring提供對AspectJ框架的整合

org.springframework.beans-3.0.6.RELEASE

SpringIoC(依賴注入)的基礎實現

org.springframework.context.support-3.0.6.RELEASE

Spring-context的擴展支持,用於MVC方面

org.springframework.context-3.0.6.RELEASE

Spring提供在基礎IoC功能上的擴展服務,此外還提供許多企業級服務的支持,如郵件服務、任務調度、JNDI定位、EJB集成、遠程訪問、緩存以及各類視圖層框架的封裝等

org.springframework.core-3.0.6.RELEASE

Spring3.0.6的核心工具

org.springframework.expression-3.0.6.RELEASE

Spring表達式語言

org.springframework.instrument.tomcat-3.0.6.RELEASE

Spring3.0.6對Tomcat的鏈接池的集成

org.springframework.instrument-3.0.6.RELEASE

Spring3.0.6對服務器的代理接口

org.springframework.jdbc-3.0.6.RELEASE

對JDBC的簡單封裝

org.springframework.jms-3.0.6.RELEASE

爲簡化JMS API的使用而做的簡單封裝

org.springframework.orm-3.0.6.RELEASE

整合第三方的ORM框架,如hibernate,ibatis,jdo,以及 spring的JPA實現

org.springframework.oxm-3.0.6.RELEASE

Spring 對Object/XMl的映射支持,可讓Java與XML之間來回切換

org.springframework.test-3.0.6.RELEASE

對Junit等測試框架的簡單封裝

org.springframework.transaction-3.0.6.RELEASE

爲JDBC、Hibernate、JDO、JPA等提供的一致的聲明式和編程式事務管理

org.springframework.web.portlet-3.0.6.RELEASE

基於protlet的MVC實現

org.springframework.web.servlet-3.0.6.RELEASE

基於servlet的MVC實現

org.springframework.web.struts-3.0.6.RELEASE

整合Struts的時候的支持

org.springframework.web-3.0.6.RELEASE

SpringWeb下的工具包

 

作Spring還必須依賴第三方包:

① Spring 工程依賴的公共包
commons-logging-1[1].0.4.jar(只要是作Spring都須要這個包,不然工程起不來)

② 使用SpringAOP功能時依賴的包
 aspectjweaver-1[1].5.3.jar
aopalliance-1.0.jar  (下載:http://mirrors.ibiblio.org/maven2/aopalliance/aopalliance/1.0/)

③ 使用SpringJDBC功能時依賴的包
commons-dbcp.jar (下載:http://commons.apache.org/dbcp/download_dbcp.cgi)
commons-pool.jar (下載:http://mirrors.ibiblio.org/maven2/commons-pool/commons-pool/)
commons-collections-2.1.1.jar

 


4.srpingMVC的原理

1. 客戶端請求提交到DispatcherServlet

2. 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找處處理請求的Controller

3. DispatcherServlet將請求提交到Controller

4. Controller調用業務邏輯處理後,返回ModelAndView

5. DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖

6. 視圖負責將結果顯示到客戶端

DispatcherServlet是整個Spring MVC的核心。它負責接收HTTP請求組織協調Spring MVC的各個組成部分。其主要工做有如下三項:

       1. 截獲符合特定格式的URL請求。
       2. 初始化DispatcherServlet上下文對應的WebApplicationContext,並將其與業務層、持久化層的WebApplicationContext創建關聯。
       3. 初始化Spring MVC的各個組成組件,並裝配到DispatcherServlet中。

 

 


5.springMVC註解的意思


@Controller 
@Controller 負責註冊一個bean spring 上下文中,bean ID 默認爲

類名稱開頭字母小寫,你也能夠本身指定,以下 
方法一: 
@Controller 
public class TestController {} 
 
方法二:            
@Controller("tmpController") 
public class TestController {} 
 
@RequestMapping 
 
1.@RequestMapping用來定義訪問的URL,你能夠爲整個類定義一個

@RequestMapping,或者爲每一個方法指定一個。 
@RequestMapping放在類級別上,這可令它與方法級別上的

@RequestMapping註解協同工做,取得縮小選擇範圍的效果。 
例如: 
@RequestMapping("/test") 
public class TestController {} 
則,該類下的全部訪問路徑都在/test之下。 
 
2.@RequestMapping用於整個類不是必須的,若是沒有配置,全部的方法

的訪問路徑配置將是徹底獨立的,沒有任何關聯。 
 
3.完整的參數項爲:@RequestMapping(value="",method =

{"",""},headers={},params={"",""}),各參數說明以下:
value :String[] 設置訪問地址 
method: RequestMethod[]設置訪問方式,字符數組,查看RequestMethod

類,包括GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE,經常使用

RequestMethod.GETRequestMethod.POST 
headers:String[] headers通常結合method = RequestMethod.POST使用 
params: String[] 訪問參數設置,字符數組 例如:userId=id 
 
4.value的配置還能夠採用模版變量的形式 ,例如:@RequestMapping

(value="/owners/{ownerId}", method=RequestMethod.GET),這點將在介

@PathVariable中詳細說明。 
 
5.@RequestMapping params的補充說明,你能夠經過設置參數條件來限制

訪問地址,例如params="myParam=myValue"表達式,訪問地址中參數只有

包含了該規定的值"myParam=myValue"才能匹配得上,相似"myParam"之類

的表達式也是支持的,表示當前請求的地址必須有該參數(參數的值能夠是

任意)"!myParam"之類的表達式代表當前請求的地址不能包含具體指定的

參數"myParam" 
 
6.有一點須要注意的,若是爲類定義了訪問地址爲*.do,*.html之類的,則

在方法級的@RequestMapping,不能再定義value值,不然會報錯,例如 
Java代碼  
@RequestMapping("/bbs.do")  
public class BbsController {  
    @RequestMapping(params = "method=getList")  
    public String getList() {  
     return "list";  
    }  
@RequestMapping(value= "/spList")  
public String getSpecialList() {  
     return "splist";  
    }  
}  
 
如上例:/bbs.do?method=getList 能夠訪問到方法getList() ;而訪

/bbs.do/spList則會報錯. 
 
@PathVariable 
1.@PathVariable用於方法中的參數,表示方法參數綁定到地址URL的模板

變量。 
例如: 
Java代碼  
@RequestMapping(value="/owners/{ownerId}", 

method=RequestMethod.GET)  
public String findOwner(@PathVariable String ownerId, Model 

model) {  
  Owner owner = ownerService.findOwner(ownerId);    
  model.addAttribute("owner", owner);    
  return "displayOwner";  
}  
 
2.@PathVariable用於地址欄使用{xxx}模版變量時使用。 
若是@RequestMapping沒有定義相似"/{ownerId}" ,這種變量,則使用在

方法中@PathVariable會報錯。 
 
 
@ModelAttribute 
1.應用於方法參數,參數能夠在頁面直接獲取,至關於

request.setAttribute(,) 
2.應用於方法,將任何一個擁有返回值的方法標註上 @ModelAttribute,使

其返回值將會進入到模型對象的屬性列表中. 
3.應用於方法參數時@ModelAttribute("xx"),須關聯到Object的數據類型

,基本數據類型 如:int,String不起做用 
例如: 
Java代碼  
@ModelAttribute("items")//<——①向模型對象中添加一個名爲items

屬性  
public List<String> populateItems() {  
        List<String> lists = new ArrayList<String>();  
        lists.add("item1");  
        lists.add("item2");  
        return lists;  
}  
@RequestMapping(params = "method=listAllBoard")  
public String listAllBoard(@ModelAttribute("currUser")User user, 

ModelMap model) {  
        bbtForumService.getAllBoard();  
        //<——②在此訪問模型中的items屬性  
        System.out.println("model.items:" + ((List<String>)

model.get("items")).size());  
        return "listBoard";  
}  
 
在 ① 處,經過使用 @ModelAttribute 註解,populateItem() 方法將在

任何請求處理方法執行前調用,Spring MVC 會將該方法返回值以「items

爲名放入到隱含的模型對象屬性列表中。 
因此在 ② 處,咱們就能夠經過 ModelMap 入參訪問到 items 屬性,當執

listAllBoard() 請求處理方法時,② 處將在控制檯打印

「model.items:2」的信息。固然咱們也能夠在請求的視圖中訪問到模型

對象中的 items 屬性。 
 
 
@ResponseBody 
這個註解能夠直接放在方法上,表示返回類型將會直接做爲HTTP響應字節

流輸出(不被放置在Model,也不被攔截爲視圖頁面名稱)。能夠用於ajax 
 
@RequestParam 
@RequestParam是一個可選參數,例如:@RequestParam("id") 註解,因此

它將和URL所帶參數 id進行綁定 
若是入參是基本數據類型(如 intlongfloat 等),URL 請求參數中

必定要有對應的參數,不然將拋出 

org.springframework.web.util.NestedServletException 異常,提示無

法將 null 轉換爲基本數據類型. 
 
@RequestParam包含3個配置 @RequestParam(required = ,value="", 

defaultValue = "") 
required :參數是否必須,boolean類型,可選項,默認爲true 
value: 傳遞的參數名稱,String類型,可選項,若是有值,對應到設置方

法的參數 
defaultValue:String類型,參數沒有傳遞時爲參數默認指定的值 
 
@SessionAttributes session管理 
Spring 容許咱們有選擇地指定 ModelMap 中的哪些屬性須要轉存到 

session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問

到這些屬性。這一功能是經過類定義處標註 @SessionAttributes 註解來

實現的。@SessionAttributes 只能聲明在類上,而不能聲明在方法上。 
 
例如 
 
@SessionAttributes("currUser") // ModelMap 中屬性名爲currUser 的屬性 


@SessionAttributes({"attr1","attr2"}) 
@SessionAttributes(types = User.class) 
@SessionAttributes(types = {User.class,Dept.class}) 
@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"}) 

 
@CookieValue 獲取cookie信息 
@RequestHeader 獲取請求的頭部信息

 


6.springbeanFactoryApplicationContext的聯繫和區別

 

BeanFacotryspring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory沒法支持spring的許多插件,如AOP功能、Web應用等。 
  ApplicationContext接口,它由BeanFactory接口派生而來,於是提供BeanFactory全部的功能。ApplicationContext以一種更向面向框架的方式工做以及對上下文進行分層和實現繼承,ApplicationContext包還提供瞭如下的功能: 
  • MessageSource, 提供國際化的消息訪問  
  • 資源訪問,如URL和文件  
  • 事件傳播  
  • 載入多個(有繼承關係)上下文 ,使得每個上下文都專一於一個特定的層次,好比應用的web  

 


7.spring注入的幾種方式

  • 接口注入
  • Setter方法注入
  • 構造方法注入
  • spring4能夠註解注入@Autowired

 

 


8.spring如何實現事物管理的

是經過AOP對配置的方法進行欄截,而後再調用事務管理器中的預設代碼對事務進行管理,再委託被攔截方法完成原有的任務。


9.springIOCAOP的原理
10.hibernate中的1級和2級緩存的使用方式以及區別原理
11.spring中循環注入的方式

什麼是循環注入?舉個列子我有一個類AA有一個構造器裏面的參數是類B,而後類B裏面有個構造器參數是類C,類C裏面有個構造器參數是類A,就是咱們會發現其實引用循環了A 裏面有B的引用,B裏面有C的引用,C裏面又有A的引用。

 

循環依賴又分爲構造器循環依賴和set循環依賴:

首先講一下構造器的循環依賴:

  1. public class A  
  2. {  
  3. public A(B b)  
  4. {  
  5. }  
  6. }  

 

  1. public class B  
  2. {  
  3. public B(C c)  
  4. {  
  5. }  
  6. }  

 

 

  1. public class C  
  2. {  
  3. public C(A a)  
  4. {  
  5. }  
  6. }  


當咱們用spring來加載A的時候spring的流程是這樣的:

1spring建立A首先去當前建立池中去查找當前A是否在建立,若是發明沒有建立則準備其構造器須要的參數B,而後把建立A的標識放入當前建立池中。

2spring建立B首先去當前建立池中去查找當前B是否在建立,若是發現沒有建立則準備其構造器須要的參數C,而後把建立B的標識放入當前建立池中。

3spring建立C首先去當前建立池中去查找當前C是否在建立,若是發現沒有建立則準備其構造器須要的參數A,而後把建立C的標識放入當前建立池中。

4spring建立C須要的A,這個時候會發如今當前建立池中已經有A的標識,A正在建立中則拋出BeanCurrentlyInCreationException

構造器的循環注入是沒有辦法解決的,因此只能咱們避免.

 

接下來看下set方式的循環注入:
set方式的循環注入分2種狀況,第一種狀況是能夠解決的循環注入就是單列狀況下。第二種狀況就是沒法解決的循環注入就是多列狀況下,下面分析一下緣由:

先看第一種狀況,仍是拿上面的ABC3個類來講明問題,只不過此次不是構造器裏面的參數,而是換成他們的成員變量,而後經過set方式類注入,這裏代碼就不寫了直接講下:

單列下set方式的注入流程是這樣的:

1spring建立A,首先根據其無參構造器建立一個對象A,而後提早暴露出建立出來的這個A對象,而後再當前的建立池中放入建立A的標識,而後進行set方法注入B

2spring建立B,首先根據其無參構造器建立一個對象B,而後提早暴露出建立出來的這個B對象,而後在當前的建立池中放入建立B的標識,而後進行set方法的注入C

3spring建立C,首先根據其無參構造器建立一個對象C,而後提早暴露出建立處理的這個C對象,而後在當前的建立池中放入建立C的標識,而後進行set方法的注入A

4:在第三步注入A的時候因爲提早暴露出來了建立出來的A對象因此不會報BeanCurrentlyInCreationException的錯誤。

多列下set方式的循環注入不能解決的緣由是在多列的狀況下,當建立對象的時候spring不會提早暴露建立處理的對象A,這樣的話則會和構造器循環注入出現同樣的狀況最終致使報錯

 



3、多線程
1.Java建立線程以後,直接調用start()方法和run()的區別

Thread類中run()start()方法的區別以下:
run()方法:在本線程內調用該Runnable對象的run()方法,能夠重複屢次調用;
start()方法:啓動一個線程,調用該Runnable對象的run()方法,不能屢次啓動一個線程;

 

當你調用start()方法時你將建立新的線程,而且執行在run()方法裏的代碼。可是若是你直接調用run()方法,它不會建立新的線程也不會執行調用線程的代碼

 


2.經常使用的線程池模式以及不一樣線程池的使用場景

http://blog.163.com/wm_at163/blog/static/132173490201242984518354/
3.newFixedThreadPool此種線程池若是線程數達到最大值後會怎麼辦,底層原理。
4.多線程之間通訊的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關不少的具體問題,例如同一個類不一樣方法都有synchronized鎖,一個對象是否能夠同時訪問。或者一個類的static構造方法加上synchronized以後的鎖的影響。
5.瞭解可重入鎖的含義,以及ReentrantLock synchronized的區別
6.同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲何他是同步的且效率高
7.atomicintegervolatile等線程安全操做的關鍵字的理解和使用
8.線程間通訊,waitnotify
9.定時線程的使用
10.場景:在一個主線程中,要求有大量(不少不少)子線程執行完以後,主線程才執行完成。多種方式,考慮效率。

4、網絡通訊
1.http是無狀態通訊,http的請求方式有哪些,能夠本身定義新的請求方式麼。
2.socket通訊,以及長鏈接,分包,鏈接異常斷開的處理。
3.socket通訊模型的使用,AIONIO
4.socket框架netty的使用,以及NIO的實現原理,爲何是異步非阻塞。
5.同步和異步,阻塞和非阻塞。

5、Linux
1.經常使用的linux下的命令
2.大的log文件中,統計異常出現的次數、排序,或者指定輸出多少行多少列的內容。(主要考察awk)
3.linux下的調查問題思路:內存、CPU、句柄數、過濾、查找、模擬POSTGET請求等等場景
4.shell腳本中#!的做用

6、數據庫MySql
1.MySql的存儲引擎的不一樣
2.單個索引、聯合索引、主鍵索引
3.Mysql怎麼分表,以及分表後若是想按條件分頁查詢怎麼辦(若是不是按分表字段來查詢的話,幾乎效率低下,無解)
4.分表以後想讓一個id多個表是自增的,效率實現
5.MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6.SQL語句。。。
7.索引的數據結構,B+
8.事物的四個特性,以及各自的特色(原子、隔離)等等,項目怎麼解決這些問題

7、設計模式(寫代碼)
1.單例模式:飽漢、餓漢。以及餓漢中的延遲加載
2.工廠模式、裝飾者模式、觀察者模式。

8、算法
1.使用隨機算法產生一個數,要求把1-1000W之間這些數所有生成。(考察高效率,解決產生衝突的問題)
2.兩個有序數組的合併排序
3.一個數組的倒序
4.計算一個正整數的正平方根
5.說說常見的查找排序算法
9、緩存
1.爲何用緩存,用過哪些緩存,redismemcache的區別
2.redis的數據結構
3.redis的持久化方式,以及項目中用的哪一種,爲何
4.redis集羣的理解,怎麼動態增長或者刪除一個節點,而保證數據不丟失。

 贏在格局,不失風雅。

相關文章
相關標籤/搜索