Java面試題01.面試的總體流程css
List特色:元素有放入順序,元素可重複 Set特色:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,可是元素在set中的位置是有該元素的HashCode決定的,其位置實際上是固定的) Map特色:元素按鍵值對存儲,無放入順序 (應該知道什麼是鍵值對吧!) List接口有三個實現類:LinkedList,ArrayList,Vector LinkedList:底層基於鏈表實現,鏈表內存是散亂的,每個元素存儲自己內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢 ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低 Set接口有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet SortedSet接口有一個實現類:TreeSet(底層由平衡二叉樹實現) Query接口有一個實現類:LinkList Map接口有三個實現類:HashMap,HashTable,LinkeHashMap HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null SortedMap有一個實現類:TreeMap 其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,存儲的是鍵值對 set 通常無序不重複.map kv 結構 list 有序
Java面試題02.java的垮平臺原理html
Java面試題03.搭建一個java的開發環境前端
Java面試題04.java中int佔幾個字節html5
Java面試題05.java面向對象的特徵java
Java面試題06.裝箱和拆箱mysql
Java面試題07.==和equals的區別linux
Java面試題08.String和stringBuilder的區別(final)?stringBuffer和stringBuilder的區別?css3
1、在java中提供三個類string,stringBuilldel,stringBuffer來表示和操做字符串,字符串就是多個字符的集合web
String是內容不可變的字符串,string底層使用了一個不可變的字符串數組(final char[])面試
String str=new string(「bbb」);
而stringBuillder,stringBuffer,是內容能夠改變的字符串,stringBuillder,stringBuffer底層使用的可變的字符數組(沒有使用final來修飾)
2、最經典就是拼接字符串
一、 string進行拼接string c=」a」+「b」;
二、 stringBuilder或者stringBuffer
stringBuilder sb=new stringBuilder();sb.apend(「a」).apend(「b」)
拼接字符串不能使用string進行拼接,要使用stringBuilder或者stringBuffer
3、StringBuilder是線程不安全的,效率較高,而stringBuffer是線程安全的,效率較低
Java面試題09.講一下java中的集合
Java中的集合分爲value,key-value(conllection map)兩種
存儲值有分爲list和set
List是有序的,能夠重複的
Set是無序的,不能夠重複的。根據equals和hashcode判斷,也就是若是一個對象要存儲在set中,必須重寫equals和hashcode方法
存儲key-value的爲map
Java面試題10.ArrayList 和LinkedList的區別
List經常使用的ArrayList和LinkedList。區別和使用場景?
Arraylist底層使用時數組。Linkedlist使用的是鏈表
數組查詢具備全部查詢特定元素比較快,而插入、刪除和修改比較慢(數組在內存中是一塊連續的內存,若是插入或刪除是須要移動內存)。
鏈表不要求內存是連續的,在當前元素中存放下一個或上一個元素的地址,查詢時須要從頭部開始,一個一個的找,因此查詢效率低,插入時不須要移動內存,只需改變引用指向集可,因此插入或者刪除的效率高。
Arraylist使用在查詢比較多,可是插入和刪除比較少的狀況,而linkedlist使用在查詢比較少而插入和刪除比較多的請況
Java面試題11.HashMap和HashTable的區別?HashTable和ConcurrentHashmap(1.5後)的區別?
相同點:hashmap和hasheTalbe均可以使用來存儲key-value的數據
區別:
一、 hashmap是能夠把null做爲key或者value的,而HashTable是不能夠的。
二、 Hashmap是線程不安全的,效率較高,而HashTalbe是線程安全的,效率較低
?我想線程安全可是我又想效率高?
經過把整個map分爲N個segrnent(相似HashTable),能夠提供相同的線程安全,可是效率提高N倍,默認提高16倍
Java面試題12.實現一個拷貝文件的工具類要使用字節流仍是字符串
咱們拷貝的文件不肯定是隻包含字符流,有可能有字節流(圖片、聲音、圖像等)、爲考慮通用性,要使用字節流
Java面試題13.線程的的實現方式?怎麼啓動線程?怎麼區分線程?線程併發庫
1、實現方式
一、 經過繼承Thread類實現一個線程
二、 經過實現runnable接口實現一個線程
繼承擴展性不強,java總只支持單繼承,若是一個類繼承thread就不能繼承其餘的類了。
2、怎麼啓動?
Thread thread=new Thread(繼承了Thread的對象/實現了runnable的對象)
Thread.setName(「設置一個線程名稱」);
Thread.start();
啓動線程使用 start方法,而啓動了之後執行的是run方法
3、怎麼區分線程?在一個系統中有不少線程,每一個線程都會打印日誌,我想區分是哪一個線程打印的怎麼辦?
Thread.setName(「設置一個線程名稱」)這是一種規範,在建立線程完成後,都須要設置名稱
Java面試題14.線程併發庫和線程池的做用
Java面試題15.設計模式和經常使用的設計模式
單例(飽漢模式,飢漢模式)
一、 構造方法私有化,讓出了本身類中能建立外其餘地方都不能建立
二、 在本身的類中建立一個單實例(飽漢模式是一出來就建立單實例,而餓漢模式須要的時候才建立)
三、 提供一個方法獲取該實例對象(建立時須要進行方法同步)
工廠模式spring IOC就是使用了工廠模式
對象的建立交給一個工廠去建立
代理模式spring AOP 就是使用的動態代理
Java面試題16.http get post請求的區別
Java面試題17.說說你對Servlet的理解
Servlet是用java編寫的服務器端程序。而這些sevlet都要實現servlet這個接口,其主要功能在於交互式地瀏覽和修改數據,生成動態web內容,servlet運行與支持java的應用服務器
Httpservlet重寫doget和dopost方法或者你也能夠重寫service方法完成對get和post請求的響應
Java面試題18.Servlet的生命週期
Servlet啓動時,開始加載servlet生命週期開始。Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應doxxx方法等。當服務器決定將實例銷燬的時候(服務器關閉)調用其destroy方法
加載servlet的class….>實例化servlet。。》調用servlet的init完成初始化。。。》響應請求(servlet的service方法)。。。》servlet容器關閉時(servlet的dostory方法)
Java面試題19.Servlet中forward和redirect的區別
Java面試題20.jsp和Servlet的相同點和不一樣點
Jsp是servlet技術的擴展,全部的jsp文件都會被翻譯爲一個繼承HttpServlet的類,也就是jsp最終也是一個servlet這個servlet對外提供服務
Servlet和jsp最主要的不一樣點在於,servlet若是要實現html的功能,必須使用writer輸出
對應的html,而jsp的狀況是java和HTML能夠組合成一個擴展名爲jsp的文件。Jsp側重於視圖,servlet主要用於控制邏輯
Servlet和jsp最主要的不一樣點在於Jsp側重於視圖,servlet主要用於控制邏輯
Servlet若是要實現html的功能,必須使用writer輸出對應的html比較麻煩,而jsp的狀況是java和html能夠組合成一個擴展名爲jsp的文件,作界面展現比較方便而嵌入邏輯比較複雜
Java面試題21.內置對象和四大做用域和頁面傳值
9個內置的對象:
Requeset用戶端請求,此請求會包含來自get/post請求的參數
Response網頁傳回用戶端的迴應
pageContext網頁的屬性是在這裏管理
session與請求有關的會話期
application servlet正在執行的內容
out用來傳送回應的輸出
config servlet的架構部件
page jsp網頁自己
exception針對錯誤網頁,未捕獲的列外
四大做用域:pageContext、request、session、application能夠經過jstl從四大做用域中取值
Jsp傳遞值request、session、application、cookie也能傳值
Java面試題22.Session和Cookie的區別和使用場景
單個cookie保存的數據不能超過4k,不少瀏覽器都限制一個站點最多保存20個cookie
Java面試題23.mvc模式和mvc各部分的實現
M(model)模型javabean
V(vierw)視圖 html jsp volicity freemaker
C(control)控制器 servlet action
Jsp+servlet+javabean最經典mvc模式,實際上就是model2的實現方式,就是把視圖和邏輯隔離開來
Model1的方式jsp+service+dao
Model2的方式jsp+service+service+dao
使用struts2和springmvc這樣的mvc框架後,jsp+核心控制器+action+javabean
Java面試題24.數據庫分類和經常使用數據庫
Java面試題25.關係型數據庫的三範式
Java面試題26.事務的四大特徵
事務是併發控制的單位,是用戶定義的一個操做系列,這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。
好比:一個轉帳必須是A帳號扣錢成功,B帳號加錢成功,纔算正真的轉帳成功。
事務必須知足四大特徵:原子性,一致性,隔離線、持久性
原子性:表示事務內操做不可分割,要麼都成功,要麼都失敗。
一致性:要麼都成功,要麼都失敗,後面的失敗了要對前面的操做進行回滾
隔離性:一個事務開始後,不能受其餘事務干擾。
持久性:表示事務開始了就不能終止
Java面試題27.mysql數據庫最大鏈接數
100
Java面試題28.mysql和oracle的分頁語句
爲何須要分頁?在不少數據是,不可能徹底顯示數據,進行分段顯示,
Mysql是使用關鍵字limit來進行分頁的limit offset,size 表示從多少索引去多少位
Oracle的分頁,大部分狀況下,咱們是記不住了,說思路,要使用三層嵌套查詢。
Oracle的分頁有點兒記不住了,只記得一些大概,是使用了三層嵌套查詢,若是在工做中使用了,能夠到原來的項目中拷貝或上網查詢
Java面試題29.觸發器的使用場景?
Java面試題30.存儲過程的優勢
一、 存儲過程只在建立時進行編譯,之後每次執行存儲過程都不須要再從新編譯,而通常sql語句每執行一次就編譯一次,所以使用存儲過程能夠大大提升數據庫執行速度
二、 一般,複雜的業務邏輯須要多條sql語句,這些語句須要分別地從客戶集發送到服務器,當客戶機和服務器之間的網絡傳輸就會大大減小,下降了網絡負載。
三、 存儲過程建立一次即可以重複使用,從而能夠減小數據庫開發人員的工做量,
四、 安全性高,存儲過程能夠屏蔽對底層數據庫對象的直接訪問,使用EXECUTE權限調用存儲過程,無需擁有訪問底層數據庫對象的顯示權限
Java面試題31.jdbc調用存儲過程
Java面試題32.簡單說一下你對jdbc的理解
Java database connection java數據庫鏈接,數據庫管理系統(mysql oracle等)是不少,每一個數據庫管理系統支持的命令是不同的。
緣由:1對於普通開發人員咱們不知道mysql和oracle等數據庫廠商的私有語言
二、就算你知道,由於每一個數據庫語句不一樣,你須要定製多套代碼。
結論:
Java只定義接口,讓數據庫廠商本身實現接口,對於咱們而言,只須要導入對應廠商開發的實現便可,而後以接口方式進行調用(mysql+mysql驅動(實現)+jdbc)
Java面試題33.寫一個jdbc的訪問oracle的列子
加載驅動(com.mysql.jdbc.Driver, oracle.jdbc.driver.OracleDriver)
獲取鏈接(DriverManager.getConnection(url,username,password))
設置參數 statement preparedStatement (先獲取)
Cstmt.setxxx(index,value);(設置)
執行 executeQuery(查詢) executeupdate(更新)
釋放鏈接(是否鏈接要從小到大,必須放到finnaly)
Java面試題34.jdbc中preparedStatement比Statement的好處
一、preparedStatement是預編譯的,比statement速度快
二、代碼的可讀性和可維護性,preparedStatement比Statement好
三、preparedStatement能夠防止sql注入攻擊,而statement卻不能,使用預編譯語句你傳入的任何內容就不會和原來的語句發生任何匹配的關係,只要全使用預編譯語句你就用不着對傳入的數據作任何過濾,而若是使用普通的statement,有可能要對drop等作費盡心機的判斷和過濾
Java面試題35.數據庫鏈接池的做用
Java面試題36.HTML
Java面試題37.簡單介紹了一下Ajax
Java面試題38.js和JQuery的關係
Java面試題39.jQuery中的經常使用選擇器
Java面試題40.jQuery中頁面加載完畢事件
Java面試題41.jQuery中Ajax和原生js實現Ajax的關係
Java面試題42.簡單說一下html5
Java面試題43.簡單說一下css3
Java面試題44.bootstrap的是什麼
Java面試題45.什麼是框架
Java面試題46.簡單介紹一下MVC模式
M(model)模型javabean
V(vierw)視圖 html jsp volicity freemaker
C(control)控制器 servlet action
最簡單的、最經典就是jsp(view)+servlet(controller)+javaBean(model)
一、 當控制器收到來自用戶的請求
二、 控制器調用javabean完成業務
三、 完成業務後經過控制器跳jsp頁面的方式給用戶反饋信息
四、 Jsp個用戶作出響應
控制器都是核心
Java面試題47.簡單說一下對mvc框架的理解
是爲了解決傳統mvc模式(jsp+servlet+javaBean)問題而出現的框架
傳統mvc模式問題
一、 全部的servlet和servlet映射都要配置在web.xml中,若是項目太大,web.xml就太龐大,而且不能實現模塊化管理。
二、 Servlet的主要功能就是接受參數,調用邏輯、跳轉頁面、好比像其餘字符編碼、文件上傳等功能也要寫在servlet中,不能讓servlet功能單一。
2.1接受參數比較麻煩,不能經過model接收,只能單個接收,接收完成後轉換封裝model
2.2跳轉頁面方式比較單一(forword,redirect),而且當個人頁面名稱發生改變是須要修改servlet源代碼
Java面試題48.struts2的執行流程或者struts2的原理
Java面試題49.Struts2的攔截器是什麼
Java裏的攔截器是動態攔截Action調用的對象,它提供了一種機制可使開發者能夠定義在一個action執行的先後執行的代碼也能夠在一個action執行前阻止其執行,同時也提供了一種能夠提取action中可重用部分的方式。
在AOP中攔截器用於在某個方法或字段被訪問以前,進行攔截而後在以前或以後加入某些操做
面試:
Struts2中的功能(參數處理、文件上傳、字符編碼等)都是經過系統攔截器實現的。若是業務須要,固然咱們也能夠自定義攔截器,進行可插撥配置,在執行Action的方法先後、加入相關邏輯完成業務
使用場景:
一、 用戶登陸判斷、在執行Action的前面判斷是否已經登陸,若是沒有登錄的跳轉到登錄頁面
二、 用戶權限判斷,在執行action的前面判斷是否具備,若是沒有權限就給出提示信息
三、 操做日誌
Java面試題50.Spring MVC的執行流程
一、 用戶向服務器發送請求,請求被spring前端控制servlet DispatcherServlet捕獲
二、 DispatcherServlet對請求url進行解析,獲得請求資源標識符(url),而後根據該url調用handlerMapping得到該handler配置的全部相關的對象(包括handler對象以及hander對象對應的攔截器),最後以handlerExecutionChain對象的形式返回:(查找handler)
三、 DispatcherServlet根據得到的handler,選擇一個合適的handlerAdapter,提取request中的模型數據,填充handler入參,開始執行handler(controller),handler執行完成後,向DispatcherServlet返回一個modelAndView對象(執行handler)
四、 DispatcherServlet根據返回的modelAndView,選擇一個適合的viewResolver(必須是已經註冊到spring容器中的viewResolver)(選擇viewrResolver)
五、 經過ViewResolver結合model和view,來渲染視圖DispatccherServlet將渲染結果返回給客戶端。(渲染返回)
記憶技巧:
核心控制器捕獲請求、查找handler、執行handler、選擇ViewResolver渲染視圖並返回
Java面試題51.SpringMVC和Struts2的不一樣
一、 核心控制器(前端控制器、預處理控制器):對於使用過mvc框架的人來講這個詞應該不會陌生,核心控制器的主要用途是處理全部的請求,而後對那些特殊的請求(控制器)統一的進行處理(字符編碼、文體上傳、參數接受、異常處理等等),spring mvc 核心控制器是servlet,而struts2是filter
二、 控制器實例:spring mvc會比struts快一些(理論上),spring mvc是基於方法設計,而struts是基於對象,每次發一次請求都會實例一個action,每一個action都會被注入屬性,而spring更像servlet同樣,只有一個實例,每次請求執行對應的方法便可(注意:因爲是單例實例,因此應當避免全局變量的修改,這樣會產生線程安全問題)
三、 管理方式:大部分的公司的核心架構中,就會使用到spring,而spring mvc又是spring中的一個模塊,因此spring對於spring mvc的控制器管理更加簡單方便,並且提供了全註解方式進行管理,各類功能的註解都比較全面,使用簡單,而struts2須要採用xml不少的配置參數來管理(雖然也能夠採用註解,可是幾乎沒有公司那樣使用)
四、 參數傳遞:struts2中自身提供多種參數接受,其實都是經過(valuestack值棧)進行傳遞和賦值,而spring mvc是經過方法的參數進行接收
五、 Intercepter的實現機制:struts有以本身的intercepter機制,spring mvc 用的是獨立的AOP方式,這樣致使struts的配置文件量仍是比spring mvc大,雖然struts的配置能繼承。 緣由: Spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring mvc就容易實現restful url,struts2是類級別的攔截,一個類對應一個request上下文:實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。Spring mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過modelmap交回給框架方法之間不共享變量,而struts2搞的比較亂,雖然方法之間也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩
六、 Spring mvc處理ajax請求,直接經過返回數據,方法中使用註解@responseBody, spring mvc自動幫咱們對象轉換爲json數據。而struts2是經過插件的方式進行處理
Java面試題52.簡單介紹一下Spring或者Spring的兩大核心
Spring是J2EE應用程序框架,是loc和AOP的容器框架,主要是針對JavaBean的生命週期進行管理的輕量級容器
一、IOC控制權反轉:
原來:個人service須要調用dao,service就須要建立dao
Spring:spring發現你service依賴於dao,就給你注入
核心原理:就是配置文件+反射(工廠也能夠)+容器(map)
二、 AOP:面向切面編程
核心原理:使用動態代理的設計模式在執行方法先後或出現異常作加入相關邏輯。
咱們主要使用AOP來作:
一、 事務處理
二、 權限判斷
三、 日誌
Java面試題53.AOP是什麼?都用它作什麼?
核心原理:使用動態代理的設計模式在執行方法先後或出現異常作加入相關邏輯。
咱們主要使用AOP來作:
一、 事務處理:執行方法前,開啓事務、執行完成後關閉事務、出現異常後回滾事務
二、 權限判斷:在執行方法前,判斷是否具備權限
三、 日誌 在執行前進行日誌處理
Java面試題54.Spring事務的傳播特性和隔離級別
傳播特性:
Propagation
Required須要 若是存在一個事務,則支持當前事務。若是沒有事務則開啓
Supports 支持 若是存在一個事務,支持當前事務,若是沒有事務,則非事務的執行
Mandatory必需的 若是已經存在一個事務,支持當前事務,若是沒有一個活動的事務,則拋出異常
Required_new老是開啓一個新的事務,若是一個事務已經存在,則將這個存在的事務掛起。
Not_support老是非事務地執行,並掛起任何存在的事務。
Never毫不 老是非事務地執行,若是存在一個活動事務,則拋出異常
Nested 嵌套的 若是有就嵌套,沒有就開啓事務
Java面試題55.ORM是什麼?ORM框架是什麼?
對象關係映射模式,是爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術,經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。實現:一種簡單的硬碼方式(jdbc操做 sql方式),但須要爲不一樣數據庫提供單獨的方法(不足)
另外一種模式:採用映射元數據來描述對象關係的映射,也就是如今ORM框架Hibemate、mybatis、speedframework
Java面試題56.ibatis(mybatis)和hibernate有什麼不一樣
相同點:
都是java中ORM框架、屏蔽jdbc api的底層訪問細節,使用咱們不用與jdbc api打交道,就能夠完成對數據庫的持久化操做。
Mybatis的好處:Mybatis是半自動的,它屏蔽jdbc api的底層訪問細節,將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryforlist返回對象集合,用queryForObject返回單個對象:提供了自動將實體對象的屬性傳遞給sql語句的參數
Hiber name的好處:hibernate是一個全自動的orm映射工具,它能夠自動生成sql語句,並執行返回java結果。
不一樣點:
一、 hibernate要比mybatis功能強大不少,由於hibernate自動生成sql語句
二、 mybatis須要咱們本身在xml配置文件中寫sql語句,hibernate咱們沒法直接控制該語句,咱們就沒法去寫特定的高效率的sql,對於一些不太複雜的sql查詢,hibernate能夠很好幫咱們完成,可是,對於特別複雜的查詢,hibernate就很難適應了。這時候用mybatis就是不錯的選擇,由於mybatis是由咱們本身寫sql語句,就能夠處理複雜語句而hibernate不能。
三、 mybatis要比hibernate簡單的多,mybatis是面向sql的,不一樣考慮對象間一些複雜的映射關係
Java面試題57.hibernate對象狀態及其轉換
Java面試題58:hibernate的緩存
1、爲了提升訪問速度,把磁盤或數據庫訪問變成內存訪問
2、what(hibernate緩存原理是怎樣的?)hibernate緩存包括兩大類:hibernate一級緩存和hibernate二級緩存
面試:
Hibernate中的緩存分一級緩存和二級緩存
一級緩存就是 session級別的緩存,在事務範圍內有效是內置的不能被卸載,二級緩存是sessionFactory級別的緩存,從應用啓動到應用介紹有效果,是可選的,默認沒有二級緩存,須要手動開啓。
保存數據庫後,在內存中保存一份,若是更新了數據庫就要同步更新
什麼樣的數據適合存放到第二級緩存中?
一、 不多被修改的數據 帖子的最後回覆時間
二、 常常被查詢的數據 電商的地點
三、 不是很重要的數據,容許出現偶爾併發的數據
四、 不會被併發訪問的數據
五、 常量數據
擴展:hibernate的二級緩存默認是不支持分佈式緩存的,使用memcahe,redis等中央緩存來代替二級緩存
Java面試題59.webservice的使用場景
Webservice是一個面向服務的編程(SOA)的架構,它是不依賴於語言,不依賴於平臺,能夠實現不一樣的語言間的相互調用,經過internet進行基於http協議的網絡應用間的交互
一、 異構系統的整合
二、 不一樣客戶端的整合、瀏覽器、手機端、微信端、pc端等終端來訪問
好比:天氣預報,經過實現webservice客戶端調用遠程天氣服務實現的
Java面試題60.activiti的簡單介紹
Java面試題61.linux的使用場景
Java面試題62.linux經常使用命令
經常使用:
Pwd獲取當前路徑、 cd跳轉到目錄 、 su_u切換到管理員 Ls ls列舉目錄
文件操做命令:
文件 :tail查看 rm-rf vi
文件夾 mkdir rm-f
Java面試題63:怎麼操做linux服務器
Java面試題64:有沒有使用過雲主機
Java面試題65:數據庫優化方面的事情
查找、定位慢查詢
優化手段:1建立索引 2分表:一張表的數據比較多或某些字段的值比較多但不多使用採用水平分表或者垂直分表 3.讀寫分離:當一臺服務器不能知足需求時,採用讀寫分離方式進行集羣 4緩存:使用redis進行緩存
Java面試題66:若是查詢和定位慢查詢
項目沒有轉測試以前,進行項目自驗的時候,啓動mysql數據庫時啓動慢查詢,而且把執行慢的語句寫到日誌中,在運行必定時間後,經過查看日誌找到慢查詢語句。
使用explain慢查詢語句,來詳細分析語句的問題
Java面試題67:數據庫優化之數據庫表設計遵循範式
一、 原子性、即列的信息,不能分解,只要是關係型數據庫,就自動知足
二、 表中的記錄是惟一,即咱們一般設計一個主鍵來實現
三、 表中的信息,若是可以推導出來,就不該該單獨設計一個字段來存放(即外鍵)
Java面試題68:選擇合適的數據庫引擎
Myisam:若是表對事務要求不高,同時是以查詢和添加爲主的,好比:發帖表、回覆表
INNODB:對事務要求高,保存的數據都是重要數據,咱們建議使用innodb,好比訂單表,帳號表。
Memory:數據變化頻繁,不須要入庫,同時又頻繁的查詢和修改
問:myisam和innodb的區別
一、 事務安全myisam不支持事務而innodb支持
二、 查詢和添加速度myisam不用支持事務就不用考慮同步鎖,查找和添加的速度快
三、 支持全文索引myisam支持innodb不支持
四、 鎖機制myisam支持表鎖而innodb支持行鎖(事務)
五、 外鍵myisam不支持外鍵,innodb支持外鍵(一般不設置外鍵,一般是在程序中保證數據的一致)
Java面試題69:選擇合適的索引
索引是幫助DBMS高效獲取數據的數據結構
分類:普通索引/惟一索引/主鍵索引/全文索引
普通索引:容許重複的值出現
惟一索引:除了不能有重複的記錄外,其它和普通索引同樣(用戶名、用戶身份證)
主鍵索引:是隨着設定主鍵而建立的,也就是把某個列設爲主鍵的時候,數據庫就會給改列建立索引,這就是主鍵索引,惟一且沒有null值
全文索引:用來對錶中的文本域(char 、varchar、text)進行索引,全文索引針對myisam
Java面試題70:使用索引的一些技巧
索引弊端:
一、 佔用磁盤空間
二、 對dml(插入、修改、刪除)操做有影響,變慢
使用場景:
一、 確定在where條件常用,若是不作查詢就沒有意義
二、 該字段的內容不是惟一的幾個值(sex)
三、 字段內容不是頻繁變化
具體技巧:
一、 對於建立的多列索引(複合索引),不是使用的第一部分就不會使用索引。
Alter table dept add index my_ind(dname,loc);//dname 左邊的列,loc就是右邊的列
Explain select*from dept where dname=」aaa」\G會使用到索引
Explain shlect*from dept where loc=」aaa」\G就不會使用到索引
二、 對於使用like的查詢,查詢若是是用前綴通配符‘%aa’不會使用到索引而‘aaa%’會使用索引列
Explain select*from dept where dname like」%aa」\G不能使用索引
Explain select*from dept where dname like」aaa%」\G 使用索引
因此在like查詢時,‘關鍵字’的最前面不能使用%或者-這樣的字符,若是必定要前面有變化的值,則考慮使用 全文檢索》sphinx
三、 若是條件中有OR,有條件沒有使用索引,即便其中有條件帶索引也不會使用,換言之,就是要求使用的全部字段,都必須單獨使用時能使用索引
四、 若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不使用索引 expain select*from dept where dname=’111’
五、 若是mysql估計使用全表掃描要比使用索引快,則不使用索引
Java面試題71:數據庫優化之分表
水平分表(針對行較多)和垂直分表(針對列較多)
Java面試題72:數據庫的讀寫分離
一臺數據庫支持的最大併發鏈接數是有限的,若是用戶併發訪問太多,一臺服務器知足不了,就能夠集羣處理,mysql的集羣處理技術最經常使用的就是讀寫分離:
主從同步
數據庫最終會把數據持久到磁盤,若是集羣必須確保每一個數據庫服務器的數據是一致的,改變數據庫數據的操做都往主數據庫去寫,而其餘的數據庫從主數據庫上同步數據
讀寫分離
使用負載均衡來實現寫的操做都往主數據去,而讀的操做往從服務器去
Java面試題73:數據庫優化之緩存
在持久層(dao)和數據庫(db)之間添加一個緩存層,若是用戶訪問的數據已經緩存起來時,在用戶訪問時直接從緩存中獲取,不用訪問數據庫,而緩存是在操做內存級,訪問速度快。
做用:減小數據庫服務器壓力,減小訪問時間
Java中經常使用的緩存有
一、 hibernate的二級緩存,該緩存不能完成分佈式緩存。可使用redis來做爲中央緩存
二、 可使用redis來做爲中央緩存,對緩存的數據進行集中處理
Java面試題74:sql語句優化小技巧
DDL優化:導入數據
一、 經過禁用索引來提供導入數據性能,這個操做主要針對有數據庫的表,追加數據
//去除健
Alter table test3 DISABLE key;
//批量插入數據
Insert into test3 select*from test
//回覆鍵
Alter table test3 ENABLE keys
二、 關閉惟一校驗
Set unique_checks-o 關閉
Set unique_checks-1 開啓
三、 修改事務提交方式(導入) 變屢次提交爲一次
Set autocommit-o 關閉
//批量插入
Set autocmmit-1開啓
DML優化: 變屢次提交爲一次
Insert into test values(1,2);
Insert into test values(1,3);
Insert into test values(1,4);
//合併多條爲一條
Insert into test values(1,3),(1,2),(1,4);
DQL優化
Order by優化
一、 多用索引排序
二、 普通結果排序(非索引排序)filesort
group by 優化
是使用order by null取消默認排序
子查詢優化
在客戶列表找到不在支付列表的客戶
在客戶列表找到不在「支付列表」的客戶,查詢沒買過東西的客戶
Explain
Select*from customer where customer_id not in(select DISTINCT customer_id from payment); 子查詢 這種是基於func外鏈
Explain
Select*from customer c left join payment p on(c. customer_id=p. customer_id)where p. customer_id is null 這種是基於「索引」外鏈
Or優化
在兩個獨立索引上使用or的性能優於
一、 or兩邊都是用索引字段作判斷,性能好!
二、 Or兩邊,有一邊不用,性能差
三、 若是employee表的name和email這兩列是一個複合索引,可是若是是:name=」「a」or email=」B」 這中方式,不會用到索引
Limit優化
Select film_id,description from film order by title limit 50.5;
Insert into test values
Java面試題75:批量插入幾百萬條數據
Java面試題76:有沒有使用過redis
Java面試題77:redis的使用場景
緩存:
把常常須要查詢的,不多修改數據,放到讀速度很快的空間(內存),以便下次訪問減小時間,減輕壓力,減小訪問時間。
計數器;
Redis中的計數器是原子性的內存操做
能夠解決庫存溢出問題,進銷存,系統庫存溢出
Session緩存服務器
Web集羣是做爲session緩存服務器
緩存隊列等
Java面試題78:redis存儲對象的方式
Json字符串:
須要把對象轉換爲json字符串,當作字符串處理,直接使用set get來設置
優勢:設置和獲取比較簡單 缺點:沒有提供專門的方法,須要把對象轉換爲json
字節:
須要作序列號,就是把對象序列化爲字節保存
若是是擔憂json轉對象會消耗資源的狀況,這個問題須要考量幾個地方
第一點, 就是使用的json轉換lib是否就會存在性能問題
第二點, 就是數據的數據量級別,若是是存儲百萬級的大數據對象,建議採用存儲序列化對象方式,若是是少許的數據級對象,或者是數據對象字段很少,仍是建議採用json轉換成string方式
畢竟redis對存儲字符類型這部分優化的很是好,具體採用的方式與方法,還要看你所使用的場景
Java面試題79:redis數據淘汰機制
Volatile-lru;從已設置過時時間的數據集(server.db[i].expires)中挑選最近少使用的數據淘汰
Allkeys-lru;從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
Java面試題80:java訪問redis級redis集羣
java訪問redis級:
一、 使用jedis java客戶端來訪問redis服務器,有點相似經過jdbc訪問mysql同樣
二、 固然若是是spring進行集成時,可使用spring data組件來訪問redis ,spring data只是對jedis的二次封裝,jdbc Template jdbc關係同樣
redis集羣:當一臺數據沒法知足要求,可使用redis集羣來處理,相似於mysql的讀寫分離
Java面試題81:微信公衆號分類和微信開發原理
Java面試題82:怎麼把微信和業務平臺進行綁定
Java面試題83:項目的分類和項目參與者
Java面試題84:項目流程和業務注意事項
shiro怎麼使用的。
redis集羣怎麼使用的、哪些數據放在redis裏面。
Quartz:存庫預警的發送。
arraylist和linkedlist的區別。arraylist能夠存null;
怎麼建立多線程:繼承Thread;實現Runnable;實現callable接口
springmvc實現原理。
poi導入導出。
webService怎麼使用的。
mysql和Oracle怎麼分頁查詢
Linux的一些簡單命令
Hibernate和MyBatis有什麼區別。
spring boot怎麼使用的。
list和set、map會問。
數據算法,排序也會問。我說了快排、他就讓我手寫快排。而後我只把原理說給他聽了。
設計模式、動態代理等。