Java面試整理《下》

一、數據庫部分

  1. 簡單介紹下關係數據庫三範式

    範式指的是數據庫設計時要遵循的三個規範,但並不是強制式的,這三個規範呈階梯式的關係,現有第一層然後在第一層的基礎上有第二層...
    
    第一範式規定列數據不可分割,即實體中的某個屬性不能有多個值或者重複的屬性;第二範式要求每個行必須可以被唯一的區分,就是表中必須有主鍵存在的意思;第三範式規定表中不包含已在其他表中已包含的非主關鍵字信息,意思是除了外鍵之外不能存儲其他表的數據信息。
    
    反三範式:出於對效率和便利性的追求,可以違反三範式設置重複或可以推導出的字段,比如爲了在查詢訂單的總價時可以不用去計算每個訂單項中的單價和在訂單表中設置訂單總價字段。
    
  2. 可以簡單介紹下什麼是事務?

    事務是併發控制的最小單位(需要滿足ACID),用戶定義的一個操作序列要麼都執行成功,要麼都執行失敗,比如轉賬,A扣錢,B加錢,這兩個操作必須是不可分割的,在commit之後也不能被幹擾,將執行的代碼try/catch並調用回滾rollback撤銷當前事務操作。
    
  3. mysql數據庫的默認的最大連接數?

    mysql數據的默認連接數大小是100,數據庫在安裝時都會設置一個最大連接數,這是因爲一般服務器都只能支持一定數目同時連接。
    
  4. 說一下msyql的分頁?oracle的分頁?

    oracle的分頁是採用了三層嵌套查詢,沒有用過不贅言。
    
    mysql是使用關鍵字limit來進行分頁查詢的
String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
  1. 存儲過程是什麼?它有什麼優缺點?

    存儲過程本質上是sql語句的集合,這些集合像一個方法一樣實現某一特定的功能,通過設置名稱的方式提供調用。
    
    由於是預編譯的代碼塊,所以執行效率會比較高;由於很多SQL一起執行,所以節省網絡帶寬;存儲過程提供安全機制,可以對於沒有權限執行存儲過程的用戶進行控制;
    
    缺點則是調試和更改時比較麻煩,而且也沒辦法做緩存和做數據庫集羣。因此對於存儲過程的使用要慎重,對於提高SQL查詢的性能而言,ORM框架做的會比存儲過程好。
    
    SQL語言本質是一種結構化查詢語言,複雜的業務邏輯還是應該通過代碼去實現。
    
  2. 有沒有做過數據庫優化方面的事情?

    主要是使用索引、分表和緩存來做數據庫優化,當有多個數據庫服務器時,還可以採用讀寫分離的方式做數據庫集羣。
    
  3. 數據庫優化之創建合適的索引
  • 普通索引:允許重複的值出現
  • 唯一索引:除了不能重複記錄之外,其它的和普通索引一樣,例如用戶名,身份證,email,tel
  • 主鍵索引:將表中某列設置爲主鍵的時候數據庫引擎會自動將該列設置爲主鍵索引,這個主鍵索引唯一併且沒有不能爲null
  • 全文索引:主要針對表中的文本域進行索引,比如char,varchar,text等字段

    索引的弊端一是佔用磁盤空間,二是對DML(增刪改)操作會降低效率。
    
    索引配合where條件,一般在字段內容不是頻繁變化的時候使用,並且該字段的內容不是唯一的幾個值,例如性別這個字段只有男女或未知
    
    索引使用的技巧:對於like查詢,如果模糊信息爲'%aaa'的話就不會使用索引,因此在like查詢中,關鍵字的最前面最好不要使用'%'或者'_'這樣的字符,如果前面的值一定要有變化,則考慮使用全文索引(sphinx);如果條件查詢中帶有'or'關鍵字就不會使用索引,所以要避免使用'or'關鍵字;如果列是字符串類型,無論是不是字符串數字都要使用''包括起來,否則當值是數值類型的話會自動轉換,如果不是數值類型則會報錯;當表中只有一條數據時,全表掃描要比索引快,所以爲了"效率"的查詢數據,應該使用全表掃描的方式,233...
    
  1. 數據庫優化之分表

    當數據庫單個表中數據越來越大(百萬級別)的時候會導致數據查詢緩慢,又因爲數據庫是多用戶共享資源,併發存取同一數據的時候時需要添加鎖機制來控制用戶操作,所以會出現數據庫性能瓶頸。這個時候就需要對數據庫進行分表,就是把數據量大的表分成多個數據表,比如商品SPU和SKU表的商品描述信息進行表抽取和對單個數據比如價格,0-100和100-200在不同表中或通過自增長ID切割,這是水平分表。比如在電商項目中類似商品的分類、創建時間、品牌和規格等信息具有變化頻率慢,查詢次數多,而且有很好的實時性的數據,把這樣的數據稱之爲冷數據;類似商品評論,廣告,銷量和價格排序這些變化頻率慢的數據稱之爲熱數據。將這些數據通過更改存儲引擎,使用memcache、redis和從庫配置等進行不同的處理。
    
  2. 數據庫優化之讀寫分離

    一臺數據庫服務器所支持的最大併發連接數是有限的,如果用戶併發訪問太多就需要考慮搭建集羣,讀寫分離就是mysql處理集羣的相關技術。使用負載均衡來實現寫操作往主數據庫庫中去,讀操作往從數據庫中去。數據庫最終都會把數據庫持久化到磁盤,因此集羣必須保證每個數據庫服務器中數據是一致的,這就是主從同步技術。
    
  3. 數據庫優化之緩存

    每次讀取數據都需要操作數據庫,這對數據庫很不友好,所以需要在持久層DAO和數據庫DB中添加一個緩存層,這個緩存層一般都使用內存實現,如果訪問的數據能夠從緩存服務器中讀取,那麼就不會訪問數據庫。在Java中的緩存有ORM框架的二級緩存,需要注意的是Hibernate的二級緩存不能完成分佈式緩存,還有可以使用memcache或者redis來對緩存的數據進行集中處理。
    

