1. 程式人生 > >Java開發工程師一到五年面試題總結

Java開發工程師一到五年面試題總結

1.JAVA的垮平臺原理

JVM也是一個軟體,不同的平臺有不同的版本。我們編寫的Java原始碼,編譯後會生成一種 .class 檔案,稱為位元組碼檔案。Java虛擬機器就是負責將位元組碼檔案翻譯成特定平臺下的機器碼然後執行。也就是說,只要在不同平臺上安裝對應的JVM,就可以執行位元組碼檔案,執行我們編寫的Java程式。 

而這個過程中,我們編寫的Java程式沒有做任何改變,僅僅是通過JVM這一”中間層“,就能在不同平臺上執行,真正實現了”一次編譯,到處執行“的目的。 

JVM是一個”橋樑“,是一個”中介軟體“,是實現跨平臺的關鍵,Java程式碼首先被編譯成位元組碼檔案,再由JVM將位元組碼檔案翻譯成機器語言,從而達到執行Java程式的目的。 

注意:編譯的結果不是生成機器碼,而是生成位元組碼,位元組碼不能直接執行,必須通過JVM翻譯成機器碼才能執行。不同平臺下編譯生成的位元組碼是一樣的,但是由JVM翻譯成的機器碼卻不一樣。 

所以,執行Java程式必須有JVM的支援,因為編譯的結果不是機器碼,必須要經過JVM的再次翻譯才能執行。即使你將Java程式打包成可執行檔案(例如 .exe),仍然需要JVM的支援。 

注意:跨平臺的是Java程式,不是JVM。JVM是用C/C++開發的,是編譯後的機器碼,不能跨平臺,不同平臺下需要安裝不同版本的JVM。

2.JAVA中INT佔幾個位元組 

char 佔2個位元組 

boolean 一個位元組(1位)

3.JAVA面向物件的特徵

封裝、抽象、繼承和多型。

封裝:在面嚮物件語言中,封裝特性是由類來體現的,我們將現實生活中的一類實體定義成類,其中包括屬性和行為(在Java中就是方法).例如電腦,

抽象:抽象就是將一類實體的共同特性抽象出來,封裝在一個抽象類中,所以抽象在面嚮物件語言是由抽象類來體現的。比如人. 

class Person{}

繼承:繼承就像是我們現實生活中的父子關係,兒子可以遺傳父親的一些特性,在面嚮物件語言中,就是一個類可以繼承另一個類的一些特性,從而可以程式碼重用. 

eg:class Zhangsan extends Person{};

多型:多型就是通過傳遞給父類物件引用不同的子類物件從而表現出不同的行為 

eg:Person person=new Zhangsan();

4.裝箱和拆箱

為什麼需要裝箱和拆箱:是java早年設計缺陷。基礎型別是資料,不是物件,也不是Object的子類。

裝箱就是自動將基本資料型別轉換為包裝器型別;拆箱就是自動將包裝器型別轉換為基本資料型別。 

1. Integer a = Integer.valueOf(123);//裝箱 

1. int b = a.intValue(); //拆箱

5.==和EQUALS的區別

關於== 

1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。 

2.複合資料型別(類) 當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放地

equals 

Java 語言裡的 equals方法其實是交給開發者去覆寫的,讓開發者自己去定義滿足什麼條件的兩個Object是equal的。

6.String,StringBuilder,StringBuffer的區別

執行速度:StringBuilder >StringBuffer >String

String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。Java中對String物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程,所以執行速度很慢。而StringBuilder和StringBuffer的物件是變數,對變數進行操作就是直接對該物件進行更改,而不進行建立和回收的操作,所以速度要比String快很多。

執行緒安全:StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的

如果一個StringBuffer物件在字串緩衝區被多個執行緒使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證執行緒是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證執行緒安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多執行緒的,那麼就要使用StringBuffer,但是在單執行緒的情況下,還是建議使用速度比較快的StringBuilder。

使用場景

String:適用於少量的字串操作的情況

StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況

7.講一下JAVA中的集合

java中的集合分為value(Collection),和key-value(Map)兩種;

儲存value的有list和set兩種: 

list是有序的,可重複的 

set是無序的,不可重複的

儲存為key-value是map:HashMap,Hashtable,CurrentHashMap

8.ARRAYLIST, Vector和LINKEDLIST的區別

1.區別

Vector、ArrayList都是以類似陣列的形式儲存在記憶體中,LinkedList則以連結串列的形式進行儲存。

Vector執行緒同步,ArrayList、LinkedList執行緒不同步。

LinkedList適合指定位置插入、刪除操作,不適合查詢;ArrayList、Vector適合查詢,不適合指定位置的插入、刪除操作。

Vector預設擴充為原來的兩倍,(每次擴充空間的大小是可以設定的),而ArratList預設擴充為原來的1.5倍(檢視之前的文章),因此ArrayList更節省空間。

2.聯絡

ArrayList,Vector、LinkedList類均在java.util包中都是可改變大小的.

ArrayList和Vector都是基於儲存元素的Object[ ] array 來實現的,他們會在記憶體中開闢一塊連續的空間來儲存,由於資料儲存是連續的,因此,他們支援用索引來訪問元素,同時索引資料的速度比較快。但是在插入元素時需要移動容器中的元素,所以對資料的插入操作執行的比較慢。ArrayList和Vector都有一個初始化的容量大小,當裡邊儲存的元素超過這個大小時就需要動態地擴充他們的儲存空間。

9.HASHMAP和HASHTABLE的區別

相同:HashMap和Hashtable都可以使用來儲存key-value的資料

區別:

基類不同:HashTable基於Dictionary類,而HashMap是基於AbstractMap。Dictionary是什麼?它是任何可將鍵對映到相應值的類的抽象父類,而AbstractMap是基於Map介面的骨幹實現,它以最大限度地減少實現此介面所需的工作。

執行緒安全:HashMap時單執行緒安全的,Hashtable是多執行緒安全的。

遍歷不同:HashMap僅支援Iterator的遍歷方式,Hashtable支援Iterator和Enumeration兩種遍歷方式。

null不同:HashMap可以允許存在一個為null的key和任意個為null的value,但是HashTable中的key和value都不允許為null。

多執行緒時,如何保障執行緒安全的同時也能保證效率?ConcurrentHashMap 

通過把整個Map分為N個segment(類似Hashtable),這樣既可以保障執行緒安全,也能使效率提高N倍,預設是16倍. 

ConcurrentHashMap當中每個Segment各自持有一把鎖。在保證執行緒安全的同時降低了鎖的粒度,讓併發操作效率更高。

10.實現一個拷貝檔案的工具類要使用位元組流還是字串

使用位元組流,因為我們要拷貝的檔案,不好確定裡面是否全是字元,如果檔案中包含圖片之類的位元組時,就需要使用位元組流.所以,我們一般是用位元組流拷貝檔案.

11.執行緒的的實現方式?怎麼啟動執行緒?怎麼區分執行緒?

1.繼承Thread類,不推薦

1.實現Runnable 介面

1.實現java.util.concurrent下的Callable介面

執行緒啟動:呼叫start()方法;(呼叫start()方法,是使得執行緒處於可執行狀態,執行緒並不一定會執行.如果start()方法是在main方法中呼叫的話,run()會執行.如果是在junit4下的話,執行緒不一定會執行)

怎麼區分執行緒:給執行緒設定名字

12.執行緒併發庫和執行緒池的作用

簡單瞭解過,JDK5中增加了併發庫,java.util.concurrent中提供了對執行緒優化.管理的各項操作,該包提供了執行緒的執行,執行緒池的建立,執行緒生命週期的控制.

執行緒池:java.util.concurrent.Executors建立四種執行緒池

newCachedThreadPool 建立非固定數量,可快取的執行緒池,若執行緒池超過處理需要,可靈活回收空執行緒,若沒有執行緒可回收,則建新執行緒

