2019Java開發面試常見問題總結(重要....)

最近需要面試Java開發,自己學習丟西瓜撿芝麻,學了的都忘了,所以有機會自己做個總結,摘錄自各個博文以及總結。

 

1、JAVA的跨平臺原理

JVA源碼被編譯會生成字節碼文件,通過不同平臺上下載的不同版本的JVM,將字節碼文件翻譯成對應的機器碼。注意的是,跨平臺的Java程序,不是JVM。JVM是使用C/C++開發的,是編譯後的字節碼,不能跨平臺。

2、JAVA中的數據類型及其各自的特點。

(1)基本數據類型

byte 1字節 數值型
short 2字節 數值型
int 4字節 數值型
long 8字節 數值型
float 4字節 數值型
double 8字節 數值型
boolean 1字節 布爾型
char 2字節 字符型

(2)引用數據類型:類(class)、接口(interface)、數組

3、JAVA面向對象的特徵?

封裝、繼承、多態、抽象                                                                                                                                                                    封裝:通過類來體現,將實體封裝成類,其中包含屬性和方法

繼承:類與類之間可以繼承特點,使得代碼重用

多態:通過傳遞給父類對象引用不同的子類從而表現出不同的行爲

抽象: 將一類實體的共同特性抽象出來,封裝在一個抽象類中。

4、封箱和拆箱?

基礎類型屬於數據,不屬於類,自然也不屬於Object的子類,無法使用相關方法。裝箱就是自動將基本數據類型轉換爲包裝器類型,拆箱就是自動將包裝器類型裝換爲基本數據類型。

eg:Integer a = Integer.valueOf(123);  //裝箱      int b = a.intValue();  //拆箱

5、==和equals的區別?

(1)基本數據類型之間的比較,使用雙等號(==),比較兩者的值

(2)複合數據類型(類)之間的比較,比較的是在內存池的地址,使用equals。在Java語言中,通常equals交給開發者自行定義,滿足什麼條件的Object是equals的。

6、String、StringBuilder、StringBuffer之間的區別?

(1)運行速度:StringBuilder > StringBuffer > String 

        String是字符串常量,其他兩者屬於字符串變量,String對象創建後不可以改變,對String的操作實際上是不斷創建和回收的過程,執行速度慢。

(2)線程安全:StringBuilder是線程不安全的,而StringBuffer是線程安全的

        StringBuffer對象在字符串緩衝區被多個線程使用時,可以使用synchronized關鍵字,能夠保證線程安全。

(3)使用場景

         String適用於少量的字符串操作;StringBuilder適用於單線程下的在字符串緩衝區進行大量的操作的情況下;StringBuffer適用於多線程下的在字符串緩衝區進行大量的操作的情況下。

7、JAVA中的集合

Java中的集合分爲兩大類:

Collection(value):包含list和Set,其中list是有序,可重複的;set是無序,不可重複的。

Map(key-value)包含HashMap、HashTable、CurrentHashNap

8、ArrayList、Vector、LinkedList的區別?

  1. 區別:
  • Vector和ArrayList都是以類似數組的形式存儲在內存中,LinkedList以鏈表的形式進行存儲
  • Vector線程同步,ArrayList和LinkedList線程不同步
  • LinkedList適合在指定位置進行插入、刪除等操作,不適合查找,Vector、ArrayList適合查找
  • Vector默認擴充爲原來的兩倍,ArrayList默認擴充爲原來的1.5倍

9、HashMap和HashTable的區別?

  • 都是使用key-value的形式來存儲數據,區別是HashTable基於Dictionary類,而HshMap是基於AbstractMap。
  • HashMap是單線程安全的,HashTable是多線程安全的
  • HashMap僅僅支持Iterator的遍歷方式,HashTable支持Iterrator和Enumeration兩種遍歷方式
  • HashMap可以允許存在一個爲null的key和若干個爲null的value,但是HashTable中的key和value都不允許爲null

10、實現一個拷貝文件的工具類要使用字節流還是字符流?

應該使用字節流,因爲在文件中可能會包含圖片之類的字節

11、線程的實現方式?怎麼樣啓動線程?怎麼區分線程?

線程的實現方式有三種:第一種是繼承Thread類,第二種是實現Runnable接口,第三種是實現java.util.concurrent下的Callable接口。

