成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

貼一貼我的后端開發(fā)面試題

Batkid / 3648人閱讀

摘要:線程有幾種狀態(tài)生命周期是怎樣的線程有五種狀態(tài)創(chuàng)建就緒運(yùn)行阻塞死亡。當(dāng)線程獲得到等待的資源資源或者引起阻塞的條件得到滿足時調(diào)用或,會從阻塞狀態(tài)進(jìn)入就緒狀態(tài)。使用,允許最多個線程同時訪問資源。

轉(zhuǎn)載請注明出處: 貼一貼我的后端開發(fā)面試題。  

本文是面試回寢室后憑記憶羅列出來的問題,大概90%的問題都在這里面了,有幾個問題的實(shí)在是想不起來了= =,有些問題自我感覺回答的不好,所以我是查了資料后重新整理了再貼上答案的。如有錯誤或不適合的,歡迎大家評論點(diǎn)出,謝謝!

雖然面試的是Java實(shí)習(xí)生職位,但問題不局限于Java語言。

技術(shù)無關(guān):

面試過程中只有三個技術(shù)無關(guān)的話題:

自我介紹。

感覺自己有什么優(yōu)缺點(diǎn)?

你現(xiàn)在有女朋友了嗎? = =..

這類的話題一般稍微準(zhǔn)備一下,都不會有什么問題。

技術(shù)相關(guān): 1. Spring MVC 如何接受并處理一個請求的?
首先我們會在web.xml中注冊一個DispatcherServlet,并令這個servlet接收所有的請求,項目啟動后Spring會掃描配置文件,根據(jù)配置加載和實(shí)例化類,其中掃描到的帶有@Controller或者@RestController注解的類則是請求要映射到的類,Spring MVC掃描里面所有和請求映射有關(guān)的注解, 如@RequestMapping@ResponseBody、@RequestParam等。當(dāng)接收到一個請求時,它會根據(jù)請求的url映射到對應(yīng)的controler,并根據(jù)返回值判斷是渲染jsp頁面還是返回普通文本,亦或是返回json。
2. AOP實(shí)現(xiàn)原理。
AOP是通過動態(tài)代理來實(shí)現(xiàn)的,有兩種常用的技術(shù),一是JDK的動態(tài)代理,二是CGLIB,而無論是前者還是后者,都是生成動態(tài)生成類的字節(jié)碼來實(shí)現(xiàn)的。JDK的動態(tài)代理只能處理接口實(shí)現(xiàn)的方法,而CGLIB則沒有這個限制。因?yàn)樽止?jié)碼是動態(tài)生成的,所以可以在生成的字節(jié)碼當(dāng)中,在目標(biāo)方法前后插入定義好的方法的調(diào)用。
3. 注解是怎么用的?為什么要使用注解?
當(dāng)在一個類、方法或者字段上標(biāo)上注解后,可以通過obj.getClass().isAnnotationPresent(..)來判斷一個目標(biāo)是否被特定的注解標(biāo)識,通過obj.getClass().getAnnotation(..)來獲取標(biāo)志是注解,以此獲得注解上的信息。使用注解可以幫助我們在項目的編譯期或運(yùn)行時給類、方法或?qū)ο筇砑右粋€額外的信息,給編程增加了很大的靈活性。比如用@Override來標(biāo)志這是重寫父類的方法,那么編譯器就可以在編譯期檢查該方法是否真的是重寫父類的方法,將錯誤扼殺在編譯器。
4. 線程有幾種狀態(tài)?生命周期是怎樣的?
線程有五種狀態(tài):創(chuàng)建、就緒、運(yùn)行、阻塞死亡。  
調(diào)用start方法時,線程就會進(jìn)入就緒狀態(tài)。
在線程得到cpu時間片時進(jìn)入運(yùn)行狀態(tài)。
線程調(diào)用yield方法可以讓出cpu時間回到就緒狀態(tài)。
線程運(yùn)行時可能由于IO、調(diào)用sleep、waitjoin方法或者無法獲得同步鎖等原因進(jìn)入阻塞狀態(tài)。
當(dāng)線程獲得到等待的資源資源或者引起阻塞的條件得到滿足時(調(diào)用notifynotifyAll),會從阻塞狀態(tài)進(jìn)入就緒狀態(tài)。
當(dāng)線程的run方法執(zhí)行結(jié)束或者調(diào)用interrupt方法時,線程就進(jìn)入死亡狀態(tài)。
5. Java中如何實(shí)現(xiàn)同步。

