三年Java經(jīng)驗面試總結(jié)

  1. Java中wait和sleep有什么區(qū)別?多線程條件下如何保證數(shù)據(jù)安全?

答:最大區(qū)別是等待時wait會釋放鎖,而sleep會一直持有鎖,wait通常用于線程時交,互,sleep通常被用于暫停執(zhí)行。

  1. Java中volatile和synchronized有什么區(qū)別?

1.volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀??;synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住。
2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。
3.volatile僅能實現(xiàn)變量的修改可見性,并不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。
4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。
5.volatile標(biāo)記的變量不會被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化。

  1. 有了解java的原子類?實現(xiàn)原理是什么?

    答:采用硬件提供原子操作指令實現(xiàn)的,即CAS。每次調(diào)用都會先判斷預(yù)期的值是否符合,才進(jìn)行寫操作,保證數(shù)據(jù)安全。

  2. Spring主要使用了哪些?IOC實現(xiàn)原理是什么?AOP實現(xiàn)原理是什么?

答:spring主要功能有IOC,AOP,MVC等,IOC實現(xiàn)原理:先反射生成實例,然后調(diào)用時主動注入。AOP原理:主要使用java動態(tài)代理,

  1. Mybatis有了解嗎?它與hibernate有什么區(qū)別?項目中,你會選哪個?

答:兩者都是輕量級ORM框架,hibernate實現(xiàn)功能比較多,通過HQL操作數(shù)據(jù)庫,比較簡單方便,但hibernate自動生成的sql相長,不利測試和查找原因。復(fù)雜sql時,編寫比較困難,同時性能也會降低。mybatis是半自動化,手動編寫SQL語句,同時提供豐富的參數(shù)判斷功能。sql語句較清晰,可以直接進(jìn)行測試,性能也較好,操作起來非常簡單。同時hibernate容易產(chǎn)生n+1問題。hibernate學(xué)習(xí)成本較mybatis高。國內(nèi)一些大公司基本上使用mybatis

  1. 緩存框架有使用過哪些?memcache和redis有什么區(qū)別?項目中,怎么去選擇?

    答:緩存有:ehcache,memcache和redis等
    區(qū)別:
    1、 Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過 memcache還可用于緩存其他東西,例如圖片、視頻等等。

    2、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的 存儲。

    3、虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時,可以將一些很久沒用到的value 交換到磁盤

    4、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通 過例如expire 設(shè)定,例如expire name 10

    5、分布式--設(shè)定memcache集群,利用magent做一主多從;redis可以做一主多從。都 可以一主一從

    6、存儲數(shù)據(jù)安全--memcache掛掉后,數(shù)據(jù)沒了;redis可以定期保存到磁盤(持久化)

    7、災(zāi)難恢復(fù)--memcache掛掉后,數(shù)據(jù)不可恢復(fù); redis數(shù)據(jù)丟失后可以通過aof恢復(fù)

    8、Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

    項目使用選擇:

    redis是單線程實現(xiàn),若需要使用控制某些并發(fā)狀態(tài)時,可以使用redis.項目中需要使用 復(fù)雜的list,set操作時,同時可以對數(shù)據(jù)進(jìn)行持久化。

    當(dāng)存儲數(shù)據(jù)較大時,如100k以上,那memcache性能較好,在多核上,memcache較 好

  2. 說說數(shù)據(jù)庫性能優(yōu)化有哪些方法?

    答:使用explain進(jìn)行優(yōu)化,查看sql是否充分使用索引。避免使用in,用exist替代,字段值盡可能使用更小的值,任何對列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫函數(shù)、計算表達(dá)式等等,查詢時要盡可能將操作移至等號右邊。使用連接查詢(join)代替子查詢。

在表的多列字段上建立一個索引,但只有在查詢這些字段的第一個字段時,索引才會被使用。

  1. HTTP請求方法get和post有什么區(qū)別?

    1:Post傳輸數(shù)據(jù)時,不需要在URL中顯示出來,而Get方法要在URL中顯示。

    2:Post傳輸?shù)臄?shù)據(jù)量大,可以達(dá)到2M,而Get方法由于受到URL長度限制,只能 傳遞大約1024字節(jié).

    3:Post就是為了將數(shù)據(jù)傳送到服務(wù)器段,Get就是為了從服務(wù)器段取得數(shù)據(jù).而Get 之所以也能傳送數(shù)據(jù),只是用來設(shè)計告訴服務(wù)器,你到底需要什么樣的數(shù)據(jù).Post 的信息作為http請求的內(nèi)容,而Get是在Http頭部傳輸?shù)摹?/p>

  2. Linux命令熟悉?查看某個線程命令是什么?查看整個機(jī)器負(fù)載命令?文件內(nèi)容快速查找命令是什么?

    查看線程:ps -ef|greptomcat

    查看負(fù)載:top

    文件內(nèi)容查找:vi /aa test.txt 或者先打開文件,再查找: vi test.txt /aa

  3. JVM內(nèi)存模型是如何?垃圾回收機(jī)制有哪些?如何對JVM進(jìn)行調(diào)優(yōu)?

    答:由棧和堆組成,棧是運(yùn)行時單位,堆內(nèi)存則分為年輕代、年老代、持久代等,年輕代中的對象經(jīng)過幾次的回收,仍然存在則被移到年老代;持久代主要是保存class,method,filed等對象。