線程的啓動:調用start()方法---可以使得線程處於可運行狀態,但是不一定會執行,如果實在main()方法中調用的話,run()會執行

區分線程:給線程設置名字

12、線程併發庫和線程池的作用?

線程池的好處:

  • 限定線程的個數,不會導致由於線程過多導致系統運行緩慢或崩潰
  • 線程池每次都不需要去創建和銷燬,節約了資源
  • 線程池不需要每次都去創建,響應時間更快

13、設計模式和常用的設計模式?

一共有23中設計模式?常用的有單例模式、工廠模式、裝飾者模式、代理模式

  1. 單例模式:
  2. 工廠模式:
  3. 裝飾者模式:
  4. 代理模式:

14、HTTP、GET、POST請求的區別?

  1. GET請求的數據會暴露在地址欄當中,而POST不會
  2. 對於GET,特定的瀏覽器和服務器對於URL有長度限制,傳輸數據時會受到限制
  3. POST的安全性比GET高

15、說說你對Servlet的理解?

就是運行在WEB服務器上的一個Java小程序,用來接收和響應客戶端發送過來的請求,通常使用HTTP協議

使用方法:

  • 編寫一個Java類,實現servlet接口
  • 把開發好的Java類部署到web服務器當中

16、Servlet的生命週期?

當用戶第一次訪問Servlet的時候,服務器會創建一個Servlet的實例,那麼Servlet中的init方法就會執行。任何一次請求都會創建一個線程訪問Servlet中的service方法,根據請求的不同方式調用不同的doXXX()方法。當Servlet從服務器中移除或者關閉服務器,Servlet的實例就會被銷燬,那麼destory()方法就會執行。

17、Servlet中Forward和Redirect的區別

forward重定向:兩次request,重定向可以訪問自己的web應用以外的資源。重定向的過程,傳輸的信息會被丟失。

redirect請求轉發:服務器內部把對一個request/response的處理權交給另外一個客戶端,傳輸的信息不會丟失。

18、JSP和Servlet的相同點和不同點?

1、聯繫: 
JSP 是 Servlet 技術的擴展,本質上是 Servlet 的簡易方式,更強調應用的外表表達。 
JSP編譯後是”類 servlet”。 
2、不同點: 
- Servlet 的應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。Servlet如果要實現html功能,必須使用Writer輸出對應的html. 
- JSP 的情況是Java和HTML可以組合成一個擴展名爲.jsp 的文件。做界面展示比較方便,而嵌入邏輯複雜. 
- JSP 側重於視圖,Servlet 主要用於控制邏輯

19、JSP內置對象和四大作用域

九大內置對象:

request、response、config、application、session、exception、page、out、pagecontext

四大作用域:

page---只能在當前頁面使用 

request---只能在同一次請求當中使用

session---只能在同一個會話(session對象)中使用

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

20、session和cookie的區別和使用場景?

區別:  
1. cookie的數據存儲在客戶端,session的數據存儲在服務器上 
2. cookie不是很安全,別人可以通過分析存放在本地的cookie並進行cookie欺騙,考慮到安全應該使用session 
3. session會在一定時間內保存在服務器上,當訪問增多時,會影響服務器的性能.考慮到服務器性能,應當使用cookie. 
4. 單個cookie保存數據不能超過4k,很多瀏覽器顯示一個站點最多保存20個cookie 
5. 將重要信息保存在session中(登陸),將其他需要保留的信心存放在cookie中(購物車,cookie是可以在客戶端禁用的,這時候要使用cookie+數據庫的方式實現購物車,當cookie中不能取出數據,就從數據庫中取)

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

MVC是Model(模型)---View(視圖)---Controller(控制器)的縮寫

22、數據庫分類和常用數據庫?

關係型數據庫:MySQL、 ORACLE、SQL Server、IBM DB2、Sybase 

非關係型數據庫:Redis,Memcached,MongoDB ,Hadoop

23、關係型數據庫的三範式?

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

第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。列數據的不可分割.
第二範式(2NF)要求數據庫表中的每個實例或行必須可以被唯一地區分。爲實現區分通常需要爲表加上一個列,以存儲各個實例的唯一標識.(主鍵)
第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。(外鍵)
反三範式:有時候爲了效率,可以設置重複或者可推導出的字段.比如:訂單(總價),訂單項(單價)