Java實(shí)現(xiàn)同步的方法有:

使用synchronized關(guān)鍵字為方法或代碼塊加鎖。

使用volatile修飾變量,但是volatile不保證原子性。

使用ReentrantLock或者ReentrantReadWriteLock, 這種方法比synchronized更靈活。

使用Semaphore,允許最多n個線程同時訪問資源。

6. HashMapHashtable的區(qū)別。

HashMap線程不安全的,Hashtable是線程安全的。

HashMap的key和value接受null,Hashtable不接受。

HashMap繼承自AbstractMap,Hashtable繼承自Directory

7. JVM是否了解?

這里我回答了最近正在看《深入理解Java虛擬機(jī)》一書,本想著這方面的問題能答上一些的,沒想到面試官直接說
那看樣子還不是很了解,就不問這塊的問題了= =.. 心塞
但是我估摸著大概如果問的話會問:

7.1. JVM的內(nèi)存模型。

JVM的內(nèi)存一共分為5個部分:

程序計數(shù)器: 里面存放著線程執(zhí)行的指令。

方法區(qū): 存放類的信息,如:類名、方法、成員變量等,也存放著常量池。

虛擬機(jī)棧: 存放著局部變量表、操作數(shù)棧、方法出口信息等方法執(zhí)行所需信息。

本地方法棧: 存放程序調(diào)用native方法的信息。

: 這五個部分中最大的,對象的內(nèi)存分配都是在堆內(nèi)存中。

7.2. 常用的虛擬機(jī)參數(shù)。

-Xmx: 指定最大堆內(nèi)存

-Xms: 指定初始化堆內(nèi)存大小。

-Xmn: 指定年輕代內(nèi)存初始內(nèi)存大小,同時也是最大內(nèi)存大小。

-XX:NewSize: 指定年輕代內(nèi)存大小。

-XX:NewRatio: 指定年輕代和老年代的內(nèi)存比例。

-XX:MaxHeapSize: 指定程序最大內(nèi)存。

-XX:+PrintGC: 打印GC日志。

-XX:+PrintGCDetails: 打印詳細(xì)的GC日志。

-Xloggc: 打印GC日志保存位置。

7.3. 垃圾回收算法。

引用計數(shù)算法:

該算法對每一個對象都有一個引用計數(shù),沒增加一次引用就+1,減少一次引用-1,在回收時將引用計數(shù)為0的對象清理掉。這種算法簡單,但是無法解決循環(huán)引用的問題(比如: A引用B, B也引用A,但是A和B都沒有被其它任何對象引用)。

標(biāo)記-清除算法:

該算法分為兩個階段, 第一階段遍歷找出所有需要被回收的對象,并做上標(biāo)記,第二階段對清理所有被標(biāo)記的對象,這種算法效率比較低,并且會產(chǎn)生較多的內(nèi)存碎片。

標(biāo)記-整理算法:

該算法的第一階段和標(biāo)記-清除算法是一樣的,而第二階段它不是直接清理掉垃圾對象,而且將存活的對象往同一側(cè)移動,移動完成后清理掉另一側(cè)所有的對象。這種算法不會產(chǎn)生內(nèi)存碎片,但是效率低下。

復(fù)制算法:

該算法將內(nèi)存分為兩個區(qū)域,進(jìn)行垃圾回收時,就將還活著的對象復(fù)制到另一塊內(nèi)存區(qū)域中,然后再將整片內(nèi)存區(qū)域清空。這種算法簡單快速,而且不會產(chǎn)生內(nèi)存碎片,但是因?yàn)閷?nèi)存分成兩塊,所以可用的內(nèi)存會少很多。

分代收集算法:

將內(nèi)存細(xì)分為多個區(qū)域,不同區(qū)域GC的頻率,并對不同的區(qū)域采用適當(dāng)?shù)氖占惴?。如JVM將內(nèi)存分為年輕代和老年代,普通對象最開始分配在年輕代(大對象會直接分配到老年代),同一個對象在經(jīng)過幾次GC后還存活著,就認(rèn)為這個對象的生命周期會比較長,將其移入老年代,GC主要發(fā)生在年輕代。
7.4 類加載機(jī)制。
Java中主要有Bootstrap類加載器、ExtClassLoaderAppClassLoader,其中Bootstrap類加載器主要加載JAVA_HOME/lib目錄下的類庫,ExtClassLoader加載JAVA_HOME/lib/ext目錄下的類庫,AppClassLoader加載classpath指向目錄下的類庫。  