newFixedThreadPool固定執行緒池,底層是無界佇列,可控制最大併發數,超出的執行緒會在佇列中等待

newScheduledThreadPool定時執行執行緒池,支援定時及週期性任務執行

newSingleThreadExecutor單執行緒化的執行緒池,只會用唯一的工作執行緒來執行任務,保證所有任務按照順序執行

執行緒池的好處:

限定執行緒的個數,不會導致由於執行緒過多導致系統執行緩慢或崩潰

執行緒池每次都不需要去建立和銷燬,節約了資源

執行緒池不需要每次都去建立,相應時間更快.

13.設計模式和常用的設計模式(選擇自己熟悉的說,最好能手寫)

設計過程中可以反覆使用的、可以解決特定問題的通用模板.

建立型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。

結構型模式(7種):介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。

行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

14.HTTP GET POST請求的區別

1、GET請求,請求的資料會附加在URL之後,以?分割URL和傳輸資料,多個引數用&連線。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字元都要編碼之後再傳輸。

POST請求:POST請求會把請求的資料放置在HTTP請求包的包體中。

因此,GET請求的資料會暴露在位址列中,而POST請求則不會。

2、傳輸資料的大小

在HTTP規範中,沒有對URL的長度和傳輸的資料大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和伺服器對URL的長度有限制。因此,在使用GET請求時,傳輸資料會受到URL長度的限制。

對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個伺服器會規定對POST提交資料大小進行限制,Apache、IIS都有各自的配置。

3、安全性

POST的安全性比GET的高。這裡的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改伺服器的資料。比如,在進行登入操作,通過GET請求,使用者名稱和密碼都會暴露再URL上,因為登入頁面有可能被瀏覽器快取以及其他人檢視瀏覽器的歷史記錄的原因,此時的使用者名稱和密碼就很容易被他人拿到了。

15.說說你對SERVLET的理解

就是一個執行在WEB伺服器上的小的Java程式,用來接收和響應從客戶端傳送過來的請求,通常使用HTTP協議. 

使用:1、編寫一個Java類,實現servlet介面。 

2、把開發好的Java類部署到web伺服器中。 

按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet介面的java程式,稱之為Servlet

    Servlet            :介面

        |

    GenericServlet :通用的Servlet

        |

    HttpServlet        :HttpServlet

* 編寫一個類繼承HttpServlet,重寫doGet和doPost方法. 

* 配置

16.SERVLET的生命週期

使用者第一次訪問Servlet的時候,伺服器會建立一個Servlet的例項,那麼Servlet中init方法就會執行.任何一次請求伺服器都會建立一個新的執行緒訪問Servlet中的service的方法.在service方法內部根據請求的方式的不同調用doXXX的方法.(get請求呼叫doGet,post請求呼叫doPost).當Servlet中伺服器中移除掉,或者關閉伺服器,Servlet的例項就會被銷燬,那麼destroy方法就會執行.

17.SERVLET中FORWARD和REDIRECT的區別

重定向(redirect)其實是兩次request,第一次,客戶端request,A伺服器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。 

請求轉發(forward)是伺服器內部把對一個request/response的處理權,移交給另外一個.對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。傳輸的資訊不會丟失。

18.JSP和SERVLET的相同點和不同點

聯絡: 

JSP 是 Servlet 技術的擴充套件,本質上是 Servlet 的簡易方式,更強調應用的外表表達。 

JSP編譯後是”類 servlet”。 

不同點: 

- Servlet 的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。Servlet如果要實現html功能,必須使用Writer輸出對應的html. 

- JSP 的情況是Java和HTML可以組合成一個副檔名為.jsp 的檔案。做介面展示比較方便,而嵌入邏輯複雜. 

- JSP 側重於檢視,Servlet 主要用於控制邏輯

19.jsp內建物件和四大作用域和頁面傳值

內建物件名型別

requestHttpServletRequest

responseHttpServletResponse

configServletConfig

applicationServletContext

sessionHttpSession

exceptionThrowable

pageObject(this)

outJspWriter

pageContextPageContext

域範圍

page域只能在當前jsp頁面使用

request域只能在同一個請求中使用

session域只能在同一個會話(session物件)中使用

context域只能在同一個web應用中使用

20.SESSION和COOKIE的區別和使用場景

Session和cookie都是會話(session)跟蹤技術.cookie通過在客戶端記錄資訊確定使用者身份,而session是通過在伺服器端記錄資訊確定使用者身份.但是session的實現依賴於cookie機制來儲存JESESSIONID(session的唯一標識,需要存在客戶端)

區別: 

1. cookie的資料儲存在客戶端,session的資料儲存在伺服器上 

1. cookie不是很安全,別人可以通過分析存放在本地的cookie並進行cookie欺騙,考慮到安全應該使用session 

1. session會在一定時間內儲存在伺服器上,當訪問增多時,會影響伺服器的效能.考慮到伺服器效能,應當使用cookie. 

1. 單個cookie儲存資料不能超過4k,很多瀏覽器顯示一個站點最多儲存20個cookie 

2. 將重要資訊儲存在session中(登陸),將其他需要保留的信心存放在cookie中(購物車,cookie是可以在客戶端禁用的,這時候要使用cookie+資料庫的方式實現購物車,當cookie中不能取出資料,就從資料庫中取)

21.MVC模式和MVC各部分的實現

MVC的全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,是一種軟體設計典範.低耦合(m和v的分離) 

struts2的mvc:jsp–>StrutsPrepareAndExecuteFilter(前端控制器,核心控制器)+action–>javabean–>result

22.資料庫分類和常用資料庫 

- 關係型:MySQL、 ORACLE、SQL Server、IBM DB2、Sybase 

- 非關係型:Redis,Memcached,MongoDB ,Hadoop

23.關係型資料庫的三正規化

正規化就是規範,就是關係型資料庫設計表時遵循的三個規範.要滿足第二正規化,必須先滿足第一正規化,要滿足第三正規化,必須先滿足第二正規化

第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。列資料的不可分割.

第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被唯一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識.(主鍵)

第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。(外來鍵)

反三正規化:有時候為了效率,可以設定重複或者可推匯出的欄位.比如:訂單(總價),訂單項(單價)

24.事務的四大特徵

事務是併發控制的單位,是使用者定義的一個操作序列.這些操作要麼都做,要麼都不做,是一個不可分割的工作單位.例子:轉賬

事務的四大特性:ACID

原子性(Atomicity):表示事務內不可分割,要麼都成功,要麼都失敗

一致性(Consistency):要麼都成功,要麼都失敗.失敗了,要對前面的操作進行回滾

隔離性(Isolation):一個事務開啟了,不能受其它事務的影響

永續性(Durability):持續性,表示事務開始了,就不能終止.事務提交後,將資料序列化到資料庫

25.MYSQL資料庫最大連線數

資料庫預設的最大連線數是100,在實際操作中,我們會去修改這個值:mysql安裝檔案–>my.ini檔案

  # The maximum amount of concurrent sessions the MySQL server will

  # allow. One of these connections will be reserved for a user with

  # SUPER privileges to allow the administrator to login even if the

  # connection limit has been reached.

  max_connections=100

26.MYSQL和ORACLE的分頁語句

為什麼要分頁?很多資料不能完全展示出來,需要進行分段顯示

mysql:是使用關鍵字limit來進行分頁的.LIMIT [offset,] rows:offset指定要返回的第一行的偏移量(也就是從哪個索引開始),rows第二個指定返回行的最大數目。初始行的偏移量是0(不是1)

oracle:一般是使用rownum 加select 巢狀查詢

27.觸發器的使用場景?

觸發器:觸發器需要有觸發條件,當條件滿足後,做什麼操作

應用場景:某些社交軟體的日誌更新,會通知好友; 一些論壇中,當插入新帖時,會更改當前帖子總數以及最後發帖時間.

CREATE [or REPLACE] TRIGGER 觸發器名