二、前端部分

  1. 簡單說一下html,css,javascript在網頁開發中的定位?
  • HTML 超文本標記語言 定義網頁的結構
  • CSS 層疊樣式表,用來美化頁面
  • JavaScript主要用來驗證表單,做動態交互(其中ajax)
  1. 簡單介紹一下Ajax?

    如果不使用ajax,拿直播頁面來說,你點擊直播間的刷新按鈕,那麼包括彈幕在內的整個網頁都會刷新。所以ajax不只是一門技術,只要是通過js調用異步通訊組件並使用格式化數據來更新頁面上的內容就可以說是ajax,它實現了頁面中局部位置的定點刷新。
    
    ajax全稱AsynchronousJavascript+XML(異步傳輸+js+xml),所謂異步就是在向服務器發送請求的時候不需要等待結果就可以做其他事,這就代表你可以在一個頁面上同時看直播視頻界面和彈幕。現在一般使用json來代替xml,好處是json更加簡潔,解析速度也更快。
    
    ajax原理是通過創建XmlHttpRequest對象,XmlHttpRequest是js提供的一個爲客戶端提供客戶端與服務器之間傳輸數據的API對象。通過這個API對象調用onreadystatechange事件,該事件用於獲取客戶端瀏覽器向服務器發送數據的狀態(200,404等),得到狀態之後就會調用編寫的回調函數。在這個過程中,其他代碼還是在不斷接收數據解析數據的,只是不會阻塞js代碼。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () { //存儲函數 當readyState屬性發生改變時就會調用
    Fuck(xhr.readyState);//readyState屬性 0=請求未初始化,1=服務器連接已建立,2=請求已連接,3=請求處理中,4=請求已完成,且響應就緒
    Fuck(xhr.status);//status屬性 200=ok,404=訪問資源未找到,401=沒有訪問權限,402=預留的狀態碼,403=禁止訪問,500=服務器內部錯誤等等
}
缺點:ajax破壞了瀏覽器的back和history機制;違反了URL資源定位設計的初衷;對搜索引擎(SEO)有影響;不能很好的支持移動設備;破壞了程序的異常處理機制;由於現在的程序將大量原先在後端的代碼放到了js文件中會導致客戶端程序複雜並存在安全隱患。

使用場景:登錄失敗時不跳轉頁面,註冊時提示用戶名是否存在,二級聯動。
  1. js和jQuery的關係?

    JQ是一個封裝了js屬性和方法的框架,可以讓開發者使用便利的同時也增強了js的功能,如果是使用原生js的話就需要處理很多兼容性問題和事件綁定,dom操作,ajax,註冊事件等。JQ常用的選擇器有ID選擇器,class選擇器,標籤選擇器等。
    
  2. jQuery的頁面加載完畢事件?

    在js中想要獲取元素必須要先加載元素,可以將獲取元素的js代碼放到元素標籤後,但是這樣會造成管理上的不便,所以一般等頁面全部加載之後在獲取元素。一般使用$(funcation(){});//當頁面加載完畢之後會執行花括號中的函數,這是相對簡單的方式,因此使用也是最多的。
    
    需要注意的是JQ中的頁面加載是指頁面結構被加載完畢,而window.onload表示的是頁面被加載完畢。
<img src=”htttp://baidu.com/1.jpg”/>

onload必須等頁面中的圖片、聲音、圖像等遠程資源被加載完畢後才調用,而jQuery中只需要頁面結構被加載完畢。

  1. 簡單說一下html5和css3?你對現在的那些新技術有了解?

    html5是最新版本的html,在html4的基礎上增強了一些標籤,比如畫板,聲音,視頻,web存儲這些功能。但是html5過於強調語義,比如使用header標籤表示頭部,footer表示底部。以前在開發都是採用div標籤定義模塊。
    
    css3在css2的基礎上做了增強,實現了一些原來在css2中實現起來比較困難,或者不能實現的功能,比如盒子和文字陰影,漸變,動畫等。css3的缺點在於需要根據不同的瀏覽器處理兼容性,其實html5也有兼容性問題,比如html5播放器panda.tv就出於兼容性的考慮沒有使用html5播放器。
    

