1. java中wait和sleep有什么區(qū)別?多線程條件下如何保證數(shù)據(jù)安全?
答:最大區(qū)別是等待時(shí)wait會(huì)釋放鎖,而sleep會(huì)一直持有鎖,wait通常用于線程時(shí)交,互,sleep通常被用于暫停執(zhí)行。
2. java中volatile和synchronized有什么區(qū)別?
1.volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住。
2.volatile僅能使用在變量級(jí)別;synchronized則可以使用在變量、方法、和類級(jí)別的。
3.volatile僅能實(shí)現(xiàn)變量的修改可見性,并不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。
4.volatile不會(huì)造成線程的阻塞;synchronized可能會(huì)造成線程的阻塞。
5.volatile標(biāo)記的變量不會(huì)被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化。
3. 有了解java的原子類?實(shí)現(xiàn)原理是什么?
答:采用硬件提供原子操作指令實(shí)現(xiàn)的,即CAS。每次調(diào)用都會(huì)先判斷預(yù)期的值是否符合,才進(jìn)行寫操作,保證數(shù)據(jù)安全。
4. spring主要使用了哪些?IOC實(shí)現(xiàn)原理是什么?AOP實(shí)現(xiàn)原理是什么?
答:spring主要功能有IOC,AOP,MVC等,IOC實(shí)現(xiàn)原理:先反射生成實(shí)例,然后調(diào)用時(shí)主動(dòng)注入。AOP原理:主要使用java動(dòng)態(tài)代理,
5. mybatis有了解嗎?它與hibernate有什么區(qū)別?項(xiàng)目中,你會(huì)選哪個(gè)?
答:兩者都是輕量級(jí)ORM框架,hibernate實(shí)現(xiàn)功能比較多,通過HQL操作數(shù)據(jù)庫,比較簡單方便,但hibernate自動(dòng)生成的sql相長,不利測試和查找原因。復(fù)雜sql時(shí),編寫比較困難,同時(shí)性能也會(huì)降低。mybatis是半自動(dòng)化,手動(dòng)編寫SQL語句,同時(shí)提供豐富的參數(shù)判斷功能。sql語句較清晰,可以直接進(jìn)行測試,性能也較好,操作起來非常簡單。同時(shí)hibernate容易產(chǎn)生n+1問題。hibernate學(xué)習(xí)成本較mybatis高。國內(nèi)一些大公司基本上使用mybatis
6. 緩存框架有使用過哪些?memcache和redis有什么區(qū)別?項(xiàng)目中,怎么去選擇?
答:緩存有:ehcache,memcache和redis等
區(qū)別:
1、 Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過 memcache還可用于緩存其他東西,例如圖片、視頻等等。
2、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的 存儲(chǔ)。
3、虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒用到的value 交換到磁盤
4、過期策略--memcache在set時(shí)就指定,例如set key1 0 0 8,即永不過期。Redis可以通 過例如expire 設(shè)定,例如expire name 10
5、分布式--設(shè)定memcache集群,利用magent做一主多從;redis可以做一主多從。都 可以一主一從
6、存儲(chǔ)數(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ù)備份。
項(xiàng)目使用選擇:
redis是單線程實(shí)現(xiàn),若需要使用控制某些并發(fā)狀態(tài)時(shí),可以使用redis.項(xiàng)目中需要使用 復(fù)雜的list,set操作時(shí),同時(shí)可以對(duì)數(shù)據(jù)進(jìn)行持久化。
當(dāng)存儲(chǔ)數(shù)據(jù)較大時(shí),如100k以上,那memcache性能較好,在多核上,memcache較 好
7. 說說數(shù)據(jù)庫性能優(yōu)化有哪些方法?
答:使用explain進(jìn)行優(yōu)化,查看sql是否充分使用索引。避免使用in,用exist替代,字段值盡可能使用更小的值,任何對(duì)列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等號(hào)右邊。使用連接查詢(join)代替子查詢。
在表的多列字段上建立一個(gè)索引,但只有在查詢這些字段的第一個(gè)字段時(shí),索引才會(huì)被使用。
8. HTTP請(qǐng)求方法get和post有什么區(qū)別?
1:Post傳輸數(shù)據(jù)時(shí),不需要在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è)計(jì)告訴服務(wù)器,你到底需要什么樣的數(shù)據(jù).Post 的信息作為http請(qǐng)求的內(nèi)容,而Get是在Http頭部傳輸?shù)摹?/p>
9. linux命令熟悉?查看某個(gè)線程命令是什么?查看整個(gè)機(jī)器負(fù)載命令?文件內(nèi)容快速查找命令是什么?
查看線程:ps -ef|greptomcat
查看負(fù)載:top
文件內(nèi)容查找:vi /aa test.txt 或者先打開文件,再查找: vi test.txt /aa
10. JVM內(nèi)存模型是如何?垃圾回收機(jī)制有哪些?如何對(duì)JVM進(jìn)行調(diào)優(yōu)?
答:由棧和堆組成,棧是運(yùn)行時(shí)單位,堆內(nèi)存則分為年輕代、年老代、持久代等,年輕代中的對(duì)象經(jīng)過幾次的回收,仍然存在則被移到年老代;持久代主要是保存class,method,filed等對(duì)象。
sun回收機(jī)制:主要對(duì)年輕代和年老代中的存活對(duì)象進(jìn)行回收,分為以下:
年輕代串行(Serial Copying)、年輕代并行(ParNew)、年老代串行(SerialMSC),年老代并行(Parallel Mark Sweep),年老代并發(fā)(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最廣泛。
JVM調(diào)優(yōu)主要是對(duì)堆內(nèi)容和回收算法進(jìn)行配置,需要對(duì)jdk產(chǎn)生的回收日志進(jìn)行觀察,同時(shí)通過工具(Jconsole,jProfile,VisualVM)對(duì)堆內(nèi)存不斷分析,這些優(yōu)化是一個(gè)過程,需要不斷地進(jìn)行觀察和維護(hù)。
以上就是北大青鳥長沙麓谷校區(qū)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java三年經(jīng)驗(yàn)面試題總結(jié),值得參考”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級(jí)到高級(jí))
史上最全的中高級(jí)JAVA工程師面試題及答案匯總
Java高級(jí)開發(fā)工程師面試題
2019史上最全java面試題題庫大全800題
哪有資深java工程師面試題