BEFORE | AFTER

[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]

ON 表名

[FOR EACH ROW ][WHEN(條件) ]

declare

……

begin

PLSQL 塊

End ;

28.儲存過程的優點 

1. 儲存過程只在建立時進行編譯,以後每次執行它都不會再重新編譯.一般SQL語句每次執行都會編譯.所以儲存過程會大大提高資料庫執行速度 

1. 通常複雜的業務邏輯需要多條SQL語句,這些語句要分別從客戶機發送到伺服器,當客戶機和伺服器之間的操作很多時,會產生大量的網路傳輸.如果將這些操作放在一個儲存過程中,那麼客戶機和伺服器之間的網路傳輸會大大減少,降低網路負載. 

1. 儲存過程是可重複使用的,能減少資料庫開發人員的工作量. 

1. 儲存過程可以遮蔽對底層資料物件的直接訪問,使用EXECUTE許可權呼叫儲存過程,無需擁有訪問底層資料庫物件的顯示許可權,安全性高.

CREATE [ OR REPLACE ] PROCEDURE 儲存過程名稱

(引數名 型別, 引數名 型別, 引數名 型別)

IS|AS

變數宣告部分;

BEGIN

邏輯部分

[EXCEPTION

異常處理部分]

END;

29.JDBC呼叫儲存過程

賈璉欲執事 

載入驅 

獲取連線 

設定引數 

執行 

釋放連線

30.簡單說一下你對JDBC的理解

Java database connection java資料庫連線,資料庫關係系統很多,每個資料庫關係管理系統支援的命令是不一樣的. 

Java只定義介面,讓資料庫廠商自己實現介面,對於我們開發人員而言,只需要匯入對應廠商開發的實現即可,然後以介面的方式進行呼叫(mysql+mysql驅動(實現)+jdbc)

31.寫一個JDBC的訪問ORACLE的列子

public class OracleUtils {

static {

    try {

        Class.forName("oracle.jdbc.driver.OracleDriver");

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    }

}

//獲取連線

public static Connection getConnection() throws SQLException {                                                 

    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@ip:1521:orcl", "username", "password");

    return conn;

}

//關閉資源

public static void close(ResultSet rs, Statement stmt, Connection conn) {

}

}

.....

呼叫

Connection conn = OracleUtils.getConnection();

PreparedStatement stmt = conn.prepareStatement(sql);

ResultSet rs = stmt.executeQuery();

OracleUtils.close(rs, stmt, conn);

32.JDBC中PREPAREDSTATEMENT比STATEMENT的好處

PreparedStatement可以防止sql注入攻擊,它是預編譯的,

33.資料庫連線池的作用

限定資料庫的連線個數,不會由於資料庫連線過多導致系統執行緩慢或崩潰

資料庫連線不需要每次都去建立或銷燬,節約了資源

資料庫連線不需要每次都去建立,響應時間更快.

34.簡單說一下HTML,CSS,JAVASCRIPT在網頁開發中的定位

Html 超文字標記語言,定義網頁的結構 

Css 層疊樣式表,用來美化頁面 

Javascript 主要用來驗證表單,做動態互動(其中ajax)

35.簡單介紹了一下AJAX

什麼是ajax?非同步的javascript和xml 

作用是什麼?通過ajax與伺服器進行資料交換,ajax可以使網頁實現區域性更新.這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新. 

怎麼實現?ajax xmlhttpRrqueset物件,使用這個物件可以異步向伺服器傳送請求,獲取響應,完成區域性更新,open send responseText/responseXml區域性響應. 

使用場景:登陸失敗時不跳轉頁面,註冊時提示使用者名稱是否存在,二級聯動等等.

36.JS和JQUERY的關係

JQuery是一個js框架,封裝了js的屬性和方法,並且增強了js的功能,讓使用者使用起來更加便利,並且增強了js的功能. 

原來是使用js是要處理很多相容性的問題(比如註冊事件等),由JQuery封裝了底層,就不用處理相容性問題. 

原生的js的dom和事件繫結和ajax等操作非常麻煩,JQuery封裝了以後,操作非常方便.

37.JQUERY中的常用選擇器

ID選擇器 

Class選擇器 

標籤選擇器 

通用選擇器 

層次選擇器 

屬性選擇器

38.JQUERY中頁面載入完畢事件

為什麼需要頁面載入事件?很多時候我們需要獲取元素,但是必須等到該元素被載入後才能獲取,我們可以把js程式碼放到該元素的後面,但是這樣就會造成js在我們的body中存在不好管理.所有頁面載入完畢後,所有的元素當然已經載入完畢,一般獲取元素做操作都要在頁面載入完畢後. 

