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的差別?
- 差別:
- 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中設計模式?常用的有單例模式、工廠模式、裝飾者模式、代理模式
- 單例模式:
- 工廠模式:
- 裝飾者模式:
- 代理模式:
14、HTTP、GET、POST請求的差別?
- GET請求的資料會暴露在位址欄當中,而POST不會
- 對于GET,特定的浏覽器和伺服器對于URL有長度限制,傳輸資料時會受到限制
- 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、事務的四大特征
- 原子性:表示事務内不可分割
- 一緻性:表示要麼都成功,要麼都失敗。失敗了,要對前面的操作進行復原
- 隔離性:一個事務開啟了,不能受其他事務的影響
- 持久性:表示事務開始了,就不能終止,送出事務後,将資料序列化到資料庫
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、資料庫連接配接池的作用
- 限定資料庫的連接配接個數,不會猶豫資料庫連接配接過多導緻系統運作緩慢或者崩潰
- 資料庫連接配接不需要每次都去建立或銷毀,節約了資源
- 資料庫連接配接不需要每次都去建立,響應時間更快
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的執行流程
- 當使用者發送請求,被前端控制器(DispatcherServlet)捕獲-----捕獲請求
- 前端控制器進行解析,得到URL,通過URL調用HandlerMapping并獲得該Handler配置的所有相關對象----查找Handler
- 前端控制器根據得到的Handler,選擇合适的HandlerAdapter,提取Request中的模型資料,填入Handler入參,開始執行Handler,最後傳回一個ModelAndView對象.(執行Handler)
- 前端控制器根據傳回的ModelAndViewm,選擇合适的ViewResolver(選擇ViewResolver)
- 通過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 預設:讀已送出
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL4NGROdXRE1ENNpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2MTO2UjM1QTMzATMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
45、Lilux常用指令
Cd跳轉到目錄
Pwd 擷取目前路徑
Su 切換使用者
Ll 檢視目前目錄下檔案和目錄
Tail 檢視檔案
Rm –rf 删除檔案
Vi 修改檔案
Mv 移動/重命名 檔案或檔案夾
Mkdir 建立檔案夾
Rm –f 删除檔案夾
Tar 打包/解壓
Grep 查找想要的資訊
46、資料庫優化
定位:查找,定位慢查詢,并優化
優化:
- 建立索引:建立合适的索引,我們可以在索引中查詢,查詢到以後直接找到對應的記錄
- 分表:當一張表的資料比較多時或者某一張表的字段的值比較多并很少使用時,采用水準分表或者垂直分表來優化
- 讀寫分離:當一台伺服器不能夠滿足需要時,采用讀寫分離的方式進行叢集
- 緩存:使用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
使用場景:
- 緩存:把經常需要查詢很少修改的資料放到讀速度很快的空間(記憶體),以便減少下次通路時間,減輕db壓力,
- 計數器:redis中的計數器是原子性的記憶體操作,可以解決庫存溢出問題,進銷存,系統存溢出
- 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)的資料。隻要協定,端口,域名有任何一個不同,都被當做不同的域。
實作方法:
- 通過jsonp跨域:通過script标簽引入一個js檔案,這個js檔案載入成功後會執行我們在url參數中指定的函數,并且會把我們需要的json資料作為參數傳入。是以jsonp是需要伺服器端的頁面進行相應的配合的。
Java開發面試常見問題總結 - 通過修改document.domain來跨子域:
Java開發面試常見問題總結 - 使用window.name來進行跨域:window對象有個name屬性,該屬性有個特征:即在一個視窗(window)的生命周期内,視窗載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的權限,window.name是持久存在一個視窗載入過的所有頁面中的,并不會因新頁面的載入而進行重置。
67、Java虛拟機的生命周期?
負責運作一個java程式。當啟動一個Java程式時,一個虛拟機執行個體也就誕生了。當該程式關閉退出,這個虛拟機執行個體也就随之消亡。
68、簡單講一下類加載機制?
類加載機制?:類的加載指的是類的.class檔案中的二進制資料讀入到記憶體中,将其放在運作時資料區的方法區内,然後在堆區中建立一個java.lang.Class對象,用來封裝方法區中的資料結構。包括五個階段:加載、驗證、準備、解析、初始化
69、外連接配接和内連接配接各自什麼什麼時候使用?有何作用?
- 内連接配接:傳回連接配接表中符合連接配接條件和查詢條件的資料行(所謂的連接配接表就是早資料庫中在做查詢的時候形成的中間表)
- 隐式内連接配接: 形成的中間表為兩個表的笛卡爾積
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、解釋記憶體洩露和記憶體溢出?
- 記憶體洩露--memory leak:是指程式在申請記憶體後,無法釋放已經申請的記憶體空間。記憶體洩露的堆積最終導緻記憶體溢出
- 記憶體溢出--out of memory:指的是申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,就會報錯OOM,即所謂的記憶體洩露
記憶體溢出的原因及其解決辦法:
- 原因
- 記憶體中加載的資料量過于龐大,如一次從資料庫取出過多資料;
- 集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
- 代碼中存在死循環或循環産生過多重複的對象實體;
- 使用的第三方軟體中的BUG;
- 啟動參數記憶體值設定的過小、
2.解決辦法
- 修改JVM啟動參數,直接增加記憶體。(-Xms,-Xmx參數一定不要忘記加。
- 檢查錯誤日志,檢視“OutOfMemory”錯誤前是否有其 它異常或錯誤
- 對代碼進行走查和分析,找出可能發生記憶體溢出的位置
72、解釋什麼是線程并發,如何解決多線程的并發問題?
線程并發是指一個類的執行個體對象建立了多個線程對象同時啟動,調用同樣的資源,造成 線程的安全問題 。
解決辦法:根本--保證容易出現問題的代碼的原子性(破壞産生多線程并發安全問題的條件)。
- 使用synchronized關鍵字,建立同步代碼塊,當執行到了synchronized(object)語句的時候,先檢查object對象的标志位,如果為0狀态,則表示有其他線程正在執行,那麼此線程将暫時阻塞,讓出CPU資源,直到另外的線程執行完畢,将标志位恢複為1後,可以繼續運作。
- 禁止共享資源 --ThreadLocal
- 禁止修改 ---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) :事務一旦結束,資料就持久到資料庫