摘要:可能會持有相同的值對象但鍵對象必須是唯一的。當(dāng)有新任務(wù)到達(dá)時(shí),線程池沒有線程則創(chuàng)建線程處理,處理完成后該線程緩存秒,過期后回收,線程過期前有新任務(wù)到達(dá)時(shí),則使用緩存的線程來處理。解決死鎖問題的三種方法預(yù)防死鎖檢測死鎖及避免死鎖。
最近辭職準(zhǔn)備面試,順便整理一下面試題分享給大家,如有錯(cuò)誤歡迎指出
01. 你對面向?qū)ο笏枷氲睦斫猓?/strong>
面向?qū)ο缶幊毯喎QOOP,是開發(fā)程序的一種方法、思想。
面向過程編程中常常會導(dǎo)致所有的代碼都在一起,難以閱讀和維護(hù),牽一動百。而OOP,使用許多代碼模塊,每個(gè)模塊都只提供特定的功能,彼此獨(dú)立,可以增加代碼重用幾率,更加有利于軟件的開發(fā)、維護(hù)和升級。
另外OOP的三大核心特性:繼承、封裝、多態(tài) 的特性,使得程序員能夠設(shè)計(jì)出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活、易擴(kuò)展,成本較低
02. 很多程序員都知道多態(tài),但大都知其然不知其所以然,說說你對多態(tài)的理解
一個(gè)引用變量倒底會指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定。
因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性
多態(tài)的優(yōu)點(diǎn):解耦、靈活、可擴(kuò)展性強(qiáng)
多態(tài)存在的三個(gè)必要條件:繼承、重寫、父類引用指向子類對象
03. Collection集合有什么子類
List
1.可以允許重復(fù)的對象。
2.可以插入多個(gè)null元素。
3.有序,保持元素的插入順序
4.常用的實(shí)現(xiàn)類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對于經(jīng)常需要從 List 中添加或刪除元素的場合更為合適。
Set
1.不允許重復(fù)對象
2.無序
3.只允許一個(gè) null 元素
4.Set 接口最流行的幾個(gè)實(shí)現(xiàn)類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 實(shí)現(xiàn)的 HashSet;TreeSet 還實(shí)現(xiàn)了 SortedSet 接口。
Map
1.Map不是collection的子接口或者實(shí)現(xiàn)類。Map是一個(gè)接口。
2.Map 可能會持有相同的值對象但鍵對象必須是唯一的。
3.TreeMap 也通過 Comparator 或者 Comparable 維護(hù)了一個(gè)排序順序。
4.Map 里你可以擁有隨意個(gè) null 值但最多只能有一個(gè) null 鍵。
Map 接口最流行的幾個(gè)實(shí)現(xiàn)類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
04. list,set,map的使用場景
1.如果你經(jīng)常會使用索引來對容器中的元素進(jìn)行訪問,那么 List 是你的正確的選擇。如果你已經(jīng)知道索引了的話,那么 List 的實(shí)現(xiàn)類比如 ArrayList 可以提供更快速的訪問,如果經(jīng)常添加刪除元素的,那么肯定要選擇LinkedList。
2.如果你想容器中的元素能夠按照它們插入的次序進(jìn)行有序存儲,那么還是 List,因?yàn)?List 是一個(gè)有序容器,它按照插入順序進(jìn)行存儲。
3.如果你想保證插入元素的唯一性,也就是你不想有重復(fù)值的出現(xiàn),那么可以選擇一個(gè) Set 的實(shí)現(xiàn)類,比如 HashSet、LinkedHashSet 或者 TreeSet。
4.如果你以鍵和值的形式進(jìn)行數(shù)據(jù)存儲那么 Map 是你正確的選擇。你可以根據(jù)你的后續(xù)需要從 Hashtable、HashMap、TreeMap 中進(jìn)行選擇。
05. ArrayList和HashMap的比較
使用場景:如果需要快速隨機(jī)訪問元素,應(yīng)該使用ArrayList。需要鍵值對形式的數(shù)據(jù)時(shí),應(yīng)該使用HashMap
相同點(diǎn):
1)都是線程不安全,不同步 2)都可以儲存null值 3)獲取元素個(gè)數(shù)方法一樣,都用size()方法獲取
區(qū)別:
1)實(shí)現(xiàn)的接口 ArrayList實(shí)現(xiàn)了List接口(Collection(接口)->List(接口)->ArrayList(類)),底層使用的是數(shù)組;而HashMap現(xiàn)了Map接口(Map(接口)->HashMap(類)),底層使用的是Hash算法存儲數(shù)據(jù)。 2)存儲元素 ArrayList以數(shù)組的方式存儲數(shù)據(jù),里面的元素是有順序,可以重復(fù)的;而HashMap將數(shù)據(jù)以鍵值對的方式存儲,鍵的哈希碼(hashCode)不可以相同,相同后面的值會將前面的值覆蓋,值可以重復(fù),里面的元素?zé)o序。 3)添加元素的方法 ArrayList用add(Object object)方法添加元素,而HashMap用put(Object key, Object value)添加元素。 4)默認(rèn)的大小和擴(kuò)容 在 Java 7 中,ArrayList的默認(rèn)大小是 10 個(gè)元素,HashMap 的默認(rèn)大小是16個(gè)元素(必須是2的冪)。
06. 多線程創(chuàng)建方式有哪幾種(具體創(chuàng)建過程是什么)
1.繼承thread 類,重寫run方法,然后new Thread().start啟動線程,也可以直接匿名內(nèi)部類的方式創(chuàng)建
new Thread(
public void run(){ };
).start;
在里邊寫run方法的實(shí)現(xiàn)
2.實(shí)現(xiàn)runnable接口,重寫run方法
3.實(shí)現(xiàn)callable接口(一般很少用)
07. 多線程的常見應(yīng)用場景:
1、后臺定時(shí)任務(wù),例如:定時(shí)向大量(100w以上)的用戶發(fā)送郵件;
2、異步處理,例如:發(fā)微博、記錄日志等;
3、分布式計(jì)算消息隊(duì)列
08. 線程有哪幾種狀態(tài)
1.創(chuàng)建狀態(tài) 剛被new Thread()
2.就緒狀態(tài) 準(zhǔn)備好了run方法,等待cpu
3.運(yùn)行狀態(tài) running
4.阻塞狀態(tài)(包括sleep、wait(notify)、suspend(resume)、以及沒搶到鎖)
5.死亡狀態(tài)
09. 線程池初始化時(shí)有哪些參數(shù)可以設(shè)置
一般tomcat線程池不用自己配,自己寫線程池的話是需要自己配置參數(shù)的
那 線程初始化時(shí)設(shè)置參數(shù)的格式是:
private static final int corePoolSize = xxx;
創(chuàng)建線程池對象時(shí),將配置的各種參數(shù)用逗號連接傳參進(jìn)去。
ThreadPoolExecutor mExecute = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, rejectHandler
);
各個(gè)參數(shù)代表的意義:
corePoolSize:線程池的核心線程數(shù)。在沒有設(shè)置 allowCoreThreadTimeOut 為 true 的情況下,核心線程會在線程池中一直存活,即使處于閑置狀態(tài)。 maximumPoolSize:線程池所能容納的最大線程數(shù)。大于這個(gè)數(shù)調(diào)用任務(wù)拒絕handler keepAliveTime:非核心線程閑置時(shí)的超時(shí)時(shí)長。超過該時(shí)長,非核心線程就會被回收。 unit:keepAliveTime 時(shí)長對應(yīng)的單位。 workQueue:線程池中的任務(wù)隊(duì)列,當(dāng)有提交的任務(wù)暫時(shí)沒有足夠的線程去執(zhí)行的時(shí)候,就會進(jìn)入workQueue等待 rejectHandler:拒絕策略,當(dāng)線程池中線程數(shù)大于maximumPoolSize,且任務(wù)隊(duì)列也排滿了,如何拒絕任務(wù)。 JDK給我們內(nèi)置了四種拒絕策略:直接拋出異常、丟棄最老的一個(gè)任務(wù)然后重新提交當(dāng)前任務(wù)、放棄無法執(zhí)行的任務(wù),然后當(dāng)做無事發(fā)生、還有一種沒看懂就不寫出來了
10. 線程池的種類(4種)區(qū)別和使用場景
首先,不同線程池之間的區(qū)別就是他們新建時(shí)傳入的參數(shù)值不一樣(新建方法是一樣的)
1.newFixedThreadPool,線程數(shù)量固定的線程池,線程池的corePoolSize和maximumPoolSize大小一樣,并且keepAliveTime為0,傳入的隊(duì)列LinkedBlockingQueue為無界隊(duì)列
2.newSingleThreadExecutor,單線程池,corePoolSize和maximumPoolSize都是1,keepAliveTime是0
3.newCachedThreadPool,可緩存線程池,說到緩存一般離不開過期時(shí)間,該線程池也是,corePoolSize設(shè)置為0,maximumPoolSize設(shè)置為int最大值,不同的是,線程池傳入的隊(duì)列是SynchronousQueue,一個(gè)同步隊(duì)列,該隊(duì)列沒有任何容量,每次插入新數(shù)據(jù),必須等待消費(fèi)完成。當(dāng)有新任務(wù)到達(dá)時(shí),線程池沒有線程則創(chuàng)建線程處理,處理完成后該線程緩存60秒,過期后回收,線程過期前有新任務(wù)到達(dá)時(shí),則使用緩存的線程來處理。
4.newScheduledThreadPool,這個(gè)線程池使用了ScheduledThreadPoolExecutor,該線程池繼承自ThreadPoolExecutor, 執(zhí)行任務(wù)的時(shí)候可以指定延遲多少時(shí)間執(zhí)行,或者周期性執(zhí)行。
11. ==和equals有什么區(qū)別?
對基本數(shù)據(jù)類型 ==比較的是值,引用類型 ==比較的是地址 equals比較的大多是地址,但是String和Integer對其進(jìn)行了重寫,所以比較的是值
12. Thread類中的start()和run()方法有什么區(qū)別
start啟動線程,run方法只是thread的一個(gè)普通方法,就算調(diào)用了也還是在主線程里執(zhí)行
同步有幾種實(shí)現(xiàn)方法?
同步的實(shí)現(xiàn)方面有兩種,使用synchronized同步鎖、volatile關(guān)鍵字、lock鎖對象的lock()和unlock()方法
volatile關(guān)鍵字
Java 語言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”
鎖提供了兩種主要特性:互斥(mutual exclusion) 和可見性(visibility)。
互斥指一個(gè)線程拿到了鎖,其他線程就必須等待完成。
可見性要表示一個(gè)線程改完了一個(gè)公共數(shù)據(jù)(實(shí)際上是先改自己的緩存數(shù)據(jù),然后同步到公共數(shù)據(jù)上,然后另外的線程看到公共數(shù)據(jù)變了,將變換的值同步到自己的緩存,這個(gè)過程有好幾部,所以會有線程安全問題),必須要保證其他線程知道數(shù)據(jù)改變了
使用 volatile 變量的主要原因用法簡單,在公共數(shù)據(jù)上加一個(gè)volatile關(guān)鍵字就行,其次是性能優(yōu)于sychronize同步鎖
線程產(chǎn)生死鎖的原因和解決辦法:
什么是死鎖:打個(gè)比方,假設(shè)有P1和P2兩個(gè)進(jìn)程,都需要A和B兩個(gè)資源,現(xiàn)在P1持有A等待B資源,而P2持有B等待A資源,兩個(gè)都等待另一個(gè)資源而不肯釋放資源,就這樣無限等待中,這就形成死鎖
定義:如果一組進(jìn)程中每一個(gè)進(jìn)程都在等待僅由該組進(jìn)程中的其他進(jìn)程才能引發(fā)的事件,那么該組進(jìn)程是死鎖的。
產(chǎn)生死鎖原因:一種原因是系統(tǒng)提供的資源太少了,遠(yuǎn)不能滿足并發(fā)進(jìn)程對資源的需求。這種競爭資源引起的死鎖是我們要討論的核心;
另一種原因是由于進(jìn)程推進(jìn)順序不合適引發(fā)的死鎖。資源少也未必一定產(chǎn)生死鎖。就如同兩個(gè)人過獨(dú)木橋,如果兩個(gè)人都要先過,在獨(dú)木橋上僵持不肯后退,必然會應(yīng)競爭資源產(chǎn)生死鎖;但是,如果兩個(gè)人上橋前先看一看有無對方的人在橋上,當(dāng)無對方的人在橋上時(shí)自己才上橋,那麼問題就解決了。所以,如果程序設(shè)計(jì)得不合理,造成進(jìn)程推進(jìn)的順序不當(dāng),也會出現(xiàn)死鎖。
解決死鎖問題的三種方法:預(yù)防死鎖、檢測死鎖及避免死鎖。
解決辦法:預(yù)防死鎖的發(fā)生往往需要很大的系統(tǒng)開銷,而且不能充分利用資源,為此,一種簡便的方法是系統(tǒng)為進(jìn)程分配資源時(shí),不采取任何限制性措施,但是提供了檢測和解脫死鎖的手段
核心思想:打破線程間的相互等待狀態(tài),比如
1.找到相互等待的線程的spid,kill掉
2.使用sql server 內(nèi)部的鎖監(jiān)視器線程執(zhí)行死鎖檢查,當(dāng)檢測到死鎖時(shí),回滾事務(wù)以及該事務(wù)持有的鎖,使得其他線程得以正常運(yùn)行
多線程有幾種實(shí)現(xiàn)方法?
多線程有三種實(shí)現(xiàn)方法,分別是繼承Thread類、實(shí)現(xiàn)Runnable接口、實(shí)現(xiàn)Callable接口
Callable和Runnable的區(qū)別是什么
(1)Callable規(guī)定的方法是call(),Runnable規(guī)定的方法是run().
(2)Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值得
(3)call方法可以拋出異常,run方法不可以
(4)運(yùn)行Callable任務(wù)可以拿到一個(gè)Future對象,F(xiàn)uture 表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并獲取計(jì)算的結(jié)果。計(jì)算完成后只能使用 get 方法來獲取結(jié)果,如果線程沒有執(zhí)行完,F(xiàn)uture.get()方法可能會阻塞當(dāng)前線程的執(zhí)行;如果線程出現(xiàn)異常,F(xiàn)uture.get()會throws InterruptedException或者ExecutionException;如果線程已經(jīng)取消,會跑出CancellationException。取消由cancel 方法來執(zhí)行。isDone確定任務(wù)是正常完成還是被取消了。一旦計(jì)算完成,就不能再取消計(jì)算。如果為了可取消性而使用 Future 但又不提供可用的結(jié)果,則可以聲明Future> 形式類型、并返回 null 作為底層任務(wù)的結(jié)果。
IO流,了解常見的幾個(gè)流對象以及基本的流操作即可
數(shù)組集合
什么是連接池,為什么使用連接池
什么是接口隔離?
接口跟抽象類的區(qū)別?
hashcode和equal的區(qū)別
hashmap和hashtable的區(qū)別是什么?
hashmap實(shí)現(xiàn)原理,擴(kuò)容因子過大過小的缺點(diǎn),擴(kuò)容過程
ArrayList和linkenList的區(qū)別?
java地址和值傳遞的例子
值傳遞:只傳遞值,各是各的
引用傳遞:傳遞地址,共同操作這個(gè)值
Linux常用命令列舉10個(gè)
ls/ll 顯示文件夾下所有文件/詳細(xì)顯示
pwd 查看當(dāng)前目錄的絕對路徑
cd 切換目錄
ps 查看進(jìn)程
kill 殺死進(jìn)程
mv 移動文件
mkdir 創(chuàng)建文件夾
rmdir 刪除文件夾
touch 創(chuàng)建文件
tar zxvf 解壓
date 顯示日期
cal 顯示日歷
vi 用vim編輯文件
clear 清屏
synchronized實(shí)現(xiàn)原理
synchronizated和lock差別?
java Nio
是否可以繼承String類?
String類是final類故不可以繼承。
幾種線程暫停
a. wait():使一個(gè)線程處于等待狀態(tài),并且釋放持有的鎖
b. sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),時(shí)間過了自動會醒,所以不釋放鎖
c. notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確
切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級。
d. allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對象的鎖,而是讓它們競爭。
啟動一個(gè)線程是用run()還是start()?
啟動一個(gè)線程是調(diào)用start()方法,使線程就緒狀態(tài),以后可以被調(diào)度為運(yùn)行狀態(tài),一個(gè)線程必須關(guān)聯(lián)一些具體的執(zhí)行代碼,run()方法是該線程所關(guān)聯(lián)的執(zhí)行代碼。
SOCKET套接字中有幾中連接方式,各有什么區(qū)別?
Sockets有兩種主要的操作方式:面向連接(TCP/IP)的和無連接(UDP)的。無連接的操作使用數(shù)據(jù)報(bào)協(xié)議,無連接的操作是快速的和高效的,但是數(shù)據(jù)安全性不佳. 面向連接的操作使用TCP協(xié)議.面向連接的操作比無連接的操作效率更低,但是數(shù)據(jù)的安全性更高
sleep()和wait()區(qū)別
sleep() 方法:線程主動放棄CPU,使得線程在指定的時(shí)間內(nèi)進(jìn)入阻塞狀態(tài),不能得到CPU 時(shí)間,指定的時(shí)間一過,線程重新進(jìn)入可執(zhí)行狀態(tài)。典型地,sleep() 被用在等待某個(gè)資源就緒的情形:測試發(fā)現(xiàn)條件不滿足后,讓線程阻塞一段時(shí)間后重新測試,直到條件滿足為止。
wait( ) :與notify()配套使用,wait()使得線程進(jìn)入阻塞狀態(tài),它有兩種形式,一種允許指定以毫秒為單位的一段時(shí)間作為參數(shù),另一種沒有參數(shù),當(dāng)指定時(shí)間參數(shù)時(shí)對應(yīng)的 notify() 被調(diào)用或者超出指定時(shí)間時(shí)線程重新進(jìn)入可執(zhí)行狀態(tài),后者則必須對應(yīng)的 notify() 被調(diào)用
hashCode方法的作用?
hashcode這個(gè)方法是用來鑒定2個(gè)對象是否相等的。hashcode方法一般用戶不會去調(diào)用,比如在hashmap中,由于key是不可以重復(fù)的,他在判斷key是不是重復(fù)的時(shí)候就判斷了hashcode這個(gè)方法,而且也用到了equals方法。這里不可以重復(fù)是說equals和hashcode只要有一個(gè)不等就可以了!所以簡單來講,hashcode相當(dāng)于是一個(gè)對象的編碼。我們一般在覆蓋equals的同時(shí)也要覆蓋hashcode,讓他們的邏輯一致。
簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點(diǎn):Lock能完成synchronized所實(shí)現(xiàn)的所有功能
主要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強(qiáng)大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。
Java字節(jié)碼的執(zhí)行有兩種方式:
1)即時(shí)編譯方式:解釋器先將字節(jié)編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼。 2)解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成java字節(jié) 碼程序的所有操作。
Java四種引用包括強(qiáng)引用,軟引用,弱引用,虛引用
2.獲取Class的方式有哪些
方式一:對象.getClass()
Student student = new Student();
student.getClass();
方式二:類名.Class
Student.Class
方式三:Class.forname("完整的類路徑.包名.類名")
3.int和Integer的區(qū)別
基礎(chǔ)答案:Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。
進(jìn)階答案:Ingeter將-128-127進(jìn)行緩存,因此
4.ArrayList和LinkedList的區(qū)別
1.ArrayList是實(shí)現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2.對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因?yàn)長inkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因?yàn)锳rrayList要移動數(shù)據(jù)。
5.==和equals的區(qū)別
1)對于==,比較的是值是否相等
如果作用于基本數(shù)據(jù)類型的變量,則直接比較其存儲的 “值”是否相等;
如果作用于引用類型的變量,則比較的是所指向的對象的地址
2)對于equals方法,注意:equals方法不能作用于基本數(shù)據(jù)類型的變量
如果沒有對equals方法進(jìn)行重寫,則比較的是引用類型的變量所指向的對象的地址;
諸如String、Date等類對equals方法進(jìn)行了重寫的話,比較的是所指向的對象的內(nèi)容。
6.override和overload的比較
重載Overload:在同一個(gè)類中,允許存在一個(gè)以上的同名函數(shù),只要他們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。
重載的特點(diǎn):與返回值類型無關(guān),只看參數(shù)列表。
重寫Override表示子類中的方法可以與父類中的某個(gè)方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實(shí)例對象調(diào)用這個(gè)方法時(shí),將調(diào)用子類中定義的方法,這相當(dāng)于把父類中定義的那個(gè)完全相同的方法給覆蓋掉了,這也是面向?qū)ο缶幊痰亩鄳B(tài)的一種表現(xiàn)。子類覆蓋父類方法時(shí)只能拋出父類的異?;蛘弋惓5淖宇惢蛘吒割惍惓5淖蛹?,因?yàn)樽宇惪梢越鉀Q父類的一些問題,但不能比父類有更多的問題。還有,子類方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private類型,則子類中根本不存在覆蓋,即子類中和父類的private的同名的方法沒有覆蓋的關(guān)系,因?yàn)閜rivate的訪問權(quán)限只限于同一類中,而子類就不會訪問到private的方法,所以是子類中增加的一個(gè)全新的方法
7.簡述servlet生命周期
(1)加載和實(shí)例化
當(dāng)Servlet容器啟動或客戶端發(fā)送一個(gè)請求時(shí),Servlet容器會查找內(nèi)存中是否存在該Servlet實(shí)例,若存在,則直接讀取該實(shí)例響應(yīng)請求;如果不存在,就創(chuàng)建一個(gè)Servlet實(shí)例。
(2) 初始化
實(shí)例化后,Servlet容器將調(diào)用Servlet的init()方法進(jìn)行初始化(一些準(zhǔn)備工作或資源預(yù)加載工作)。
(3)服務(wù)
初始化后,Servlet處于能響應(yīng)請求的就緒狀態(tài)。當(dāng)接收到客戶端請求時(shí),調(diào)用service()的方法處理客戶端請求,HttpServlet的service()方法會根據(jù)不同的請求 轉(zhuǎn)調(diào)不同的doXxx()方法。
(4)銷毀
當(dāng)Servlet容器關(guān)閉時(shí),Servlet實(shí)例也隨時(shí)銷毀。其間,Servlet容器會調(diào)用Servlet 的destroy()方法去判斷該Servlet是否應(yīng)當(dāng)被釋放(或回收資源)。
9.farward和redirect區(qū)別
轉(zhuǎn)發(fā)(Forward),是一次請求,只有一個(gè)request,因此request域內(nèi)的數(shù)據(jù)可以共享。
重定向(Redirect)實(shí)際是兩次HTTP請求,服務(wù)器端在響應(yīng)第一次請求的時(shí)候,讓瀏覽器再向另外一個(gè)URL發(fā)出請求,從而達(dá)到轉(zhuǎn)發(fā)的目的。
10.final finally finalize區(qū)別
Java提供finalize()方法,垃圾回收器準(zhǔn)備釋放內(nèi)存的時(shí)候,會先調(diào)用finalize()。
11.樂觀鎖與悲觀鎖
悲觀鎖
總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時(shí)候都會上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會阻塞直到它拿到鎖 。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized 等獨(dú)占鎖就是悲觀鎖思想的實(shí)現(xiàn)。
樂觀鎖
總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會修改,所以不會上鎖,但是在更新的時(shí)候會判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號機(jī)制和CAS算法實(shí)現(xiàn)。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫提供的類似于write_condition機(jī)制,其實(shí)都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實(shí)現(xiàn)方式CAS實(shí)現(xiàn)的。
兩種鎖的使用場景
沖突真的很少發(fā)生的時(shí)候,用樂觀鎖就比較合適。
經(jīng)常產(chǎn)生沖突,用悲觀鎖就比較合適。
12.String、StringBuffer和StringBuilder的區(qū)別
在線程安全:StringBuilder是線程不安全的,而StringBuffer是線程安全的
運(yùn)行速度:StringBuilder > StringBuffer > String
13.char可以存儲漢字嗎為什么
char是按照字符存儲的,不管英文還是中文 占用占用2個(gè)字節(jié),用來儲存Unicode字符 unicode編碼字符集中包含了漢字,所以,char型變量中當(dāng)然可以存儲漢字啦。
15.簡述HashMap的實(shí)現(xiàn)原理
重寫HashMap需要重寫hashCode()和equals()方法
16.HashMap和HashTable的區(qū)別
線程不安全和線程不安全
鍵值可為null鍵值不可為null
前者快后者慢
我們能否讓HashMap同步?
HashMap可以通過下面的語句進(jìn)行同步:
Map m = Collections.synchronizeMap(hashMap);
18.a=a+b與a+=b的區(qū)別
舉例:a為int,b為float 則a = a + b 需要強(qiáng)制類型轉(zhuǎn)換,也就是我們常寫的 a = (int) (a+b);
而我們的a += b 被我們的編譯器在編譯期做了一些小手腳。也就是編譯器幫我們進(jìn)行了強(qiáng)制類型轉(zhuǎn)化。
& 和 &&的區(qū)別
&和&&都可以用作邏輯與的運(yùn)算符
&&還具有短路的功能
&還可以用作位運(yùn)算符
深拷貝和淺拷貝的區(qū)別
打個(gè)不太恰當(dāng)?shù)谋扔鳎阂粋€(gè)是復(fù)制一份新的 一個(gè)是弄了一個(gè)快捷方式
Java的八大基本數(shù)據(jù)類型是什么
byte short int long float double boolean char
進(jìn)程、線程和協(xié)程的區(qū)別
1) 一個(gè)線程可以多個(gè)協(xié)程,一個(gè)進(jìn)程也可以多帶帶擁有多個(gè)協(xié)程
2) 線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步
3) 協(xié)程能保留上一次調(diào)用時(shí)的狀態(tài),每次過程重入時(shí),就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài)
創(chuàng)建兩種線程的方式 他們有什么區(qū)別
1.繼承Thread類
2.實(shí)現(xiàn)Runnable接口
守護(hù)線程:守護(hù)線程則是用來服務(wù)用戶線程的,如果沒有其他用戶線程在運(yùn)行,那么就沒有可服務(wù)對象,守護(hù)線程就會退出。
Array(數(shù)組)和ArrayList(列表)有什么區(qū)別
1)精辟闡述:
可以將 ArrayList想象成一種“會自動擴(kuò)增容量的Array”。
2)Array([]):數(shù)組,最高效;但是其容量固定且無法動態(tài)改變;
ArrayList: 動態(tài)數(shù)組,容量可動態(tài)增長;但犧牲效率;
Runnable和Callable的區(qū)別
編寫多線程程序一般有三種方法,Thread,Runnable,Callable.
Runnable和Callable的區(qū)別是,
(1)Callable規(guī)定的方法是call(),Runnable規(guī)定的方法是run().
(2)Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值得
(3)call方法可以拋出異常,run方法不可以
(4)Runnable是自從java1.1就有了,而Callable是1.5之后才加上去的
wait(),notify()和suspend(),resume()之間的區(qū)別
wait(),notify()有兩種形式一種是傳入一個(gè)時(shí)間參數(shù),自動恢復(fù),一種是不傳參,不會自動恢復(fù),必須使用notify()方法
suspend(),resume():suspend()方法很容易引起死鎖問題,已經(jīng)不推薦使用了。
default,public,private,protected區(qū)別
tomcat調(diào)優(yōu)
聲明式事務(wù)
接口隔離
代碼塊、靜態(tài)代碼塊執(zhí)行順序
Java子父類間靜態(tài)代碼塊、非靜態(tài)代碼塊、構(gòu)造方法的執(zhí)行順序
子類A繼承父類B,A a=new A();
正確的執(zhí)行順序是:父類B靜態(tài)代碼塊->子類A靜態(tài)代碼塊->父類B非靜態(tài)代碼塊->父類B構(gòu)造函數(shù)->子類A非靜態(tài)代碼塊->子類A構(gòu)造函數(shù)
也就是說非靜態(tài)初始化塊的執(zhí)行順序要在構(gòu)造函數(shù)之前。
如何捕獲子線程異常
線程設(shè)計(jì)的理念:“線程的問題應(yīng)該線程自己本身來解決,而不要委托到外部。”
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74448.html
摘要:的長度為什么是的冪次方多線程并發(fā)相關(guān)問題必問創(chuàng)建線程的種方式。什么是線程安全。盡量少通過電話面試,效果不好。通過面試官可以大概判斷這家公司的情況。 最近3個(gè)月一口氣面了十幾家公司的Java開發(fā)崗,大大小小的面試筆試加起來快20場,收獲很多。本人畢業(yè)快2年了,畢業(yè)時(shí)在學(xué)校所在的2線省會城市找了家開發(fā)公司做java的開發(fā),前前后后做了1年半,感覺公司對技術(shù)沒有啥追求,做的項(xiàng)目翻來覆去就是S...
摘要:最近瀏覽,收藏了一些還算不錯(cuò)的面試學(xué)習(xí)相關(guān)的倉庫,分享給大家,希望對你有幫助。除了這九個(gè)倉庫,再推薦幾個(gè)不錯(cuò)的學(xué)習(xí)方向的倉庫給大家。數(shù)高達(dá)的筆記后端尤其是程序員的學(xué)習(xí)倉庫兩個(gè)算法相關(guān)的倉庫,刷的小伙伴必備 最近瀏覽 Github ,收藏了一些還算不錯(cuò)的 Java面試/學(xué)習(xí)相關(guān)的倉庫,分享給大家,希望對你有幫助。我暫且按照目前的 Star 數(shù)量來排序。 本文由 SnailClimb 整理...
摘要:我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以及面試,說實(shí)話,我個(gè)人覺得這些東西還挺重要的。在本文里,我將介紹我這段時(shí)間里更新簡歷和面試的相關(guān)經(jīng)歷。 分享一篇很不錯(cuò)的文章!本文作者曾經(jīng)寫過《Java Web輕量級開發(fā)面試教程》和 《Java核心技術(shù)及面試指南》這兩本書。我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以...
摘要:如何在線程池中提交線程內(nèi)存模型相關(guān)問題什么是的內(nèi)存模型,中各個(gè)線程是怎么彼此看到對方的變量的請談?wù)動惺裁刺攸c(diǎn),為什么它能保證變量對所有線程的可見性既然能夠保證線程間的變量可見性,是不是就意味著基于變量的運(yùn)算就是并發(fā)安全的請對比下對比的異同。 并發(fā)編程高級面試面試題 showImg(https://upload-images.jianshu.io/upload_images/133416...
閱讀 2914·2021-11-23 09:51
閱讀 1565·2021-11-15 11:36
閱讀 3022·2021-10-13 09:40
閱讀 1915·2021-09-28 09:35
閱讀 13101·2021-09-22 15:00
閱讀 1382·2019-08-29 13:56
閱讀 2936·2019-08-29 13:04
閱讀 2707·2019-08-28 18:06