Java的類加載器使用雙親委派模型,除了頂層的Bootstrap類加載器外,其余的類加載器都有父類加載器,當(dāng)一個類加載器要加載一個類時,它不會直接去加載,而是委托父類加載器嘗試加載,父類加載器如果無法完成,則繼續(xù)委托其父類加載器加載,如果在期間有某一個類加載器發(fā)現(xiàn)已經(jīng)加載過這個類,則會將已經(jīng)加載的類返回,子類不再加載。若所有的類加載器都未加載過這個類,那么最開始嘗試加載的加載器才會去加載這個類。使用這樣的加載機(jī)制的好處是: 對于同一個類,如: java.lang.String,能保證整個程序中都是使用的這一個類,否則如果用戶在自己的項目中也寫了一個java.lang.String類,那么項目中將存在兩個String類,一個是java提供的String類,一個是用戶自定義的String類,不僅使項目變得混亂,而且不安全。

8. MyBatis和Hibernate各有什么優(yōu)缺點(diǎn)?

我個人因?yàn)橹缓唵谓佑|過而沒有實(shí)際應(yīng)用過Hibernate,所以沒能從比較好的角度來回答這個問題。

Hibernate的優(yōu)點(diǎn)是它是一個完全的ORM框架,使用Hibernate可以做到不用手寫SQL,而且無須關(guān)心使用何種數(shù)據(jù)庫,可移植性較好,當(dāng)需要更變數(shù)據(jù)庫時需要做的修改很少甚至為0。其缺點(diǎn)是需要根據(jù)數(shù)據(jù)庫的設(shè)計在實(shí)體進(jìn)行又一次的配置,且?guī)统绦騿T做了太多事,如果需要進(jìn)行調(diào)優(yōu)的話需要對Hibernate有比較深的了解。  
MyBatis的優(yōu)缺點(diǎn)差不多和Hibernate相反,我們需要手寫SQL語句和配置結(jié)果集和實(shí)體類的映射,即使是簡單的單表操作也需要寫SQL(可以通過攔截器來實(shí)現(xiàn)CommonMapper,或者可以使用生成器來生成代碼),因此MyBatis要進(jìn)行SQL調(diào)優(yōu)也簡單直接。其次是MyBatis二級緩存功能較弱,是針對namespace的。
9. MySQL平時是怎么分析效率和進(jìn)行SQL優(yōu)化的?

較常使用的方法是explain SQL查看執(zhí)行計劃,根據(jù)查詢計劃可以知道是否使用了索引,是否進(jìn)行來全表掃描以及查詢的順序,依此我們可以建立適當(dāng)?shù)乃饕瓦B接查詢調(diào)優(yōu)。
還有一個是開啟慢查詢記錄執(zhí)行時間長的SQL語句。

通常會在WHERE、JOIN ONORDER BY使用到字段上加上索引。

避免查詢時判斷NULL,否則可能會導(dǎo)致全表掃描。

避免使用OR來連接查詢條件,否則可能導(dǎo)致全表掃描,可以改用UNIONUNION ALL

避免LIKE查詢,否則可能導(dǎo)致全表掃描。

不使用SELECT *,只查詢必須的字段,避免加載無用數(shù)據(jù)。

能用UNION ALL的時候就不用UNION,UNION過濾重復(fù)數(shù)據(jù)要耗費(fèi)更多的cpu資源。

10. MySQL除了InnoDB還有哪些引擎,有什么區(qū)別?
因?yàn)槠綍r都是用的InnoDB,對其它引擎的了解甚少,所以這個問題沒答上= =,這里直接貼一個鏈接好了。  
相關(guān)鏈接: MySQL存儲引擎介紹
11. 如何動態(tài)改變頁面上的元素?

使用$(..).css({..})來改變元素的樣式。

使用$(..).attr(..)改變元素的屬性。

使用$(..).html(..)改變元素的html內(nèi)容。