24、事務的四大特徵

  1. 原子性:表示事務內不可分割
  2. 一致性:表示要麼都成功,要麼都失敗。失敗了,要對前面的操作進行回滾
  3. 隔離性:一個事務開啓了,不能受其他事務的影響
  4. 持久性:表示事務開始了,就不能終止,提交事務後,將數據序列化到數據庫

25、MySQL數據庫的最大連接數

# 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
默認的最大連接數爲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語句每次執行都會編譯.所以存儲過程會大大提高數據庫執行速度 
2. 通常複雜的業務邏輯需要多條SQL語句,這些語句要分別從客戶機發送到服務器,當客戶機和服務器之間的操作很多時,會產生大量的網絡傳輸.如果將這些操作放在一個存儲過程中,那麼客戶機和服務器之間的網絡傳輸會大大減少,降低網絡負載. 
3. 存儲過程是可重複使用的,能減少數據庫開發人員的工作量. 
4. 存儲過程可以屏蔽對底層數據對象的直接訪問,使用EXECUTE權限調用存儲過程,無需擁有訪問底層數據庫對象的顯示權限,安全性高.

29、JDBC調用存儲的過程

加載驅動---獲取連接---設置參數---執行---釋放連接

30、簡單說一下對JDBC的理解

JDBC:Java數據庫連接

Java只定義接口,讓數據庫廠商自己實現接口,對於我們開發人員而言,只需要導入對應廠商開發的實現即可,然後以接口的方式進行調用(mysql+mysql驅動(實現)+jdbc)

31、數據庫連接池的作用

  1. 限定數據庫的連接個數,不會猶豫數據庫連接過多導致系統運行緩慢或者崩潰
  2. 數據庫連接不需要每次都去創建或銷燬,節約了資源
  3. 數據庫連接不需要每次都去創建,響應時間更快

32、簡單說一下HTML、CSS、JavaScript在網頁開發中的定位

Html 超文本標記語言,定義網頁的結構 
Css 層疊樣式表,用來美化頁面 
Javascript 主要用來驗證表單,做動態交互(其中ajax)

33、簡單介紹一下AJAX

ajax就是異步的JavaScript和想xml。通過ajax可以與服務器進行數據交換,ajax可以使網頁局部刷新,意味着可以在不用加載整個網頁的情況下,對網頁的某部分進行更新。

怎麼實現?ajax xmlhttpRrqueset對象,使用這個對象可以異步向服務器發送請求,獲取響應,完成局部更新,open send responseText/responseXml局部響應. 
使用場景:登陸失敗時不跳轉頁面,註冊時提示用戶名是否存在,二級聯動等等.

34、JS和JQuery的關係

JQuery是一個js框架,封裝了js的屬性和方法,並且增強了js的功能,讓用戶使用起來更加便利,並且增強了js的功能. 
原來是使用js是要處理很多兼容性的問題(比如註冊事件等),由JQuery封裝了底層,就不用處理兼容性問題. 
原生的js的dom和事件綁定和ajax等操作非常麻煩,JQuery封裝了以後,操作非常方便.

35、JQuery中常用 的選擇器

ID選擇器 
Class選擇器 
標籤選擇器 
通用選擇器 
層次選擇器 
屬性選擇器

36、BOOTSTRAP是什麼?

Bootstrap是一個移動設備優先的UI框架.我們不用寫任何的css和js代碼就能實現比較漂亮的有交互性的頁面.我們程序員對頁面的編寫是有硬傷的,所以要自己寫頁面的話,就要使用類似bootstrap這樣的UI框架. 
平時經常用的: 
模態框 
表單,表單項 
佈局 
柵格系統

37、JQuery頁面加載完畢事件