三、框架部分

  1. 什麼是框架?

    it語境中的框架是指爲了解決某一開放性問題而設計的具有一定約束性的支撐結構,在這種結構上可以根據具體問題進行擴展,從而便捷的構建完整的解決問題的方案。
    
  • 框架不能完全解決實際上遇到的問題,但可以快速的解決普遍問題。
  • 框架是爲了擴展而設計的
  • 一般框架會提供很多輔助性的實用工具,比如java的一系列jar包就是對jdk功能的擴展。
  1. 簡單講一下SpringMVC的執行流程?

    SpringMVC本質上是一個前端控制器(DispatcherServlet),通過對處理器映射器,處理器適配器和視圖解析器的調度來實現接收請求和響應數據。
    
  2. 說一下struts2和springMVC有什麼不同?

    MVC的核心是Servlet,Strtus2的核心是Filter;MVC一般使用註解開發,Strtus2一般使用xml配置;MVC處理ajax請求,直接返回數據,在方法中通過註解@RequestBody,MVC就會自動將對象轉換成json數據;而strtus2是通過插件轉換的。
    
  3. 說一下Spring中的兩大核心?

    IoC(Inversion of Control)或者稱之爲DI(Dependency Injection)是指程序將DAO的創建權交付Spring管理,通過配置文件和反射再加上Map來實現自動創建Bean。
    
    AOP(Aspect Oriented Programming)被稱之爲面向切面編程,使用動態代理的方式在執行方法前後或應用程序出現異常時加入相關邏輯。比如對於事務和日誌的處理。
    
  4. 什麼是ORM?

    對象關係映射簡稱ORM(Object Relational Mapping),通過對數據和對象之間映射元數據的方式,將程序中的對象自動持久化到關係數據庫。
    
  5. iBatis(mybatis)與Hibernate有什麼不同?

    mybatis的好處在於將sql語句與java代碼分離並提供將結果集自動封裝爲實體對象和對象集合的功能,還提供了自動將實體對象的屬性傳遞給sql語句的參數這樣的功能。
    
    hibernate的好處在於可以自動生成sql語句並執行同時返回java結果。
    
    兩者最大的不同在於mybatis是面向sql的所以需要在xml配置文件中寫sql,而hibernate是自動生成sql,需要考慮對象之間複雜的映射關係。因爲這個特性所以hibernate無法完成特別複雜的查詢。
    

四、其他部分

  1. 有沒有用過linux?你都用它來做什麼?

    linux的特點是長時間運行比較穩定,所以一般會用做服務器。linux提供C語言編譯環境,所以需要C語言支持的redis和nginx等可以通過在C語言編譯環境中獲取軟件包並運行。

  2. 說一下linux下面的一下常用命令?
  • 查看文件 tail -f
  • 刪除文件 rm -rf
  • 編輯文件 vi
  • 創建文件夾 mkdir
  • 刪除文件夾 rm -f
  • 獲取當前路徑 pwd
  • 跳轉目錄 cd
  • 切換用戶 su -root
  • 列舉目錄 ls
  1. 你是使用什麼來連接遠程的Linux服務器的?
  • 需要依賴於Linux服務器安裝ssh服務端,一般這個ssh服務的端口22.
  • 需要依賴於Linux服務器安裝sftp服務端,一般這個sftp服務的端口25.
  • 使用xshell、putty等ssh客戶端來連接服務器,使用xftp、winscp等sftp客戶端來上傳和現在文件。連接和上傳、下載必須依賴於服務器的ssh、sftp服務,也就是linux服務器需要啓動這兩個服務。
  1. 沒有使用過雲主機?

    客戶有租用過阿里的雲主機,雲主機就是一些雲服務運營商比如阿里,騰訊,華爲等提供遠程的服務器功能,開發者只需要按需付費即可租用。使用ssh和sftp操作

  2. 有沒有使用過redis? redis是什麼

    redis是一個key-value的nosql的數據庫,redis會先將數據存儲到內存中,然後根據一定的策略持久化到磁盤,已達到斷電也不會丟失數據。主要用來做緩存數據庫的數據和做web集羣的時候當做中央緩存存放session。

  3. redis的數據淘汰機制

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

    內存大小有限,需要保存有效的數據?redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。

    redis 提供 6種數據淘汰策略:

  • volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
  • volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
  • volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
  • allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
  • allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
  • no-enviction(驅逐):禁止驅逐數據
  1. 微信開發原理

    微信公衆平臺開發者,通過接入認證的方式,讓我們的服務器能處理來自微信服務器轉發的微信用戶的請求,處理完成後返回給微信服務器,有微信服務器對用戶響應。

  2. 怎麼把微信和業務平臺綁定?

    用戶註冊實體中包含一個微信號的字段,進行綁定操作的時候就是修改這個微信號的字段,我們需要通過微信網頁授權的方式獲取微信號。

    當用戶同意授權的時候我們可以得到一個code,通過這個code換取網頁授權的微信號,就是openid,最後將openid存入到微信號字段中即可

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