sun回收機(jī)制:主要對年輕代和年老代中的存活對象進(jìn)行回收,分為以下:

年輕代串行(Serial Copying)、年輕代并行(ParNew)、年老代串行(SerialMSC),年老代并行(Parallel Mark Sweep),年老代并發(fā)(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最廣泛。

JVM調(diào)優(yōu)主要是對堆內(nèi)容和回收算法進(jìn)行配置,需要對jdk產(chǎn)生的回收日志進(jìn)行觀察,同時通過工具(Jconsole,jProfile,VisualVM)對堆內(nèi)存不斷分析,這些優(yōu)化是一個過程,需要不斷地進(jìn)行觀察和維護(hù)。

  1. 如銀行內(nèi)部轉(zhuǎn)賬功能,如何保證數(shù)據(jù)一致性,即要么同時成功,要么同時失敗?高并發(fā)時,又如何保證性能和數(shù)據(jù)正確?

    答:如果是單機(jī)內(nèi)完成這些操作,那使用數(shù)據(jù)庫的事務(wù),即可輕松實現(xiàn)。若是分布式呢?

  2. 有了解分布式事務(wù)如何實現(xiàn)?

    答:分布式事務(wù)可以采用分布式鎖進(jìn)行實現(xiàn),目前zookeeper就提供此鎖;分布式鎖需要犧牲一定性能去實現(xiàn),若業(yè)務(wù)支付最終一致性,那此方法是最佳方案。如在京東下訂單,過一會才會告訴你訂單審核通過,而不是馬上響應(yīng)訂單結(jié)果。

  3. java抽象類和接口有什么區(qū)別?項目中怎么去使用它們?

    相同點:

    A. 兩者都是抽象類,都不能實例化。

    B. interface實現(xiàn)類及abstractclass的子類都必須要實現(xiàn)已經(jīng)聲明的抽象方法。

    不同點:

    A. interface需要實現(xiàn),要用implements,而abstractclass需要繼承,要用extends。

    B. 一個類可以實現(xiàn)多個interface,但一個類只能繼承一個abstractclass。

    C. interface強(qiáng)調(diào)特定功能的實現(xiàn),而abstractclass強(qiáng)調(diào)所屬關(guān)系。

    D. 盡管interface實現(xiàn)類及abstrctclass的子類都必須要實現(xiàn)相應(yīng)的抽象方法,但實現(xiàn)的 形式不同。interface中的每一個方法都是抽象方法,都只是聲明的 (declaration, 沒有方 法體),實現(xiàn)類必須要實現(xiàn)。而abstractclass的子類可以有選擇地實現(xiàn)。

    使用:

    abstract:在既需要統(tǒng)一的接口,又需要實例變量或缺省的方法的情況下,使用abstract;

    interface:使用: 類與類之前需要特定的接口進(jìn)行協(xié)調(diào),而不在乎其如何實現(xiàn)。 作為能 夠?qū)崿F(xiàn)特定功能的標(biāo)識存在,也可以是什么接口方法都沒有的純粹標(biāo)識。需要將一組類 視為單一的類,而調(diào)用者只通過接口來與這組類發(fā)生聯(lián)系。需要實現(xiàn)特定的多項功能, 而這些功能之間可能完全沒有任何聯(lián)系。

  4. 對socket熟悉?TCP通訊有幾次握手?有使用過哪些socket框架?

    答:3次握手,客戶端-->服務(wù)端,服務(wù)端-->客戶端,客戶端-->服務(wù)端,當(dāng)這些過程完成之后,才真正建立起通信。java中比較有名的socket框架有:mina,netty,都是韓國小棒子寫的。

  5. 了解java反射機(jī)制?反射生成類,能訪問私有變量?

    答:即動態(tài)生成java的實例,可以

  6. RPC是什么?有使用過哪些RPC框架?

    答:即遠(yuǎn)程進(jìn)程調(diào)用,本地機(jī)器調(diào)用遠(yuǎn)程的服務(wù),在項目規(guī)模大到一定程度,需要使用RPC相關(guān)框架進(jìn)行服務(wù)化部署。如:hessian 、webservice等

  7. 熟悉js或css?jquery如何綁定頁面某元素的點擊事件?

答:

$("#btn").click(function(){

})

作者:Crazy曉楓
來源:CSDN
原文:https://blog.csdn.net/u010664947/article/details/78518456
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容