爲什麼需要頁面加載事件?很多時候我們需要獲取元素,但是必須等到該元素被加載後才能獲取,我們可以把js代碼放到該元素的後面,但是這樣就會造成js在我們的body中存在不好管理.所有頁面加載完畢後,所有的元素當然已經加載完畢,一般獲取元素做操作都要在頁面加載完畢後. 
$(function{}表示的是頁面結構被加載完畢 
Window.onload表示的是頁面被加載完畢

38、簡單的介紹一下MVC模式?

最經典的MVC模式是:jsp(View)+servlet(Controller)+javabean(Model)

1.當控制器收到來自用戶的請求 
2.控制器調用javabean完成業務 
3.完成業務後通過控制器跳轉jsp頁面的方式給用戶反饋信息 
4.Jsp給用戶做出響應

39、SpringMVC的執行流程

  1. 當用戶發送請求,被前端控制器(DispatcherServlet)捕獲-----捕獲請求
  2. 前端控制器進行解析,得到URL,通過URL調用HandlerMapping並獲得該Handler配置的所有相關對象----查找Handler
  3. 前端控制器根據得到的Handler,選擇合適的HandlerAdapter,提取Request中的模型數據,填入Handler入參,開始執行Handler,最後返回一個ModelAndView對象.(執行Handler) 
  4. 前端控制器根據返回的ModelAndViewm,選擇合適的ViewResolver(選擇ViewResolver) 
  5. 通過ViewResolver結合Model和View來渲染視圖,前端控制器將渲染結果返回給客戶端(渲染並返回)

40、AOP的應用?

AOP:面向切面編程 
核心原理:使用動態代理的方式在執行前後或出現異常後做加入相關邏輯. 
我們主要使用AOP來做: 
事務處理 執行方法前,開啓事務,執行方法後提交事務,出現異常後回滾事務 
權限判斷 在執行方法前,判斷是否具有權限 
日誌記錄 在執行方法前執行日誌

41、簡單介紹一下SPRING或者SPRING的兩大核心?

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

(1).IOC(inversion of control)或DI(dependency injection)控制反轉 
原來:我的service要調用Dao,我就在service中創建Dao對象,這時Dao對象的創建的控制權在我手中 
Spring:spring發現我的service依賴於Dao,就給我的service注入Dao對象,這時Dao對象創建的控制權在spring手中 
核心原理:工廠模式+反射+配置文件

(2).AOP:面向切面編程 
核心原理:使用動態代理的方式在執行前後或出現異常後做相關邏輯. 
我們主要使用AOP來做: 
事務處理 
權限判斷 
日誌記錄

42、Spring事務的傳播特性和隔離級別

髒讀 :一個事務讀到了另一個事務的未提交的數據 
不可重複讀 :一個事務讀到了另一個事務已經提交的 update 的數據導致多次查詢結果不一致. 
虛幻讀 :一個事務讀到了另一個事務已經提交的 insert 的數據導致多次查詢結果不一致.

Mysql 默認:可重複讀 
Oracle 默認:讀已提交

45、Lilux常用命令

Cd跳轉到目錄 
Pwd 獲取當前路徑 
Su 切換用戶 
Ll 查看當前目錄下文件和目錄 
Tail 查看文件 
Rm –rf 刪除文件 
Vi 修改文件 
Mv 移動/重命名 文件或文件夾 
Mkdir 創建文件夾 
Rm –f 刪除文件夾 
Tar 打包/解壓 
Grep 查找想要的信息

46、數據庫優化

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

優化:

  1. 創建索引:創建合適的索引,我們可以在索引中查詢,查詢到以後直接找到對應的記錄
  2. 分表:當一張表的數據比較多時或者某一張表的字段的值比較多並很少使用時,採用水平分表或者垂直分表來優化
  3. 讀寫分離:當一臺服務器不能夠滿足需要時,採用讀寫分離的方式進行集羣
  4. 緩存:使用Redis來進行緩存

47、如何查詢和慢查詢

在項目自驗或項目轉測之前,在啓動mysql數據庫時開啓慢查詢,並且把執行慢的語句寫到日誌中,在運行一定的時間後,通過查看日誌,找到對應的慢查詢信息.

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

48、選擇合適的索引

索引是幫助DBMS高效獲取數據的數據結構. 
分類:普通索引,唯一索引,主鍵索引,全文索引 
1.普通索引:允許重複的值出現 
2.唯一索引:除了不能有重複的記錄外,其它和普通索引一樣.(用戶名;用戶身份證;手機號) 
3.主鍵索引:是隨着設定主鍵而創建的;也就是把某個列設爲主鍵的時候,數據庫就會給該列創建索引;唯一且沒有null值 
4.全文索引:用來對錶中文本域(char,varchar,text)進行索引,全文索引針對myisam

49、使用索引的一些技巧

索引弊端: 
1. 佔用磁盤空間. 
2. 對dml(插入,修改.刪除)操作有影響,變慢 
使用場景: 
1. 肯定在where條件經常使用,如果不做查詢就沒有意義 
2. 該字段的內容不是唯一的幾個值(sex). 
3. 字段內容不是頻繁變化

具體技巧: 
1. 對於創建的多列索引(複合索引),不是使用的第一部分就不會使用索引(最左匹配) 
2. 對於使用like查詢,查詢如果是”%aaa”不會使用到索引,而”aaa%”會使用到索引 
3. 如果條件中有or,有條件沒有使用索引,即使其中有條件帶索引,也不會使用.簡單來說,就是要求使用的所有字段,都必須單獨使用時才能使用索引. 
4. 如果列類型是字符串,拿一定要在條件中將數據使用引號引用起來,否則索引失效 
5. 如果mysql估計使用全表掃描要比索引快,則不適用索引.例子:表裏只有一條記錄

50、數據庫優化之分表

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

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

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

水平分表策略: 
1. 按時間分表:這種分表方式有一定的侷限性,當數據有較強的時效性.如微博發佈紀錄,微信消息紀錄等,這種數據很少會有用戶查詢幾個月前的數據,這時可以按月分表 
2. 按區間範圍分表:一般在有嚴格的自增id需求上,如按照user_id水平分表 
3. Hash分表(用的多):通過一個原始目標的id或者名稱通過一定的hash算法計算出數據庫存儲表的表名,然後訪問相應的表.

51、數據庫的讀寫分離

一臺數據庫支持的最大併發連接數是有限的,如果用戶併發訪問太多,一臺服務器滿足不了要求時,可以集羣處理.mysql的集羣處理技術最常用的是讀寫分離,

1.主從同步:數據庫最終會把數據持久化到磁盤,如果集羣必須確保每個數據庫服務器的數據時一致的.能改變數據庫數據的操作都往主數據庫去寫,而其他的數據庫從主數據庫上同步數據 
2.讀寫分離:使用負載均衡來實現寫的操作都往主數據庫去.而讀的操作都往從數據庫去

52、數據庫優化之緩存

在持久層(dao)和數據庫(db)之間添加一個緩存層,如果用戶訪問的數據已經緩存起來時,在用戶訪問數據時從緩存中獲取,不用訪問數據庫,而緩存是在操作內存,訪問速度快

作用:減少數據庫服務器壓力,減少訪問時間

Java中常用的緩存: 
1. hibernate的二級緩存,這種緩存不支持分佈式緩存 
2. 可以使用redis來作爲中央緩存,對緩存的數據進行集中處理

53、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優化

54、Redis介紹

Redis是一個key-value的nosql數據庫,先存到內存中,會根據一定的策略持久化到磁盤,即使斷電也不會丟失數據,支持的數據類型比較多.

主要用來做緩存數據庫的數據和web集羣時當做中央緩存存放session

使用場景:

  1. 緩存:把經常需要查詢很少修改的數據放到讀速度很快的空間(內存),以便減少下次訪問時間,減輕db壓力,
  2. 計數器:redis中的計數器是原子性的內存操作,可以解決庫存溢出問題,進銷存,系統存溢出
  3. Session緩存服務器:web集羣時作爲session的緩存服務器

55、Redis存儲對象的方式?

Json字符串:需要把對象轉換成json字符串,當做字符串處理,直接使用set和get來設置或獲取/ 
優點:設置和獲取比較簡單 
缺點:沒有提供專門的方法,需要把對象轉換成json

字節:需要做序列號,就是把對象序列化爲字節保存.

如果是擔心json轉對象會消耗資源的情況,這個問題需要考量幾個地方, 
1. 使用的json轉換lib是否就會存在性能問題 
2. 數據的數據量級別,如果是存儲百萬級的大數據對象,建議採用存儲序列化對象方式.如果是少量的數據級對象,或者是數據對象字段不多,還是建議採用json轉換成string方式.畢竟redis對存儲字符類型這部分優化的非常好.具體採用的方式與方法,還要看你所使用的場景

56、solr相似度匹配原理

solr將用戶輸入的內容使用分詞器進行分詞,然後將這些新詞做成向量。

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

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

57、高併發問題:索引庫同步

1.硬編碼:在相應的代碼中增加索引庫同步的代碼。不過,這種方法耦合度太高,將原本不相關的系統耦合在了一起,容易造成不可預估的錯誤,是電商項目的大忌。 
2.spring的aop:編寫一個索引庫同步的方法,利用aop的形式,將它和數據庫數據更新的方法聯繫起來。這種方式也會造成耦合。 
3.消息隊列:不過,這個方法會造成一個問題,那就是消息消費失敗問題。

:解決兩個系統間的通信問題。 
消息消費失敗:集中同步索引庫,做一個定時任務。在消息隊列所在的服務器上加一個數據庫,我們使用的是redis緩存。消息隊列中每發一條信息,就將這條信息持久化進redis中。接着定時(我們是在晚上,用戶量少的時候)從redis中將消息列表取出來,批量同步索引庫。

58、秒殺業務

秒殺業務最主要的操作:減庫存和添加訂單 
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):秒殺結束;