$(function{}表示的是頁面結構被載入完畢 

Window.onload表示的是頁面被載入完畢

39.JQUERY中AJAX和原生JS實現AJAX的關係

JQuery中的ajax也是通過原生的js封裝的,封裝完成後讓我們使用起來更加便利,不用考慮底層實現或相容性等的處理. 

如果採用原生js實現ajax是非常麻煩的,並且每次都是一樣的.如果我們不適用JQuery,我們也要封裝物件的方法和屬性,有像JQuery這些已經封裝完成,經過很多企業實踐過的框架,比較可靠,我們不需要封裝,直接使用成熟的框架(JQuery)即可.

40.BOOTSTRAP的是什麼

Bootstrap是一個移動裝置優先的UI框架.我們不用寫任何的css和js程式碼就能實現比較漂亮的有互動性的頁面.我們程式設計師對頁面的編寫是有硬傷的,所以要自己寫頁面的話,就要使用類似bootstrap這樣的UI框架. 

平時經常用的: 

模態框 

表單,表單項 

佈局 

柵格系統

41.什麼是框架

框架(Framework)是一個框子—–具有約束性,也是一個架子—-具有支撐性. 

IT語境中的框架,特支為解決一個開放性問題而設計的具有一定約束性的支撐架構.在此結構上可以根據具體問題擴充套件.安插更多的組成部分.從而更迅速和更方便的構建完整的解決問題的方案.

框架本身一般不完整到可以解決特定問題,但是可以幫助我們快速解決特定問題

框架天生就是為了擴充套件而設計的

框架裡面可以為後續擴充套件的元件提供很多輔助性,支撐性的方便易用的使用工具.也就是說框架時常配套; 一些幫助解決某類問題的庫或工具.

42.簡單介紹一下MVC模式

MVC全名是model view Controller,是模型(model)—檢視(view)—控制器(Controller)的縮寫,是一種軟體設計典範. 

最簡單的,最經典的就是jsp(view)+servlet(Controller)+javabean(model) 

1.當控制器收到來自使用者的請求 

2.控制器呼叫javabean完成業務 

3.完成業務後通過控制器跳轉jsp頁面的方式給使用者反饋資訊 

4.Jsp給使用者做出響應

43.簡單說一下對MVC框架的理解

是為了解決傳統的MVC模式(jsp+servlet+javabean)問題而出現的框架.

傳統MVC模式問題 

1.所有的servlet和servlet對映都要配置在web.xml中,如果專案太大,web.xml就太龐大,並且不能實現模組化管理. 

2.Servlet的主要功能就是接受引數,呼叫邏輯,跳轉頁面,比如像其他字元編碼,檔案上傳等功能也要寫在servlet中,不能讓servlet功能單一. 

3.接受引數比較麻煩,不能通過model接收,只能單個接收,接收完成後轉換封裝進model. 

4.跳轉頁面方式比較單一(forward,redirect),並且當頁面名稱發生變化時,需要修改servlet原始碼.

常用的MVC框架:struts2,springMVC

44.STRUTS2的執行流程或者STRUTS2的原理

1.瀏覽器傳送請求,經過一系列的過filter,到達strutsPrepareAndExecuteFilter 

2.strutsPrepareAndExecuteFilter通過ActionMapper判斷當前的請求是否需要某個Action處理,如果不需要,則走原來的流程.如果需要,把請求交個ActionProxy來處理 

3.ActionProxy通過Configuration Manager 詢問框架的配置檔案struts.xml,找到需要呼叫的Action類; 

4.建立一個ActionInvocation例項,來呼叫Action的對應方法來獲取結果集的name,在呼叫前後會執行相關攔截器 

5/通過結果集的name找到對應的結果集來對瀏覽器進行響應

45.STRUTS2的攔截器是什麼

通過動態配置方式,可以在執行Action的方法前後,加入相關邏輯,完成業務 .struts2中的功能, 都是通過系統攔截器實現的.比如:引數處理,檔案上傳,字元編碼.當然,我們也可以自定義攔截器 

使用場景:使用者登陸判斷,在執行Action的前面判斷是否已經登陸,如果沒有登陸則跳轉到登陸頁面;使用者許可權的判斷,在執行Action的前面判斷是否具有許可權,如果沒有給出提示資訊;

46.SPRING MVC的執行流程

1.使用者傳送請求,被前端控制器(DispatcherServlet)捕獲(捕獲請求) 

2.前端控制器進行解析,得到URI,通過URI呼叫HandlerMapping並獲得該Handler配置的所有相關物件(查詢Handler) 

3.前端控制器根據得到的Handler,選擇合適的HandlerAdapter,提取Request中的模型資料,填入Handler入參,開始執行Handler,最後返回一個ModelAndView物件.(執行Handler) 

4.前端控制器根據返回的ModelAndViewm,選擇合適的ViewResolver(選擇ViewResolver) 

5.通過ViewResolver結合Model和View來渲染檢視,前端控制器將渲染結果返回給客戶端(渲染並返回)

47.SPRINGMVC和STRUTS2的不同

核心控制器不同:springmvc是servlet,struts2是filter

控制器例項:springmvc會比struts快(理論上),springmvc是基於方法設計,struts是基於物件,每發一次請求都會例項一個action.springmvc只有一個例項,每次請求執行對應的方法即可,簡單來說,springmvc是單例,是trust是多例

管理方式:springmvc是spring的一個模組,所以spring對於springmvc的控制管理更加簡單方便.而struts需要使用xml配置很多引數來管理

引數傳遞:struts2中自身提供多種引數接收,其實都是通過valuestack進行傳遞和賦值.而springmvc是通過方法引數進行接收.

interceptor的實現機制:struts有自己的interceptor機制,springmvc用的是獨立的aop方式.

Springmvc處理ajax請求,直接返回資料,方法中使用註解@ResponseBody,springmvc自動幫我們將資料轉成json資料,而struts2是通過外掛的方式進行處理

48.簡單介紹一下SPRING或者SPRING的兩大核心

Spring是什麼?spring是j2ee應用程式框架,是輕量級的IOC和AOP的容器框架,主要針對javabean的生命週期進行管理的輕量級容器,可以單獨使用,也可以跟其它框架組合使用.

IOC(inversion of control)或DI(dependency injection)控制反轉 

原來:我的service要呼叫Dao,我就在service中建立Dao物件,這時Dao物件的建立的控制權在我手中 

Spring:spring發現我的service依賴於Dao,就給我的service注入Dao物件,這時Dao物件建立的控制權在spring手中 

核心原理:工廠模式+反射+配置檔案

AOP:面向切面程式設計 

核心原理:使用動態代理的方式在執行前後或出現異常後做相關邏輯. 

我們主要使用AOP來做: 

事務處理 

許可權判斷 

日誌記錄

49.AOP是什麼?都用它做什麼?

AOP:面向切面程式設計 

核心原理:使用動態代理的方式在執行前後或出現異常後做加入相關邏輯. 

我們主要使用AOP來做: 

事務處理 執行方法前,開啟事務,執行方法後提交事務,出現異常後回滾事務 

許可權判斷 在執行方法前,判斷是否具有許可權 

日誌記錄 在執行方法前執行日誌

50.SPRING事務的傳播特性和隔離級別

事務的傳播特性:多個事務存在是怎麼處理的策略.

傳播行為意義

PROPAGATION_MANDATORY表示該方法必須執行在一個事務中。如果當前沒有事務正在發生,將丟擲一個異常

PROPAGATION_NESTED表示如果當前正有一個事務在進行中,則該方法應當執行在一個巢狀式事務中。被巢狀的事務可以獨立於封裝事務進行提交或回滾。如果封裝事務不存在,行為就像PROPAGATION_REQUIRES一樣。

PROPAGATION_NEVER表示當前的方法不應該在一個事務中執行。如果一個事務正在進行,則會丟擲一個異常。

PROPAGATION_NOT_SUPPORTED表示該方法不應該在一個事務中執行。如果一個現有事務正在進行中,它將在該方法的執行期間被掛起。

PROPAGATION_SUPPORTS表示當前方法不需要事務性上下文,但是如果有一個事務已經在執行的話,它也可以在這個事務裡執行。

PROPAGATION_REQUIRES_NEW表示當前方法必須在它自己的事務裡執行。一個新的事務將被啟動,而且如果有一個現有事務在執行的話,則將在這個方法執行期間被掛起。

PROPAGATION_REQUIRES表示當前方法必須在一個事務中執行。如果一個現有事務正在進行中,該方法將在那個事務中執行,否則就要開始一個新事務。

隔離級別含義

ISOLATION_DEFAULT使用後端資料庫預設的隔離級別。

ISOLATION_READ_UNCOMMITTED允許讀取尚未提交的更改。可能導致髒讀、幻影讀或不可重複讀。

ISOLATION_READ_COMMITTED允許從已經提交的併發事務讀取。可防止髒讀,但幻影讀和不可重複讀仍可能會發生。

ISOLATION_REPEATABLE_READ對相同欄位的多次讀取的結果是一致的,除非資料被當前事務本身改變。可防止髒讀和不可重複讀,但幻影讀仍可能發生。

ISOLATION_SERIALIZABLE完全服從ACID的隔離級別,確保不發生髒讀、不可重複讀和幻影讀。這在所有隔離級別中也是最慢的,因為它通常是通過完全鎖定當前事務所涉及的資料表來完成的。

51.ORM是什麼?ORM框架是什麼?

物件關係對映(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單來說,將程式中的兌現自動持久化到關係資料庫中。那麼,到底如何實現持久化呢?一種簡單的反感是採用硬編碼的方式(jdbc操作sql方式),為每一種可能的資料庫訪問操作提供單獨的方法。這種方法存在很多缺陷,所以使用ORM框架(為了解決面型物件與關係資料庫存在的互不匹配的現象的框架)來解決。

Java典型的ORM框架有:Hibernate,mybatits

52.MYBATIS和HIBERNATE有什麼不同

相同:都是java中的orm框架,遮蔽jdbc的api底層訪問細節,使我們不用域jdbc的挨批打交道,就可以完成對資料的持久化操作.jdbc的api程式設計流程固定,還將sql與java程式碼混在在一起,經常需要拼湊sql語句,細節繁瑣,開發不方便. 

Mybatis的好處:遮蔽jdbc api的底層訪問細節,將sql語句域java程式碼分離,提供將結果集自動封裝為實體物件和物件的集合的功能,queryForList返回物件集合.用queryForObject返回單個物件.提供自動將實體物件的屬性傳遞給sql語句的引數 

Hibernate的好處:hibernate是一個全自動的偶人嗎對映工具,它可以自動生成sql語句,執行並返回java結果.

不同點: 

1. hibernate要比mybatis功能強大很多,因為hibernate自動生成sql語句. 

2. Mybatis需要我們自己在xml配置檔案中寫sql語句,hibernate我們無法直接控制該語句,我們就無法去寫特定的高效的sql,對於一些不太複雜的sql查詢,hibernate可以很好幫我們完成.但是,對於特別複雜的查詢,hibernate就很難適應了,這時候用mybatis就是不錯的選擇,因為mybatis還是由我們自己寫sql語句.mybatis可以處理複雜語句,而hibernate不能. 

3. Mybatis要比hibernate簡單的多,mybatis是面向sql的,不用考慮物件間一些複雜的對映關係.

53.HIBERNATE物件狀態及其轉換

瞬時態:剛new的,沒有持久化,不在session中 

持久態:session中的持久化物件 

脫管態:不在session中的持久化物件

54.HIBERNATE的快取

快取:為了提高訪問速度,把磁碟或資料庫訪問變成記憶體訪問. 

一級快取(session快取):session快取內建不能被解除安裝session:是事務範圍的快取(session物件的生命週期通常對應一個數據庫事務或者一個應用事務).一級快取中,持久化類的每個例項都具有唯一的oid 

二級快取(SessionFactory快取):由於SessionFactory物件的生命週期和一個用程式的整個過程對應,因此hibernate二級快取是進城範圍或者叢集範圍的快取,有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略為被快取的資料提供了事務隔離級別.二級快取是可選的,是一個可配置的外掛,預設下SessionFactory不會啟用這個外掛.

概括:hibernate中的快取分一級快取和二級快取 

一級快取就是session級別的快取, 在事務範圍內是有效的,是內建的不能被解除安裝.二級快取是SessionFactory級別的快取,從應用啟動到應用結束有效,是可選的,預設沒有二級快取,需要手動開啟

儲存資料庫後,在記憶體中儲存一份,如果更新了資料庫就要同步更新快取 

什麼樣的資料適合放到快取中(訪問頻率,讀寫比例,資料一致性): 

很少被修改的資料 

經常被查詢的資料 

不是很重要的資料,允許出現偶爾併發的資料 

不會被併發訪問的資料 

常量資料

Hibernate的二級快取預設是不支援分散式快取的,使用memcache,redis等重要快取來代替二級快取

55.WEBSERVICE的使用場景

Webservice是一個SOA(面向服務的程式設計)的架構,它是不依賴於語言,不依賴於平臺,可以實現不同的語言間的相互呼叫,通過Internet進行基於http協議的網路應用間的互動.

異構系統(語言)的整合

不同客戶端的整合,瀏覽器 手機端 pc端等終端的訪問

例子: 

天氣預報:可以通過實現webservice客戶端呼叫遠端天氣服務實現的. 

單點登入:一個伺服器實現所有系統的登陸

56.ACTIVITI的簡單介紹

Activiti是一個業務流程管理(BPM)和工作流系統,適用於開發人員和系統管理人員,其核心是超快速,穩定的BPMN2流程引擎,它易與spring整合使用.

主要用在OA中,把線下流程放到線上,把現實生活中的一些流程固話定義到系統中,然後通過輸入表單資料完成業務.

57.LINUX的使用場景

Linux是一個長時間執行比較穩定的作業系統,所以我們一般會拿它作為伺服器(web,db.app等). 

Linux本身具有c的編譯環境.我們的一些軟體是沒有軟體包的(redis,nginx),需要在linux編譯得到軟體包

58.LINUX常用命令

Cd跳轉到目錄 

Pwd 獲取當前路徑 

Su 切換使用者 

Ll 檢視當前目錄下檔案和目錄 

Tail 檢視檔案 

Rm –rf 刪除檔案 

Vi 修改檔案 

Mv 移動/重新命名 檔案或資料夾 

Mkdir 建立資料夾 

Rm –f 刪除資料夾 

Tar 打包/解壓 

Grep 查詢想要的資訊

59.怎麼操作LINUX伺服器

需要依賴於linux伺服器安裝ssh服務端,一般這個ssh服務的埠為22, 

需要依賴於linux伺服器安裝sftp服務端,一般這個sftp服務的埠為25,

使用ssh客戶端連線linux伺服器,通過命令操作linux伺服器 

使用sftp客戶端來連線sftp服務端,來上傳和下載檔案(安裝包,修改檔案上傳)

60.有沒有使用過雲主機

使用過阿里雲 

雲主機:就是一些雲服務運營商(阿里,華為,新浪等)提供的遠端伺服器功能,我們公司只要付費就可以租用對應的伺服器.

61.資料庫優化方面的事情

定位:查詢,定位慢查詢,並優化 

優化 

1.建立索引:建立合適的索引,我們就可以在索引中查詢,查詢到以後直接找對應的額記錄 

2,分表:當一張表的資料比較多或者一張表的某些欄位的值比較多並且很少使用時,採用水平分表或垂直分表來優化,比如spu表 

3,讀寫分離:當一臺伺服器不能滿足需要時,採用將讀寫分離的方式進行叢集 

4.快取:使用redis來進行快取

62.如果查詢和定位慢查詢

在專案自驗或專案轉測之前,在啟動mysql資料庫時開啟慢查詢,並且把執行慢的語句寫到日誌中,在執行一定的時間後,通過檢視日誌,找到對應的慢查詢資訊.

使用EXPLAIN +慢查詢語句,,來詳細分析語句的問題.

63.資料庫優化之資料庫表設計遵循正規化

三正規化:首先符合1nf,才能滿足2nf,進一步滿足3nf 

反三正規化:沒有冗餘的資料庫未必是最好的資料庫,有事為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料.具體做法是,在概念資料模型設計時遵守三正規化,降低方式標準的工作放到物理資料模型設計時考慮,降低正規化就是增加欄位,允許冗餘.訂單和訂單項,相簿瀏覽次數和照片的瀏覽次數.

64.選擇合適的資料庫引擎

Myisam儲存引擎:如果表對事物要求不高,同時是以查詢和新增為主的,我們考慮使用myisam儲存引擎,比如論壇中的發帖表,回覆表

Innodb儲存引擎:對事物要求高,儲存的資料都是重要資料.我們建議使用innodb,比如訂單表,賬號表

Myisam和innodb的區別: 

1. 事務安全,myisam不支援使用,而innodb支援 

2. 查詢和新增速度,myisam不用支援事務就不用考慮同步鎖,查詢和新增的速度快 

3. 支援全文索引,myisam支援,innodb不支援 

4. 鎖機制:myisam支援表鎖,innodb支援行鎖 

5. 外來鍵:myisam不支援外來鍵,innodb支援外來鍵

65.選擇合適的索引

索引是幫助DBMS高效獲取資料的資料結構. 

分類:普通索引,唯一索引,主鍵索引,全文索引 

1.普通索引:允許重複的值出現 

2.唯一索引:除了不能有重複的記錄外,其它和普通索引一樣.(使用者名稱;使用者身份證;手機號) 

3.主鍵索引:是隨著設定主鍵而建立的;也就是把某個列設為主鍵的時候,資料庫就會給該列建立索引;唯一且沒有null值 

4.全文索引:用來對錶中文字域(char,varchar,text)進行索引,全文索引針對myisam

66.使用索引的一些技巧

索引弊端: 

1. 佔用磁碟空間. 

2. 對dml(插入,修改.刪除)操作有影響,變慢 

使用場景: 

1. 肯定在where條件經常使用,如果不做查詢就沒有意義 

2. 該欄位的內容不是唯一的幾個值(sex). 

3. 欄位內容不是頻繁變化

具體技巧: 

1. 對於建立的多列索引(複合索引),不是使用的第一部分就不會使用索引(最左匹配) 

2. 對於使用like查詢,查詢如果是”%aaa”不會使用到索引,而”aaa%”會使用到索引 

3. 如果條件中有or,有條件沒有使用索引,即使其中有條件帶索引,也不會使用.簡單來說,就是要求使用的所有欄位,都必須單獨使用時才能使用索引. 

4. 如果列型別是字串,拿一定要在條件中將資料使用引號引用起來,否則索引失效 

5. 如果mysql估計使用全表掃描要比索引快,則不適用索引.例子:表裡只有一條記錄

67.資料庫優化之分表

分表分為水平分表(按行)和垂直分表(按列)

水平:在實際操作中,mysql表資料一般達到百萬級別,查詢效率會很低,容易造成表鎖,甚至堆積很多連線,直接掛掉.水平分表能夠很大程度的減少這些壓力.

垂直:如果一張表中某個欄位值非常多(長文字,二進位制等),而且只有在很少的情況下會查詢,比如商品的詳情描述,這時候就可以把欄位單個放到一個表,通過外來鍵與原表關聯起來

水平分表策略: 

1. 按時間分表:這種分表方式有一定的侷限性,當資料有較強的時效性.如微博釋出紀錄,微信訊息紀錄等,這種資料很少會有使用者查詢幾個月前的資料,這時可以按月分表 

2. 按區間範圍分表:一般在有嚴格的自增id需求上,如按照user_id水平分表 

3. Hash分表(用的多):通過一個原始目標的id或者名稱通過一定的hash演算法計算出資料庫儲存表的表名,然後訪問相應的表.

68.資料庫的讀寫分離

一臺資料庫支援的最大併發連線數是有限的,如果使用者併發訪問太多,一臺伺服器滿足不了要求時,可以叢集處理.mysql的叢集處理技術最常用的是讀寫分離,

1.主從同步:資料庫最終會把資料持久化到磁碟,如果叢集必須確保每個資料庫伺服器的資料時一致的.能改變資料庫資料的操作都往主資料庫去寫,而其他的資料庫從主資料庫上同步資料 

2.讀寫分離:使用負載均衡來實現寫的操作都往主資料.而讀的操作都往從資料庫去

69.資料庫優化之快取

在持久層(dao)和資料庫(db)之間新增一個快取層,如果使用者訪問的資料已經快取起來時,在使用者訪問資料時從快取中獲取,不用訪問資料庫,而快取是在操作記憶體,訪問速度快

作用:減少資料庫伺服器壓力,減少訪問時間

Java中常用的快取: 

1. hibernate的二級快取,這種快取不支援分散式快取 

2. 可以使用redis來作為中央快取,對快取的資料進行集中處理

70.SQL語句優化小技巧

DDL優化: 

1. 通過禁用索引來提供匯入資料效能,這個操作主要針對有資料的表追加資料 

2. 關閉唯一校驗 

3. 修改事務提交方式(匯入)(變多次提交為一次)

DML優化: 把多條插入的語句合併為一條(變多次提交為一次)

DQL優化:

Order by 優化 

多用索引排序

普通結果排序(非索引排序)

Group by 優化:如果對排序的結果沒有排序的需求,可以考慮在其後面加上order by nul

子查詢優化

Or優化: 

1.or兩邊都是用索引欄位做判讀,效能好 

2.or兩邊,有一邊不用,效能差 

3.如果name=”a” or name=”b”,這種方式,索引失效

Limit優化

71.批量插入幾百萬條資料

可以使用儲存過程

72.有沒有使用過REDIS

Redis是一個key-value的nosql資料庫,先存到記憶體中,會根據一定的策略持久化到磁碟,即使斷電也不會丟失資料,支援的資料型別比較多.

主要用來做快取資料庫的資料和web叢集時當做中央快取存放session

73.REDIS的使用場景

快取:把經常需要查詢很少修改的資料放到讀速度很快的空間(記憶體),以便減少下次訪問時間,減輕db壓力,

計數器:redis中的計數器是原子性的記憶體操作,可以解決庫存溢位問題,進銷存,系統存溢位

Session快取伺服器:web叢集時作為session的快取伺服器

74.REDIS儲存物件的方式

Json字串:需要把物件轉換成json字串,當做字串處理,直接使用set和get來設定或獲取/ 

優點:設定和獲取比較簡單 

缺點:沒有提供專門的方法,需要把物件轉換成json

位元組:需要做序列號,就是把物件序列化為位元組儲存.

如果是擔心json轉物件會消耗資源的情況,這個問題需要考量幾個地方, 

1. 使用的json轉換lib是否就會存在效能問題 

2. 資料的資料量級別,如果是儲存百萬級的大資料物件,建議採用儲存序列化物件方式.如果是少量的資料級物件,或者是資料物件欄位不多,還是建議採用json轉換成string方式.畢竟redis對儲存字元型別這部分優化的非常好.具體採用的方式與方法,還要看你所使用的場景

75.REDIS資料淘汰機制

在 redis 中,允許使用者設定最大使用記憶體大小 server.maxmemory,在記憶體限定的情況下是很有用的。譬如,在一臺 8G 機子上部署了 4 個 redis 服務點,每一個服務點分配 1.5G 的記憶體大小,減少記憶體緊張的情況,由此獲取更為穩健的服務。

記憶體大小有限,需要儲存有效的資料? 

Redis記憶體資料集大小上升到一定大小的時候,就會施行平臺策略.資料淘汰策略.redis提供6中資料淘汰策略: 

1.volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰 

2.volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰 

3.volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰 

4.allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰 

5.allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰 

6.no-enviction(驅逐):禁止驅逐資料 

76.JAVA訪問REDIS級REDIS叢集

Java訪問redis: 

1. 使用jedisjava客戶端來訪問redis伺服器,優點類似jdbc訪問db一樣 

2. 如果是spring進行整合時,可以使用springDataRedis來訪問redis , springDataRedis 只是對jedis的二次封裝

Redis叢集:當一臺資料無法滿足要求,可以使用redis叢集來出來,類似mysql的讀寫分離

77.專案的併發

1.需求:使用者量,這個客戶說了算,大概也就是1-5年內使用者總量 

2.根據pv(頁面點選量,瀏覽量)和uv(ip數量)預估,大致能達到多大的併發量.我們的專案大概能達到1000-3000的併發量 

3.確定我們的伺服器數量,我們使用的是tomcat,tomcat的預設執行緒數150,我們可以將它優化調到400左右.而我們大致需要5臺web伺服器 

4.重要的因素(硬體伺服器水平—去IOE),我們沒有做這個,因為我們沒錢.

78.http協議

1.無狀態,為了解決http無狀態問題,引入cookie技術 

2.http1.0是短連線,http1.1是長連線 

3.http協議是基於B/S請求-應答模式

79.cookie和session

1.Cookie是由伺服器建立的,通過response物件的addCookie(Cookie cookie)方法寫回客戶端,儲存在客戶端的會話技術.key-value的結構 

2.session是基於cookie,session的建立是由伺服器做,可以通過request.getSession()獲取(要從你的請求中找一個cookie—Jessionid,如果能找到這個cookie,他會拿著這個cookie的值去跟伺服器端的session的id比較,如果找到相應的session,就不建立session.如果找不到相應的session,會建立session).session一旦建立就會有一個id屬性(唯一的),通過response以cookie的方式寫回客戶端(這個cookie就叫做就sessionid).

會話:會話就是簡單的理解成開啟瀏覽器(包含了一次請求或多次請求).

80.session共享的方案

1.廣播:會造成內網網路風暴,大量佔用內網寬頻 

2.IP_hash:在nginx中配置和,相同的ip找固定的同一臺伺服器,這種方案會造成服務能力差 

3.使用第三方中介軟體(資料庫,redis),我們是使用redis

81.solr相似度匹配原理(多關鍵字搜尋)

solr將使用者輸入的內容使用分詞器分詞,然後將這些新詞做成向量. 

比如,使用者輸入:我是蘿莉控 

solr分詞記過:我 , 蘿莉 , 蘿莉控 

向量:向量a–我 ,向量b–蘿莉, 向量c–蘿莉控 

接下來,solr會將索引庫中所有包含這些關鍵字的記錄數做成n維向量.這個時候,solr會根據n維向量夾角的餘弦值的大小來判斷相似度的大小.餘弦值越低,相似度越大,排名越靠前.反之,餘弦值越大,相似度越小,排名越靠後.

題外話:lucene的資料模型其實是n維向量.

82.高併發問題:索引庫同步

1.硬編碼:在相應的程式碼中增加索引庫同步的程式碼。不過,這種方法耦合度太高,將原本不相關的系統耦合在了一起,容易造成不可預估的錯誤,是電商專案的大忌。 

2.spring的aop:編寫一個索引庫同步的方法,利用aop的形式,將它和資料庫資料更新的方法聯絡起來。這種方式也會造成耦合。 

3.訊息佇列:不過,這個方法會造成一個問題,那就是訊息消費失敗問題。

:解決兩個系統間的通訊問題。 

訊息消費失敗:集中同步索引庫,做一個定時任務。在訊息佇列所在的伺服器上加一個數據庫,我們使用的是redis快取。訊息佇列中每發一條資訊,就將這條資訊持久化進redis中。接著定時(我們是在晚上,使用者量少的時候)從redis中將訊息列表取出來,批量同步索引庫。

83.頁面靜態化問題

當商品規格出現不同組合時,它的價格勢必會不一樣,這時怎麼在靜態頁面中處理價格這樣的資料? 

像價格這樣的資料,只有我們在生成靜態頁面時才會和資料庫互動一次,查出所有的sku,將這些sku存進集合中。接著,我們在前端js中定義一個變數來儲存集合的值,當以後使用者每一次來訪問我們的靜態頁面時,他都是從靜態頁面的js變數中自動獲取價格這樣的資料。

84.與app端對接時需要注意什麼

和app端對接,需要知道對方需要什麼樣的資料,以及介面的請求方式,返回值型別等 

85.為什麼服務層之間呼叫的activeMq會是在controller層發訊息?

因為事務!如果是在controller層傳送訊息,那麼controller層呼叫的service一定是完成了事務提交操作的。如果是在service層傳送訊息,那麼事務可能會沒有提交,會造成空指標異常。

86.索引庫同步時為什麼使用activemq的queue方式?(使用queue的好處)

1.不需要考慮訊息沒有被消費問題 

2.queue方式,自帶持久化機制 

3.業務更加單一,相對來說比較安全

87.訊息佇列問題:同步索引庫時,傳輸的內容為什麼是商品資訊,而不適用商品id?

傳送商品id: 

好處:傳送的是商品id,傳輸的內容少,效率相對較高,不會產生訊息阻塞。 

缺點:消費方需要再次查詢資料庫取出商品資訊,和資料庫多了一次互動。 

傳送商品資訊: 

好處:這樣消費者就不需要再次從資料庫中查詢商品資訊資料,減少了與資料庫的互動。 

缺點:傳輸的是商品資訊,傳輸內容相對較少(原因:文字資訊在網路傳輸中佔用的網路資源最少),可能會產生訊息阻塞的問題,但是由於我們的訊息的傳送不是連續的,不會有太高的併發量(原因:訊息的傳送時需要運營商平臺稽核通過後才傳送的。)

88.秒殺

秒殺業務最主要的操作:減庫存和新增訂單 

1.第一種方式:資料庫(中小型網站) 

Update goods set num=num-1 where id=id; 

Insert orders values() where goods.id=goodsid

為了保持資料的一致性,需要使用事務

優化: 

①資料庫伺服器和秒殺伺服器在同一個機房 

②避免使用事務,使用資料庫的儲存過程來完成業務單元 

儲存過程邏輯:避免使用事務 

(1)判斷庫存(num) 

(2)如果num>0,執行update和insert操作 

(3)如果num<0,秒殺結束

2.第二種方式:快取(redis)(中大型網站) 

將秒殺商品和訂單都存在redis中,使用者下單時,num>0?下單(num-1):秒殺結束;

89.HashMap中連結串列長度大於8時,會怎麼樣(優化hashMap)

HashMap在JDK1.8及以後的版本中引入了紅黑樹結構,若桶中連結串列元素個數大於等於8時,連結串列轉換成樹結構;若桶中連結串列元素個數小於等於6時,樹結構還原成連結串列。因為紅黑樹的平均查詢長度是log(n),長度為8的時候,平均查詢長度為3,如果繼續使用連結串列,平均查詢長度為8/2=4,這才有轉換為樹的必要。連結串列長度如果是小於等於6,6/2=3,雖然速度也很快的,但是轉化為樹結構和生成樹的時間並不會太短。 

還有選擇6和8,中間有個差值7可以有效防止連結串列和樹頻繁轉換。假設一下,如果設計成連結串列個數超過8則連結串列轉換成樹結構,連結串列個數小於8則樹結構轉換成連結串列,如果一個HashMap不停的插入、刪除元素,連結串列個數在8左右徘徊,就會頻繁的發生樹轉連結串列、連結串列轉樹,效率會很低

90.JSP中動態INCLUDE與靜態INCLUDE的區別

動態INCLUDE用jsp:include動作實現 它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數。靜態INCLUDE用include偽碼實現,並不會檢查所含檔案的變化,適用於包含靜態頁面

91.1000個人來買100件商品

快取架構(KyotoCabinet、Memcached等)的先進先出佇列, 

不能隨便加鎖,淘寶的雙11活動。很明顯的一點是商品沒有提供一個非常即時的鎖,即便商品實際沒有了也是可以下單成功的。但是在支付的時候會提示你商品沒有了。猜測只是在支付的時候才有即時的鎖。

92 你們做移動端沒有,如果沒有移動端,你們為什麼做單點登入?

單點登入並不是為移動端準備的,移動端有自己的登入方式。單點登入是解決在同一個公司 

內部多個互信網站之間進行跳轉時不需要多次登入,多個系統統一登入入口。

93.單點登入的核心是什麼?

單點登入的核心是如何在多個系統之間共享身份資訊

94.solr 的索引查詢為什麼比資料庫要快。

Solr 使用的是 Lucene API 實現的全文檢索。全文檢索本質上是查詢的索引。而資料庫中並 

不是所有的欄位都建立的索引,更何況如果使用 like 查詢時很大的可能是不使用索引,所以 

使用 solr 查詢時要比查資料庫快。

95.solr 索引庫個別資料索引丟失怎麼辦。

首先 Solr 是不會丟失個別資料的。如果索引庫中缺少資料,那就向索引庫中新增

96.IO和NIO

IONIO

面向流面向緩衝

阻塞IO非阻塞IO

無選擇器

97.https和http

HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。 

HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 

HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

區別: 

1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。 

2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。 

3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。 

4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

98.序列化

序列化一般是指把結構化的物件變成無結構的位元組流,便於儲存、傳輸

首先序列化並不是JAVA所獨有的,基本所有程式語言都提供了序列化的方式,序列化是程式設計的一種解決問題的方式。JAVA序列化就是將物件按照某種協議格式(某種約定方式)放入一個buffer中,其目的是便於網路傳輸或持久儲存。反序列化,就是將序列化後的buffer按照序列化時還原成原來的物件,這樣程式就能直接使用還原的物件了。

99.安全性問題(別的網站使用爬蟲技術爬你的網站怎麼辦?有沒有安全措施)

單位時間內請求次數超過某個閾值就讓輸入驗證碼,可以極大降低抓取的速度,如果多次超 

過某個閥值可以加入黑名單。還有就是頁面內容使用 json 返回,資料經常變一變格式,或 

者 js 動態生成頁面內容

100.訂單表的資料量太大, 我把訂單分到許多表中, 那麼我我想用一條 sql 查處所有的訂單, 怎麼 

解決?

分庫情況下:可以使用 mycat 資料庫中介軟體實現多個表的統一管理。雖然物理上是把一個表 

中的資料儲存到多個數據庫中,但是邏輯上還是一個表,使用一條 sql 語句就可以把資料全 

部查詢出來。 

單庫情況下:需要動態生成 sql 語句。先查詢訂單相關的表,然後將查詢多個表的 sql 語句 

使用 union 連線即可

101.TCP和UDP的區別

1.tcp面向連線(如打電話要先撥號連線);udp是無連線的,即傳送資料之前不需要連線 

2.tcp提供可靠的服務。也就是說通過tcp傳送的資料,無差錯,無丟失,不重複,且按序到達;udp盡最大努力交付,不保證交付是否成功 

3.tcp面下位元組流,實際上tcp把資料看成是一連串無結構的位元組流;udp是面向報文的,udp沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,比如視訊會議) 

4.每一條tcp連線只能是點到點的;udp支援一對一,一對多,多對一,多對多的互動通訊 

5.tcp首部開銷20位元組;udp首部開銷小,只有8位元組 

6.tcp通訊通道是全雙工的可靠通道;udp則是不可靠

102.tcp三次握手和四次揮手

1.三次握手 

2.四次揮手 

相關推薦

Java開發工程師試題總結

1.JAVA的垮平臺原理 JVM也是一個軟體,不同的平臺有不同的版本。我們編寫的Java原始碼,編譯後會生成一種 .class 檔案,稱為位元組碼檔案。Java虛擬機器就是負責將位元組碼檔案翻譯成特定平臺下的機器碼然後執行。也就是說,只要在不同平臺上安裝對應的JVM,就可以

2015網易校招Java開發工程師(技術架構)線上筆試題(20159月20日 18:00—20:00)

1、  程式和程序的本質區別是? A、在外存和記憶體儲存 B、非順序和順序執行機器指令 C、獨佔使用和分時使用計算機資源 D、靜態和動態特徵 參考答案分析: 程序與應用程式的區別: 程序(Process)是最初定義在Unix等多使用者、多工作業系統環境下用於表示應用程式在記

位大資料開發工程師的兩工作經驗總結

一位大資料開發工程師的兩年工作經驗總結 工程師人生 • 2018-07-02 16:41 • 9207次閱讀 今年廣州的六月,在經歷了大雨的洗禮之後,一切都變得更加明朗起來,新的工作,新的人和事。懶惰讓我變得更焦慮,焦慮促使我進步,程式設計師的焦慮大家應該都有共同的感覺,時代的步伐太快了

淺談大數據開發工程師的兩工作經驗總結

引擎 建模 nod 兩種 進行 希望 時代 nodejs ××× 今年廣州的4月,在經歷了大雨的洗禮之後,一切都變得更加明朗起來,新的工作,新的人和事。懶惰讓我變得更焦慮,焦慮促使我進步,程序員的焦慮大家應該都有共同的感覺,時代的步伐太快了,在這個環境下的軟件開發一定會淘汰

2018總結(略談一下Java開發工程師校招)

  今天趁著入職的第一天時間,沒有分配到事情,靜下心好好的把這幾個月來的感受和經驗記錄下來;我登入部落格翻看了一下我上一次寫總結的時候,是9月底,轉眼就是好幾個月過去了,人越長大就發現時間過得越快,抓都抓不住啊;記錄一下自己的經歷,等自己年紀大了,翻開看看也算是一種紀念吧. &nb

Java開發工程師試題1

時間2019-1-2 地點上海 package service; import java.text.SimpleDateFormat; import java.util.Date; public class test1 { public static void main(String[]

份高質量的JAVA高階開發試題總結

一般面試官都是按照自己的簡歷面試的,下面的面試題當然也是依據我自己的簡歷的一些問題總結,我是對一些架構知識比較感興趣,所以簡歷比較突出架構方面的。 別看人家問的問題很簡單,但是你不能簡單的回答的,依據自己的能力,能回答多深就多大多深。 然後就是看和麵試官的緣分

java開發工程師職位面試中遇到的一些試題

1.mysql 日期(天) group by 2.servlet生命週期3.各種方式定義的string的==和equals4.js string 定義新方法5.public private protected default區別6.多執行緒場景,及解決辦法7.談談你對資料庫事

3Java後端開發試題總結

3年Java開發經驗面試題總結 畢業轉行做開發3年以來, 學到了很多, 加上自己的興趣愛好, 個人認為已經成為了一個合格的程式設計師. 與剛開始找工作面試相同的是都會問一些相同的問題, 不同的是現在面試官會更注重為什麼, 也就是說注重深度而非廣度. 3年,

2017 廈門初級Java開發工程師試題集錦

Java基礎 基本資料型別有哪些 包裝類有哪些 基本資料型別 包裝類 大小 範圍 預設值 byte Byte 8 -128 ~ 127 0 boolean Boolean 1 True/false False s

Java開發工程師最新試題庫系列——Java基礎部分(附答案)

##### JAVA基礎 1. 面向物件有哪些特徵? 答:繼承、封裝、多型 2. JDK與JRE的區別是什麼? 答:JDK是java開發時所需環境,它包含了Java開發時需要用到的API,JRE是Java的執行時環境,JDK包含了JRE,他們是包含關係 3. Java有哪幾種基本資料型別

Java開發工程師最新試題庫系列——集合部分(附答案)

##### 集合 ## 如果你有更好的想法請在評論區留下您的答案,一起交流討論 1. 說說常見的集合有哪些? 答:主要分List、Set、Map、Queue四類,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap 2. Comparable和Com

Java開發工程師最新試題庫系列——Mybatis框架部分(附答案)

##### Mybatis 1. Mybatis是什麼框架? 答:持久層框架 2. Mybatis和ORM有什麼區別? 答:ORM是物件關係對映的一種設計理念,也就是物件屬性對應資料庫欄位,讓開發人員以操作物件的方式操作資料庫資料。Mybatis是基於ORM框架實現的持久層框架,但它並是不

入我新美大的Java後臺開發試題總結

情況 查詢優化 做什麽 工作 我認 人的 方便 xpl 別人   靜兒最近在總結一些面試題,那是因為做什麽事情都要認真。面試也一樣,靜兒作為新美大金融部門的面試官,負責任的告訴大家,下面的問題回答不上來,面試是過不了的。不過以下絕不是原題,你會發現自己實力不過硬,最終肯定是

Java後臺開發試題總結

情況 swap sql 行數 his 本地方法棧 特性 jndi buffer 1>如何定位線上服務OOM問題  2>JVM的GC ROOTS存在於那些地方 3>mysql innodb怎樣做查詢優化 4>java cas的概念 Java服務OO

Java高級工程師試題總結及參考答案

排序算法 move ner 隔離級別 這一 aid 是我 分析 操作 一、面試題基礎總結 1、 JVM結構原理、GC工作機制詳解 答:具體參照:JVM結構、GC工作機制詳解 ,說到GC,記住兩點:1、GC是負責回收所有無任何引用對象的內存空間。 註意:垃圾回收回收的

Java基礎(試題

Java面試 程序員面試 面試題:數組和集合的區別?1)長度區別: 數組長度固定 集合長度可變2)內容的區別 數組可以存儲同一種類型的元素 集合可以存儲多種類型的元素3)存儲類型的區別 數組:可以存儲基本類型,也可以存儲引用類型 String[] str = {"hello&q

試題:各大公司Java後端開發試題總結 !=!未看

array water 沒有 引用 run 模塊 transacti 速度 相關 ThreadLocal(線程變量副本) Synchronized實現內存共享,ThreadLocal為每個線程維護一個本地變量。 采用空間換時間,它用於線程間的數據隔離,為每一個使用該變量的線

試題總結——走向JAVA高級工程師

sdn activemq gic 優缺點 tis 實現 ibatis 權限級別 自己 近期考慮換工作的問題,於是投簡歷面試,面試5家公司的高級Java工程師,有4家給了我offer,想著總結一下面試經驗,方便最近正在尋求機會的你們 一、無筆試題 不知道是不是職位原因

各大公司Java後端開發試題總結

sta notify 來看 進程間 對比 葉子節點 單元 重寫 java多態 https://blog.csdn.net/sd09044901guic/article/details/80132173ThreadLocal(線程變量副本)