使用$(..).text(..)改變元素的文本內(nèi)容。

使用$(..).remove(..)刪除元素。

使用$(..).append(..)添加元素。

12. 分頁的實(shí)現(xiàn)。
如果是使用JSP等后端模板的話,一般會將需要分頁的JSP代碼抽成一個多帶帶的JSP文件,并在頁面中動態(tài)計算分頁按鈕的展示方式,在母頁中includeJSP文件,然后在前端點(diǎn)擊分頁按鈕時,通過AJAX請求下一頁的內(nèi)容,服務(wù)器端將渲染后的HTML返回給前端,前端通過$(..).html()等方式替換展示內(nèi)容。  
如果是在前后端分離的項目中,一般會使用一些前端的框架,如: React.jsVue.js等,每次只向后臺請求分頁的數(shù)據(jù),一般數(shù)據(jù)交互格式使用JSON,并替換已有的數(shù)據(jù),觸發(fā)頁面內(nèi)容的改變。
13. 解釋一下RESTful,平時是怎么用的

RESTful是無狀態(tài)的,采用URL+HTTP請求方法來描述資源行為
一般在前后端分離的項目中,后端會提供REST接口給前端,其HTTP請求方法一般為:

GET : 獲取資源。

POST: 更新資源。

PUT: 創(chuàng)建資源。

DELETE: 刪除資源。

其次,RESTful由于是無狀態(tài)的,一般會采用JWTOAuth的方式來認(rèn)證一個用戶,Token是保存在前端的,為了安全性一般會配合HTTPS使用。

14. 有沒有抓過包?GET和POST格式是怎么樣的?
HTTP請求分為三部分: 請求行請求頭、請求體:   
請求行: 第一行是METHOD URL protocal,如GET http://abc.com HTTP/1.1。
請求頭: 從第二行開始,每一行的內(nèi)容都是一個請求頭參數(shù)值,直到遇到一個空行為止。
請求體: 請求頭和請求體中間隔著一行空行作為分界,請求體包含著本次請求攜帶的內(nèi)容。
GET方式的請求沒有請求體,其是將參數(shù)追加到URL后面,URL?后面的內(nèi)容為請求參數(shù)。
POST方式則三部分都有,且POST的請求頭應(yīng)當(dāng)包含Content-Type來指明請求體中內(nèi)容的類型。
15. 如果是上傳文件的話又是怎樣的?后端如何處理?
上傳文件的話會設(shè)置Content-Typemultipart/form-data,并指定boundary的值來標(biāo)識請求體中內(nèi)容的分界,而在請求體中,不同的內(nèi)容(如:文件A和文件B)之間使用boundary的值來標(biāo)識分界,并且請求體中每部分內(nèi)容都會有Content-DispositionContent-Type來指明這部分內(nèi)容的類型和信息。

后端的話使用ServletFileUpload來解析請求,獲得FileItemList,遍歷Item,然后通過Item獲得輸入流,從輸入流中讀取上傳文件的數(shù)據(jù),再構(gòu)建FileOutputStream輸出到磁盤中保存。
如果使用Spring MVC,則可以在接收請求的方法中接收CommonsMultipartFile,并使用transferTo方法保存到磁盤中。

16. AJAX實(shí)現(xiàn)原理。

這個也沒答上來,平時都是使用jQuery封裝的AJAX或者其他AJAX框架。

AJAX是利用瀏覽器的AJAX引擎來實(shí)現(xiàn)的異步請求,通過XMLHttpRequest對象來發(fā)送請求,由AJAX引擎向服務(wù)器發(fā)送和接收響應(yīng),再回調(diào)給用戶處理,達(dá)到不阻塞用戶界面和無刷新的目的。  
資料來源: AJAX工作原理及其優(yōu)缺點(diǎn)。
17. Linux下怎么查找一個文件?
如果是查找二進(jìn)制文件,可以使用whereis。  
如果是查找命令,可以使用which。
如果是其他文件,可以使用find命令(其實(shí)什么都可以找), -name指定搜索的名稱或者匹配串, -maxdepth指定搜索的深度。
也可以使用locate命令查找,但是最新變動的文件可能會找不到,因?yàn)樵撁顚?shí)際上是搜索數(shù)據(jù)庫,該數(shù)據(jù)庫每天自動更新,可以手動執(zhí)行updatedb更新。
18. Linux怎么查找一個進(jìn)程?
使用ps命令可以查看進(jìn)程狀態(tài),ps -ef查看所有進(jìn)程,配合grep命令可以進(jìn)行篩選, 如查看tomcat進(jìn)程的命令是: ps -ef | grep tomcat。
19. Linux下只知道文件所在目錄和內(nèi)容,如何查找文件?