59、單點登錄的核心是什麼?

單點登錄的核心是如何在多個系統之間共享身份信息

60、solr 的索引查詢爲什麼比數據庫要快。

Solr 使用的是 Lucene API 實現的全文檢索。全文檢索本質上是查詢的索引。而數據庫中並 
不是所有的字段都建立的索引,更何況如果使用 like 查詢時很大的可能是不使用索引,所以 
使用 solr 查詢時要比查數據庫快。

61、IO和NIO

62、序列化和反序列化

序列化一般是指把結構化的對象變成無結構的字節流,便於存儲、傳輸

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

63、網站安全性問題(防止網站被爬)

單位時間內請求次數超過某個閾值就讓輸入驗證碼,可以極大降低抓取的速度,如果多次超 
過某個閥值可以加入黑名單。還有就是頁面內容使用 json 返回,數據經常變一變格式,或 
者 js 動態生成頁面內容

64、Spring對bean的管理

1.BeanFactory: BeanFactory採用了工廠設計模式,負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的生命週期。 
2.ApplicationContext:除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:國際化支持、aop、事務等。 
3.BeanFactory在解析配置文件時並不會初始化對象,只有在使用對象getBean()纔會對該對象進行初始化,而ApplicationContext在解析配置文件時對配置文件中的所有對象都初始化了,getBean()方法只是獲取對象的過程。

65、SpringMVC和SpringBoot的區別?

Spring 是一個“引擎”; 
Spring MVC 是基於Spring的一個 MVC 框架 ; 
Spring Boot 是基於Spring4的條件註冊的一套快速開發整合包: 
1. 創建獨立的Spring應用程序 
2. 嵌入的Tomcat,無需部署WAR文件 
3. 簡化Maven配置 
4. 自動配置Spring 
5. 提供生產就緒型功能,如指標,健康檢查和外部配置 
6. 絕對沒有代碼生成和對XML沒有要求配置 [1]

66、JS的跨域訪問如何實現?

首先,JS的跨域訪問是指js在不同的域之間進行數據傳輸和通信,比如使用ajax向一個不同的域請求數據,或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議,端口,域名有任何一個不同,都被當做不同的域。

實現方法:

  1. 通過jsonp跨域:通過script標籤引入一個js文件,這個js文件載入成功後會執行我們在url參數中指定的函數,並且會把我們需要的json數據作爲參數傳入。所以jsonp是需要服務器端的頁面進行相應的配合的。
  2. 通過修改document.domain來跨子域:
  3. 使用window.name來進行跨域:window對象有個name屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的權限,window.name是持久存在一個窗口載入過的所有頁面中的,並不會因新頁面的載入而進行重置。

67、Java虛擬機的生命週期?

負責運行一個java程序。當啓動一個Java程序時,一個虛擬機實例也就誕生了。當該程序關閉退出,這個虛擬機實例也就隨之消亡。

68、簡單講一下類加載機制?

類加載機制?:類的加載指的是類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區中創建一個java.lang.Class對象,用來封裝方法區中的數據結構。包括五個階段:加載、驗證、準備、解析、初始化