這題沒也沒答上= =

使用grep命令可以實(shí)現(xiàn):  
grep -rn /path/to/target/dir -e "pattern"
-r: 遞歸
-n: 顯示行數(shù)
-w: 完全匹配
例子: grep -rn. -e "ERROR"
輸出: ./面試:143:輸出: ./面試:144:上面的命令搜索當(dāng)前目錄及其子目錄中的文件,并輸出含有ERROR內(nèi)容的行
詳細(xì)答案及來源:How to find all files containing specific text on Linux?
20. Redis你用它來做什么?

Redis在我接觸過的項目中主要做了兩件事:

緩存

存儲需要計算的信息。

Redis也可以用來做消息訂閱隊列等。

21. Redis如果運(yùn)行過程中崩潰了怎么辦。

這個問題我估摸著面試官想問的是Redis的數(shù)據(jù)保障的方法,不然崩潰了除了重啟還能怎么辦?

Redis有提供數(shù)據(jù)持久化的功能,一種是快照,一種是AOF。  
快照是在某一個時間點(diǎn)將所有數(shù)據(jù)寫入到磁盤中,AOF是將被執(zhí)行的命令復(fù)制到硬盤中,快照的文件體積要比AOF的文件體積小。前者在恢復(fù)時速度比后者快,但是因?yàn)槭?b>間隔持久化,所以會有一定量的數(shù)據(jù)丟失。后者因?yàn)槭?b>實(shí)時寫入的,所以數(shù)據(jù)的完整性比較好,如果丟失的話一般也就丟失一秒的數(shù)據(jù)。

其次需要做主從復(fù)制,這樣一份數(shù)據(jù)可以保存在多臺服務(wù)器上,且可以避免Redis崩潰到重啟完成這段時間內(nèi)無法提供正常服務(wù),同時從服務(wù)器可以分擔(dān)主服務(wù)器的讀壓力。

22. Redis集群。

沒配置過所以沒答上= =

相關(guān)連接: Redis集群教程。
23. 剩下的問題都是偏向個人的,沒有什么通用性的回答,大概問了我:

前一家公司實(shí)習(xí)的時候主要做什么?

講一下做過的項目?

項目中有沒有遇到什么難點(diǎn)?怎么解決的?

有沒有做過什么有亮點(diǎn)的東西?

其中在問題3根據(jù)我的回答,繼續(xù)將情況復(fù)雜化讓我給出解決方案,一步一步問。

最后

最后. 如果不是熟悉的技術(shù)真的不要往簡歷上寫= = 我因?yàn)樵陧椖啃枰?,學(xué)習(xí)過Android,但是項目完成后就
沒碰過了(近一年),把對Android有一定的了解寫上簡歷,結(jié)果問了三個問題就答不上了= =

雖然最終拿到了offer,但是因?yàn)楦鞣矫嬖?,最后還是放棄了,在此也提醒一下,秋招千萬不要錯過= =,拖到這個時候,好的實(shí)習(xí)的真不好找(成都)。

學(xué)習(xí)技術(shù)不能知其然而不知其所以然,日后不僅會持續(xù)更新面試內(nèi)容,同時本專欄會持續(xù)發(fā)布Java、數(shù)據(jù)庫、Linux、算法等方面的學(xué)習(xí)文章。歡迎關(guān)注。

最后,如有錯誤或不適合的,請大家評論點(diǎn)出,共同進(jìn)步,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65202.html

相關(guān)文章

  • 可能遇到假的面試:不用call和apply方法模擬實(shí)現(xiàn)ES5的bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    李世贊 評論0 收藏0
  • 可能遇到假的面試:不用call和apply方法模擬實(shí)現(xiàn)ES5的bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    ConardLi 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實(shí)習(xí)和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    sunnyxd 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實(shí)習(xí)和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    jeyhan 評論0 收藏0

發(fā)表評論

0條評論

Batkid

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<