69、外連接和內連接各自什麼什麼時候使用?有何作用?

  1. 內連接:返回連接表中符合連接條件和查詢條件的數據行(所謂的連接表就是早數據庫中在做查詢的時候形成的中間表)
  • 隱式內連接: 形成的中間表爲兩個表的笛卡爾積 

       select o.id,o.order_number,c.id,c.name from customers c, orders o where c.id=o.customer_id;

  • 顯示內連接:形成的中間表爲兩個表經過on條件過濾後的笛卡爾積

       select o.id,o.order_number,c.id,c.name from customers c inner join orders o on c.id=o.customer_id;

    2.外連接:外連接不但返回符合連接和查詢條件的數據行,還返回不符合條件的一些行。外連接分爲三類:左外連接(left outer join)、右外連接(right outer join)、全外連接(full outer join)

  • 左外連接:還會返回左標中不符合連接條件但是符合查詢查詢條件的數據行

        select o.id,o.order_number,o.customer_id,c.id,c.name from orders o left outer join customers c on c.id=o.customer_id;

  • 右外鏈接:還會返回右標中不符合連接條件但是符合查詢查詢條件的數據行

        select o.id,o.order_number,o.customer_id,c.id,c.name from orders o right outer join customers c on c.id=o.customer_id;

  • 全外連接:全外=左外 union 右外,相當於數學合集(去掉重複)

       select o.id,o.order_number,o.customer_id,c.id,c.name from orders o full outer join customers c on c.id=o.customer_id;

70、你知道的鎖有哪些?簡單介紹

鎖的基本概念:同時只能有一個線程獲取到這個鎖,其他的線程要等待這個線程將鎖釋放後纔可以獲取到這個鎖,其實“鎖”從這個意義上來說,鎖住的不是要訪問的對象,而是代碼。假如有多個線程要訪問一個對象,有一個線程獲取到了這個對象的鎖,但是其他的對象仍然可以訪問這個對象並進行修改,只是獲取不到鎖,完全可以不使用鎖來進行修改。

答案:選擇1和5 

常見的鎖:排它鎖(synchronized)、共享鎖、樂觀鎖和悲觀鎖(是一種鎖的思想,不是狀態)、分段鎖、自旋鎖、公平鎖、非公平鎖、可重入鎖

71、解釋內存泄露和內存溢出?

  1. 內存泄露--memory leak:是指程序在申請內存後,無法釋放已經申請的內存空間。內存泄露的堆積最終導致內存溢出
  2. 內存溢出--out of memory:指的是申請內存時,沒有足夠的內存供申請者使用,或者說,就會報錯OOM,即所謂的內存泄露

內存溢出的原因及其解決辦法:

  1. 原因
  • 內存中加載的數據量過於龐大,如一次從數據庫取出過多數據; 
  • 集合類中有對對象的引用,使用完後未清空,使得JVM不能回收; 
  • 代碼中存在死循環或循環產生過多重複的對象實體; 
  • 使用的第三方軟件中的BUG; 
  • 啓動參數內存值設定的過小、

       2.解決辦法

  • 修改JVM啓動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。
  • 檢查錯誤日誌,查看“OutOfMemory”錯誤前是否有其 它異常或錯誤
  • 對代碼進行走查和分析,找出可能發生內存溢出的位置

72、解釋什麼是線程併發,如何解決多線程的併發問題?

線程併發是指一個類的實例對象創建了多個線程對象同時啓動,調用同樣的資源,造成 線程的安全問題 。

解決辦法:根本--保證容易出現問題的代碼的原子性(破壞產生多線程併發安全問題的條件)。

  1. 使用synchronized關鍵字,創建同步代碼塊,當執行到了synchronized(object)語句的時候,先檢查object對象的標誌位,如果爲0狀態,則表示有其他線程正在執行,那麼此線程將暫時阻塞,讓出CPU資源,直到另外的線程執行完畢,將標誌位恢復爲1後,可以繼續運行。
  2. 禁止共享資源 --ThreadLocal
  3. 禁止修改 ---ReadWriteLock

73、舉例說明數據庫三表查詢的實現?

可以使用嵌套查詢,實現三表的連接查詢:
SELECT employee_name 
FROM (table3 c LEFT JOIN TABLE1 a 
ON c.employee_id=a.employee_id )
LEFT JOIN table2 b ON b.company_id=a.company_id 
WHERE company_name ='A' and employee_age<30;

74、mysql的雙機熱備

 

75、常用的消息中間件?rabbitMQ的工作模式

 

76、什麼是lucene?

 

77、NGINX的使用?

 

78、Spring的事務特性?

原子性 (atomicity):強調事務的不可分割. 
一致性 (consistency):事務的執行的前後數據的完整性保持一致. 
隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾 
持久性(durability) :事務一旦結束,數據就持久到數據庫

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章