整理的一些java基础知识点,欢迎补充指正
一、String能被繼承嗎?為什么?
?? ??? ?不能,String類final修飾,而final類不允許被繼承,亦不可修改,改變字符串的值時實質(zhì)上是新開辟了一份內(nèi)存空間,創(chuàng)建了一個新的字符串,字符串實質(zhì)上存儲在char[]類型的數(shù)組中,
二、int和Integer的區(qū)別
? ? 1:int是基本數(shù)據(jù)類型,Integer是包裝類型
? ? 2:int初始值為0,Integer初始值為null
? ? 3:int類型數(shù)據(jù)存儲在棧中,Integer類型數(shù)據(jù)在[-128,127]時存儲在常量池中,超過此范圍存儲在堆中
三、 String, StringBuffer, StringBuilder 的區(qū)別
?? ?? ? String是不可變的字符串,可以為null
?? ?? ? StringBuffer是可變字符串,效率低,線程安全,不可以為null
?? ?? ? StringBuilder是可變字符串,效率高,線程不安全,不可以為null
四、類的實例化順序
?? ??? ?父類靜態(tài)變量、靜態(tài)初始化塊、子類靜態(tài)變量、子類靜態(tài)初始化塊,父類非靜態(tài)變量(成員變量)、父類初始化塊、父類構(gòu)造函數(shù)、子類非靜態(tài)變量、子類初始化塊、子類構(gòu)造函數(shù)。
? ? 初始化塊為{}包含的代碼
靜態(tài)修飾的變量及方法只執(zhí)行一次,無需實例化亦可調(diào)用,可直接使用類名調(diào)用,甚至聲明一個類的對象為null時,亦可用對象調(diào)用
五、抽象類和接口的區(qū)別,類可以繼承多個類么,接口可以繼承多個接口么,類可以實現(xiàn)多個接口么
? ??
語法上:? ?
??? 抽象類可以有實現(xiàn)方法,也可以有抽象方法
? ? 接口java8后可以有實現(xiàn)方法,default的實現(xiàn)方法如果實現(xiàn)的兩個接口中有相同的實現(xiàn)方法,則實現(xiàn)類必須要重寫此方法 ?常量只允許有公共靜態(tài)常量
?? ?類可以繼承一個類,實現(xiàn)多個接口
? ? 接口可以繼承多個接口
作用上:
? ? 抽象類相當(dāng)于一個模板,有公共部分的定義,也允許繼承此類的子類有自己的實現(xiàn)
? ? ?接口相當(dāng)于一個規(guī)范
六、php和Java的區(qū)別
? ? 1:php是弱類型語言,Java是強類型語言
? ? 2:Java是面向?qū)ο缶幊痰恼Z言,需要編譯代碼,php是種服務(wù)器腳本語言,不需要編譯
? ? 3:Java對大小寫敏感,php僅對變量的大小寫敏感,而函數(shù),關(guān)鍵字,類等不敏感
? ? 4:Java使用的是其它的模板引擎,而php內(nèi)置模板引擎,自身就是模板語言
? ? 5:php中有關(guān)聯(lián)數(shù)組,類似于java的map
七、final, finally 和 finalize 的區(qū)別?
?? ?final 用于聲明屬性,方法和類,表示屬性不可變,方法不可被重寫,類不可被繼承。
?? ?finally 是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
?? ?finalize 是 object 類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用這個對象回收的方法,供垃圾收集時其他資源的回收,比如關(guān)閉文件。
?
八、Iterator 和 ListIterator 之間有什么區(qū)別?
? ? Iterator可以用來遍歷list和set,但是只能單向遍歷,ListIterator只能遍歷List,但是可以雙向遍歷,它繼承了Iterator接口,增加了一些自己的方法,比如增加,刪除元素。
?
九、創(chuàng)建線程的方式
?? ?1:繼承Thread類創(chuàng)建線程
?? ?2:實現(xiàn)Runnable接口創(chuàng)建線程
?? ?3:使用Callable和Future創(chuàng)建線程
?? ?4:使用線程池例如用Executor框架
十、wait()與 sleep()的區(qū)別
?? ?? ? sleep方法來自Thread類,wait方法來自O(shè)bject類,sleep方法不會釋放對象鎖,也就是睡眠后不會讓出系統(tǒng)資源,它需要制定一個睡眠時間,時間到達后自動喚醒;而wait方法需要需要被notify(),或notifyAll()喚醒
?
十一 、run()、start()、join()方法
?? ?? ? run只是線程類的一個普通方法,調(diào)用它并未開啟新的線程,只是在main主線程中繼續(xù)按順序執(zhí)行;
?? ?? ? start是真正的開啟了新的線程,線程之間具有并發(fā)性,因此它們的父線程可以比它們先結(jié)束;
?? ?? ? join方法是要求在子線程結(jié)束之后才能繼續(xù)執(zhí)行父線程
?
十二、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的區(qū)別?
?
?? ?? ? ThreadLocal是線程局部變量,它們的相同之處在與實現(xiàn)多線程中數(shù)據(jù)隔離
區(qū)別:線程局部變量中實現(xiàn)數(shù)據(jù)隔離的原因是被隔離的數(shù)據(jù)本身就是只需它去訪問,不允許其它數(shù)據(jù)訪問;而Synchonized是為了實現(xiàn)數(shù)據(jù)的順序訪問;代碼如下
package test;public class Test implements Runnable{private ThreadLocal<Integer> local =??new???ThreadLocal<Integer>() {??//定義每個窗口已經(jīng)賣出去的票,初始值為0public Integer initialValue() {return 1;}};//Integer count =10;private int count = 10;//總票數(shù)@Overridepublic synchronized void??run() {// TODO Auto-generated method stubwhile (count>0&&local.get()<=5) {System.out.println(Thread.currentThread().getName()+"賣出"+(count--)+"號票"+",已經(jīng)賣出去"+local.get()+"張票");local.set(local.get()+1);}}public static void main(String[] args) {// TODO Auto-generated method stubTest runnable = new Test();Thread thread1 = new???Thread(runnable,"*********窗口一");Thread thread2 = new Thread(runnable,"窗口二");thread1.start();thread2.start();}}十三、實現(xiàn)Runable接口和繼承Thread類的區(qū)別
?
?? ?? ? Thread類本身實現(xiàn)了Runable接口,所有并不是普遍認為的資源共享問題,只是類只能單繼承,而接口可以多實現(xiàn),區(qū)別在于擴展。
?
?
十四、防止表單重復(fù)提交
?? ?? ? 如果是在前臺跳轉(zhuǎn)中,用戶多次點擊提交按鈕造成表單重復(fù)提交,可以利用js使提交按鈕在點擊之后為不可用狀態(tài);
?? ?? ? 如果頁面已跳轉(zhuǎn)完畢,用戶刷新頁面顯示提交是否重復(fù)提交表單,可以在控制器中利用重定向跳轉(zhuǎn)頁面。
?
十五、javaEE和javaSE的區(qū)別
??
??? ? javaEE用來開發(fā)網(wǎng)站,javaSE用來開發(fā)軟件
?
十六、throw和throws的區(qū)別
?
? ? throw作用于方法體中,一旦執(zhí)行,必將拋出異常;throws作用于方法頭上,表示可能會拋出某個或某些異常
?
十七、java跨平臺的原因
?
? ? java語言首先被編譯器執(zhí)行編譯成.class文件,也就是java字節(jié)碼,.class文件和編譯器是跨平臺的,然后編譯生成的.class文件在不同的平臺上有相對應(yīng)的解釋器,因此對于編程者來說,java就實現(xiàn)了跨平臺。
?
十八、垃圾回收的優(yōu)點和原理。并考慮垃圾回收機制。
?
? ? 在對象創(chuàng)建時開始,垃圾回收器就開始監(jiān)視著對象的內(nèi)存地址,大小,引用情況,當(dāng)GC確定一些對象不被使用時,GC就有責(zé)任回收這些對象,程序員可以通過System.gc(),通知GC進行垃圾回收,但GC并不一定會執(zhí)行
? ? 分代垃圾回收:不同的對象的生命周期是不同的,如session對象存活時間一般較長,而生成的string對象,存活時間較短。可能使用一次就不再使用了,因此引入了分代垃圾回收機制,劃分為新生代和老年代和持久代,新生代Minor?GC,老年代對應(yīng)Full?GC(Major?GC),新生代中的對象不穩(wěn)定容易產(chǎn)生垃圾,因此經(jīng)常執(zhí)行Minor?GC,老年代中存放的是年輕代中執(zhí)行多次GC后仍然存活的對象,因此Full?GC不經(jīng)常執(zhí)行
? ? 標記垃圾回收:將被引用的對象進行標記,未被引用的對象并不會被立即清除,一直到內(nèi)存耗盡時程序掛起,清理所有的未標記對象,當(dāng)所有的未標記對象清理完畢后,程序繼續(xù)執(zhí)行
? ? 增量垃圾回收:是為了解決標記垃圾回收的長停頓問題,將堆棧分成多個域,一次僅清理一個域中的垃圾,可減少程序的停頓時間。
?
十九、垃圾回收算法
?
? ? 標記-清除算法:將標記的對象進行清除,標記和清除的效率都不高,會造成許多的內(nèi)存碎片;
? ? 標記-復(fù)制算法:將內(nèi)存分為兩塊,當(dāng)這一塊的內(nèi)存用完啦,就將仍然存活的對象復(fù)制到另一塊內(nèi)存中去,然后清除掉這一塊的所有對象;適用于新生代,死亡率高,復(fù)制的對象較少
? ? 標記-整理算法:將標記的對象清除后,讓存活的對象向內(nèi)存的一端移動,去除內(nèi)存碎片
?
二十、對象的四種引用類型
?
? ? 1、強引用:GC不會對此種對象進行垃圾回收
? ? 2、軟引用:GC會在內(nèi)存溢出前對此類對象進行回收,存儲在SoftReference中,當(dāng)軟引用存儲的對象被回收后,軟引用這個對象也需要進行回收,可以在最初構(gòu)建這個軟引用對象時采用以下方法構(gòu)建
ReferenceQueue queue = new??ReferenceQueue();??
?
SoftReference??ref=new??SoftReference(aMyObject, queue);
如此,當(dāng)軟用對象所存儲的對象被回收后,ref所指定的對象就會被加入到ReferenceQueue中去,我們可以根據(jù)此隊列是否為null,來判斷軟引用中存儲的對象是否被回收,如果被回收,我們可以把軟引用對象的引用清除掉;
也可利用reference.get();方法判斷弱引用中存儲的對象是否被回收
while ((ref = (EmployeeRef) q.poll()) != null) {??
?????????????// 清除ref??
??????????????SoftReference ref = null;??
?????????}
? ? 3、弱引用:存儲在WeakReference中,隨時可能會被回收,無論是否會內(nèi)存溢出
? ? 4、虛引用:存儲在PhantomReference,必須與引用隊列關(guān)聯(lián)使用
https://blog.csdn.net/linzhiqiang0316/article/details/88591907
?
二十五、為什么重寫equals方法時還要重寫hashcode方法
?
?? ?首先我們原生equals方法是判斷兩個對象的內(nèi)存是否一致,而我們大多數(shù)情況下僅需判斷對象的數(shù)據(jù)是否相等即可;而重寫equals方法時要遵循一個原則,對象相同,則哈希碼相同;哈希碼相同,對象不一定相同。如果我們重寫equals方法后,不重寫hashcode方法,則將兩個相同數(shù)據(jù)的對象當(dāng)做key存儲到set或map中時,仍然會當(dāng)做兩個對象,因為map再對key去重時,調(diào)用的是equals和hashcode的雙重判斷。這倆方方必須同時滿足
??if (p.hash == hash && ((k = p.key) == key || (key != null &&??key.equals(k))))
?
二十六、object中定義了哪些方法
?
clone(),equals(),hashcode(),notify(),notifyAll(),wait(),finalize(),getClass(),toString()
?
二十七、重載和重寫的區(qū)別
?
重載是在同一個類中,對某一個方法進行重載,方法名相同,參數(shù)不同(參數(shù)類型或個數(shù)),方法返回類型及訪問權(quán)限和是否重載無關(guān);
重寫發(fā)生在繼承中,方法名,參數(shù),返回值類型相同,拋出的異常必須是父類中聲明的或父類異常中的子類,訪問權(quán)限不能父類更小
?
二十八、繼承和實現(xiàn)的區(qū)別
?
類不可以繼承多個類,不可以繼承接口,可以實現(xiàn)多個接口;
接口可以繼承多個接口,不可以實現(xiàn)接口;
?
?
二十九、接口和抽象類的區(qū)別
?
抽象類中不一定有抽象方法,但是有抽象方法的話必須設(shè)置為抽象類,可以擁有成員變量
接口中的方法默認為public abstract沒有方法體,如果要加上方法體的話可以將方法改為靜態(tài)或?qū)⒃L問權(quán)限修改為default
接口中的變量默認為公共靜態(tài)常量: public static final
接口中的方法默認為: public abstract
類的訪問權(quán)限為default
?
三十、單例模式
public class Single {//餓漢式private Single() {}private static final Single single = new Single();public static Single getInstance() {return single;}}package test;public class Single {//懶漢式private Single() {}private static??Single single;public static Single getInstance() {//? ?public static synchronized Single getInstance() {if (single==null) {single = new Single();}return single;}}?
餓漢式線程安全,懶漢式線程不安全,不過可以通過加鎖使懶漢式線程安全
?
三十一、static和final的區(qū)別
?
static表示靜態(tài)僅此一份,final表示為不可更改
?
static修飾的變量或方法可以直接通過類名調(diào)用;final修飾的變量表示為常量值不可修改,修飾的方法不能被重寫,修飾的類不能被繼承;
?
三十二、匿名內(nèi)部類
?
當(dāng)我們?yōu)榱耸褂酶割惢蚪涌谥械哪硞€方法時,我們需要新建一個類繼承父類或?qū)崿F(xiàn)接口,然后new一個子類去調(diào)用方法,但是我們可能僅使用一次這個方法,因此生成一個新的類是比較麻煩的,此時我們可以使用匿名內(nèi)部類。可以簡化代碼
?
三十三、基本數(shù)據(jù)類型
?
byte,int,double,float,char,boolean,short,long
?
三十四、Error和Exception的區(qū)別
?
?? ?error類一般指與虛擬機相關(guān)的問題,如系統(tǒng)崩潰,內(nèi)存不足等問題,對于此類異常僅依靠程序本身無法恢復(fù),建議讓程序終止;
? ? Exception類表示程序可以處理的異常,可以進行捕獲處理異常,使程序正常執(zhí)行。
?
三十五、異常分為哪幾種
? ? 分為一般異常和運行時異常,一般異常是在定義時拋出的,這些異常需要被拋出或者捕獲,如果不處理將會編譯失敗;運行異常是在代碼執(zhí)行階段出現(xiàn)的異常
?
三十六、集合類型
list可以存儲null值,元素有序,ArryList查詢快,LinkList增刪快,Vector線程安全
set,元素不能重復(fù):HashSet無序可以放入null,TreeSet有序不允許放null
Map:HashMap允許key和value都為null,非線程同步,默認大小是16,增長方式為2的指數(shù)倍;
?? ??? ?? ? HashTable不允許鍵值為null,線程同步,默認容量為11,增長方式為old*2+1;
三十七、Collection和Collections的區(qū)別
???? ??? ?
? ? Collection是一個接口,是各種集合結(jié)構(gòu)的父接口,定義了集合的基礎(chǔ)操作方法;
? ? Collections是一個類,是一個對集合對象進行操作的幫助類,提供啦對集合的搜索,排序,線程安全化等操作方法
?
三十八、什么是序列化,如何實現(xiàn)序列化
? ? 當(dāng)我們需要將一個java對象存儲到本地文件或通過網(wǎng)絡(luò)傳輸時,需要將其轉(zhuǎn)化為字節(jié)流的形式,稱之為序列化,反之稱之為反序列化,要將對象序列化需要在其類前實現(xiàn)Serializable;
?
三十九、HashMap詳解
? ? HashMap的數(shù)據(jù)結(jié)構(gòu)是一個基于數(shù)組的鏈表結(jié)構(gòu),在1.8中鏈表長度超過8時將會轉(zhuǎn)化為紅黑樹
1、HashMap的主要參數(shù)有哪些
? ? capacity:數(shù)組長度,默認為16;
? ? MAXIMUM_CAPACITY:極限容量,最大為2的30次方;
? ? 負載因子:通過與數(shù)組長度的成績得到閾值,默認0.75;
? ? 數(shù)組閾值:1.8中當(dāng)entity超過此閾值時進行擴容,1.7中超過此閾值切添加新數(shù)據(jù)發(fā)生hash碰撞時進行擴容
? ? 鏈表閾值:超過8時轉(zhuǎn)化為紅黑樹,小于6時轉(zhuǎn)化為列表
?
2、hash的計算規(guī)則
? ? key的hashcode碼右移16位后,和原h(huán)ashcode碼異或操作,得到hash
3、key所在位置的計算
將數(shù)組長度-1后,轉(zhuǎn)化為2進制,與hash進行與操作,即可得到所在位置
?
4,插入操作
1.8中,如果沒有出現(xiàn)hash沖突,則直接將node放入數(shù)組;
如果第一個node出現(xiàn)了hash沖突且key相同,意味著無需添加node,則替換此key的value;
?
如果沒有hash沖突或者無相同的key,意味著需要添加node,
?? ?? ? 如果此hash對應(yīng)的數(shù)據(jù)是以紅黑樹形式存儲的話,則用樹的方式添加node
?? ?? ? 如果此hash對應(yīng)的數(shù)據(jù)是以鏈表形式存儲,遍歷此鏈表
?? ??? ??? ?? ? 在遍歷過程中發(fā)現(xiàn)了相同的key時,替換value
?? ??? ??? ?? ? 遍歷到結(jié)尾還未發(fā)現(xiàn)相同key,意味著需要添加node,添加node后進行檢測
?? ??? ?? ??? ??? ??? ? 如果鏈表的深度超過了8,但數(shù)組長度未超過64,則進行數(shù)組擴容
? ? ? ? ? ? ? ? ? ? ? ? 如果超過了64,則將鏈表轉(zhuǎn)化為紅黑樹
添加node或修改node之后,檢查此時鍵值對個數(shù)長度,如果大于閾值,則進行擴容
5、拉鏈法導(dǎo)致的鏈表過深問題為什么不用二叉查找樹代替,而是用紅黑樹
二叉查找樹在極限情況下會所有節(jié)點在一側(cè),這樣就又成了鏈表結(jié)構(gòu),不能解決鏈表過深的問題,而紅黑樹的特性決定了,它不會像二叉查找樹那樣出現(xiàn)極限情況
6、紅黑樹的理解
節(jié)點非黑即紅,根節(jié)點一定是黑色的,如果節(jié)點是紅色的,則子節(jié)點一定是黑色的(反之未必);葉子節(jié)點是黑色的空值;從任一節(jié)點到每個葉子的所有路徑都有相同數(shù)目的黑色節(jié)點
?
7、為什么擴容時要設(shè)置成2的n次冪
元素存儲到hashmap中時,是將元素key的hash值和數(shù)組長度減一的二進制進行與運算,如果數(shù)組長度是個基數(shù)的話會造成數(shù)組的部分位置不能存儲數(shù)據(jù)
8、負載因子為什么會影響hashMap性能
首先有序列表索引較快,而鏈表插入和刪除較快;而負載因子大的話,相同長度的列表中可以存儲更多數(shù)據(jù),則鏈表長度會加長,索引效率就降低;而負載因子小的話,索引效率增加,但會造成空間浪費
9、有序map和無序map
HashMap存儲的時候是無序的,即不計入插入的先后順序,因為它是按照hash值尋找相應(yīng)位置進行存放,而存放完成之后,取得時候就是有序的了
LinkedHashMap是有序的,它是HashMap的子類,通過保存對上一個和下一個元素的引用,保證了順序
?
四十、初始化和實例化
?
在實例化一個對象之前,會先對它的類進行初始化;
實例化對象之后,會對實例對象進行初始化
?
四十一、列舉出JAVA中6個比較常用的包
java.net ;java.lang;java.util;java.io;java.sql;java.awt;?javax.swing
四十二、Comparable和Comparator接口區(qū)別
?
首先,對集合當(dāng)中元素排序時,調(diào)用Collections.sort()方法,可以有兩種方法排序,一種直接傳入list集合,,另一種傳入list集合以及指定比較器。
第一種是:在創(chuàng)建類時實現(xiàn)Comparable接口,并重寫了 compareTO方法;
第二種是:新建了一個類實現(xiàn)了Comparator接口,并重寫了compare方法
?
四十四、HashMap,TreeMap,HashTable的區(qū)別?
HashTable不允許<鍵,值>有空值,HashMap允許<鍵,值>有空值。
HashTable線程同步,但是HashMap非線程同步。
HashTable中hash數(shù)組的默認大小是11,增加方式的old*2+1,
HashMap中hash數(shù)組的默認大小是16,增長方式一定是2的指數(shù)倍。
TreeMap底層是二叉樹結(jié)構(gòu),線程不同步,將它保存的key默認按照升序排序,鍵值對可以為null。
HashTable使用Enumeration,HashMap使用Iterator。
四十五、寫幾個線程安全類,不安全的,支持排序的類名
線程安全類:Vector、Hashtable、Stack。
線程不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap
支持排序的類有HashSet、LinkedHashSet、TreeSet等(Set接口下的實現(xiàn)都支持排序)
?
四十六,volatile和synchronized的區(qū)別
?
synchronized是實現(xiàn)了執(zhí)行控制,同一時刻只能由一個線程訪問,volatile直接告訴線程,緩存中的數(shù)據(jù)不正確,直接去取,寫的時候也直接寫到主存;
synchronized可能會造成線程堵塞,volatile不會,
volatile僅能作用在變量上,synchronized可以作用在方法,變量和類上
?
四十七、三次握手與四次揮手
首先TCP報文段首部有20個字節(jié)用于存儲本報文段的一些信息,包括序號seq(發(fā)送的報文段的第一個字節(jié)的序號),確認號ack(期待對方發(fā)送的下一個報文段的第一個數(shù)據(jù)字節(jié)的序號),以及6個控制位來說明本報文段的性質(zhì)
三次握手
第一次握手:客戶端發(fā)送TCP請求報文段(SYN=1,seq=x);(SYN=1的報文段不能攜帶數(shù)據(jù),但是會消耗一個序號),此時客戶端進入同步發(fā)送狀態(tài)
第二次握手:服務(wù)端接收到請求報文之后,如果同意建立連接,發(fā)送SYN=1的確認報文,此時服務(wù)端進入同步收到狀態(tài)
第三次握手:客戶端收到服務(wù)端的確認報文后,向服務(wù)端發(fā)送確認報文,客戶端進入連接建立狀態(tài),服務(wù)端接收到確認報文后,服務(wù)端進入連接建立狀態(tài);此時雙方就可以發(fā)送報文數(shù)據(jù)啦
?
四次揮手:
首先客戶端發(fā)起FIN=1的連接釋放報文,停止發(fā)送數(shù)據(jù),客戶端的狀態(tài)為終止等待1;
服務(wù)端收到釋放連接報文后,發(fā)送確認報文,服務(wù)端進入關(guān)閉等待狀態(tài),此時客戶端不會再向服務(wù)端發(fā)送數(shù)據(jù),但服務(wù)端可繼續(xù)向客戶端發(fā)送數(shù)據(jù),客戶端收到確認報文后,進入終止等待2狀態(tài);
服務(wù)端繼續(xù)向客戶端發(fā)送數(shù)據(jù),數(shù)據(jù)發(fā)送完畢后,向客戶端發(fā)送FIN=1的連接釋放報文,此時服務(wù)端進入最后確認狀態(tài)
客戶端收到請求釋放報文后,向服務(wù)端發(fā)送確認報文,客戶端進入時間等待狀態(tài),服務(wù)端接收到確認報文后,進入連接關(guān)閉狀態(tài),客戶端經(jīng)過一段時間的等待后也進入連接關(guān)閉狀態(tài)
?
四十八、Class.loader和Class.forName的區(qū)別
class.loader只是將.class文件放入jvm中,不進行任何的解釋;Class.forName將.class文件放入jvm后還會執(zhí)行文件中的靜態(tài)方法和靜態(tài)代碼塊靜態(tài)變量
?
四十九、String類的常用方法
indexof():返回指定字符串第一次出現(xiàn)的位置
charAt():返回指定下標的元素字符
length():返回字符串的長度
replace():替換所有指定字符,第一個為老字符,第二個參數(shù)為新的字符
replaceAll():替換所有指定字符串
trim():去除字符串兩邊的空格
split():以特定字符串切割字符串,返回一個字符串?dāng)?shù)組
?
五十、synchronized和lock的區(qū)別
synchronized是一個java關(guān)鍵字,lock是一個接口
synchronized無法判斷是否獲取鎖的狀態(tài),lock可以
synchronized可以自動釋放鎖,lock需要手動釋放
synchronized是非公平的鎖,lock默認不公平,可以設(shè)置為公平鎖
synchronized適合代碼少量的同步問題,lock適合大量代碼的同步問題(因為synchronized修飾的代碼會被編譯器優(yōu)化,切線程不能被中斷)
https://www.cnblogs.com/takumicx/p/9338983.html
?
五十一:棧、堆、常量池
棧中存放基本數(shù)據(jù)類型,數(shù)據(jù)唯一,數(shù)據(jù)的大小和生存周期確定,存儲或修改數(shù)據(jù)時,先查找有沒有相同的數(shù)據(jù),有的話直接引用此數(shù)據(jù),沒有的話創(chuàng)建開辟新的空間存儲此數(shù)據(jù)
int a = 3;int b = a;System.out.println("a="+a+";b="+b);System.out.println(a==b);a=4;System.out.println("a="+a+";b="+b);System.out.println(a==b);堆中存放new出的對象,數(shù)據(jù)不共享,存儲數(shù)據(jù)時直接開辟新的空間存儲數(shù)據(jù),修改數(shù)據(jù)時在原先地址進行數(shù)據(jù)修改
?
常量池存放基本類型常量,字符串常量以及指定范圍的包裝類型常量,數(shù)據(jù)共享,注意包裝類型存儲范圍,裝箱時會調(diào)用valueof方法,因此得到的對象可能會被new
?
類的成員變量及方法的四種訪問權(quán)限
?
| 訪問級別 | 訪問修飾符 | 同類 | 同包 | 子類 | 不同包 |
| 公開 | public | √ | √ | √ | √ |
| 受保護 | protect | √ | √ | √ | × |
| 默認 | 缺省 | √ | √ | × | × |
| 私有 | private | √ | × | × | × |
?
?
數(shù)據(jù)庫
一、事務(wù)的特性及事務(wù)并發(fā)帶來的問題
?
?? ?? ? 原子性、隔離性、持久性、一致性
?? ?? ? 問題:臟讀:事務(wù)A利用了事務(wù)B處理之后的數(shù)據(jù),但是事務(wù)B發(fā)生了回滾
? ? ? ? ? ? ? ? ? 不可重復(fù)讀:事務(wù)A讀取數(shù)據(jù)再次重新讀取時,原數(shù)據(jù)被事務(wù)B修改,前后讀取數(shù)據(jù)內(nèi)容不同,針對更新操作
? ? ? ? ? ? ? ? ? 幻讀:事務(wù)A讀取數(shù)據(jù)再次重復(fù)讀取時,原數(shù)據(jù)被事務(wù)B刪除或插入;前后讀取數(shù)據(jù)總數(shù)不同,針對增加刪除操作
?
二、數(shù)據(jù)庫如何優(yōu)化
?
? ? 1:SQL優(yōu)化:
?? ?? ? 盡量少使用select * ;使用連接查詢代替子查詢
? ? 2:表結(jié)構(gòu)優(yōu)化:
?? ?? ? 盡量使用數(shù)字類型字段,提高比對效率;
?? ?? ? 長度不變的數(shù)據(jù)可以使用char類型;
? ? 3:其它優(yōu)化
?? ?? ? 對查詢頻率高的字段適當(dāng)建立索引;根據(jù)表用途的不同使用不同的數(shù)據(jù)庫引擎;讀寫分離。
?
三、常見數(shù)據(jù)庫引擎
數(shù)據(jù)庫引擎是用于存儲,處理,保護數(shù)據(jù)的核心服務(wù)
?? ? InnoDB支持事務(wù)處理、外檢以及行鎖,適用于對數(shù)據(jù)安全性,事務(wù)完整性要求較高的場景;
? ? MyISAM是mysql默認的引擎,不支持事務(wù)、行鎖、外鍵,此當(dāng)修改數(shù)據(jù)時會鎖定整個表,適用于讀出記錄。注意:使用此引擎,在service層通過事務(wù)配置也可以讓其完成事務(wù)業(yè)務(wù)。
? ? MEMORY數(shù)據(jù)存儲到內(nèi)存中,讀寫速度較快,但不能存儲太大的表,
?
四、視圖
視圖是有一個表或者多個表組合而成的虛擬表,它本身并不占據(jù)物理空間,它所呈現(xiàn)的數(shù)據(jù)仍然存儲在原表當(dāng)中;
創(chuàng)建視圖有兩個作用,簡化操作和安全性,經(jīng)常被查詢的數(shù)據(jù)可以定義為視圖,這樣下次在查詢的時候不用再每次指定條件,而通過視圖用戶只能查詢修改他們所能見到的數(shù)據(jù)。通過視圖修改數(shù)據(jù)時僅允許一個表中產(chǎn)生的視圖進行修改。超過一個表不允許修改,具有更好的安全性。
五、索引
索引是指對數(shù)據(jù)表中的一列或者多列進行排序的一種存儲結(jié)構(gòu),可以加快數(shù)據(jù)的查詢效率,但是索引本身也占據(jù)物理空間,且在數(shù)據(jù)進行增加、刪除、修改的時候都需要重新分配索引,又降低了數(shù)據(jù)的維護速度。分為BTREE和HASH兩種結(jié)構(gòu)。
唯一索引:任意兩行不能有相同的索引值,可以防止表中存儲重復(fù)數(shù)據(jù)(主鍵索引)。
聚集索引:表中行的物理順序與鍵值的邏輯順序相同。
六,存儲過程
存儲過程是一個預(yù)編譯的SQL語句集,如果某個操作需要執(zhí)行大量sql語句,可以將其加入到存儲過程中,比單純執(zhí)行SQL要快。相當(dāng)于把sql語句封裝到一個方法中,執(zhí)行sql時調(diào)用方法即可
七、觸發(fā)器
存儲過程是一種特殊的存儲過程,存儲過程需要手動調(diào)用,觸發(fā)器是在某個事件(符合條件的增刪改)發(fā)生之前或之后自動執(zhí)行的。
八、游標
游標是一種能夠從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄進行處理的機制
?
九、SQL的執(zhí)行順序:
from .. on .. join .. where ..group by ..having ..select ..order by ...limit ..
十、三大范式
第一范式:每個列都是最小單元,不可再分。比如:所選課程列包含多個課程,不符合要求,應(yīng)該分成每個課程的單列
第二范式:不存在對主碼的部分依賴,即應(yīng)當(dāng)通過主碼確定唯一的一行數(shù)據(jù):所以可設(shè)置主碼只有一個
第三范式:在第二范式基礎(chǔ)上,非主屬性不能互相依賴,既不存在對主碼的傳遞依賴
十一、SQL語言的分類
DML:數(shù)據(jù)操作語言,用于數(shù)據(jù)的增刪改查,排序操作
DDL:數(shù)據(jù)定義語言,用于創(chuàng)建視圖,索引、表格,此操作是隱性提交的,不能回滾
DCL:數(shù)據(jù)控制語言,用于授予或回收用戶訪問數(shù)據(jù)庫的某種權(quán)限
十二、數(shù)據(jù)庫的交叉并補操作,mysql不支持后兩種
UNION:查詢結(jié)果連接后去重?補
UNION ALL:查詢結(jié)果連接? 并
INTERSECT:查詢相同的?交
MINUS:查詢不同的? 差
?
Mybatis
?
一、緩存
? ? 一級緩存的作用域為同一個SqlSession,二級緩存的作用域是同一個namespace中,且當(dāng)SqlSession關(guān)閉時,才會執(zhí)行二級緩存
?
二、增刪改查的返回值
增加返回增加的條數(shù);
刪除返回被操作的記錄條數(shù);
修改也是返回被操作的記錄條數(shù)
?
三、插入數(shù)據(jù)之后返回主鍵id
在定義xml映射器時設(shè)置屬性useGeneratedKeys值為true,并分別指定屬性keyProperty和keyColumn為對應(yīng)的數(shù)據(jù)庫記錄主鍵字段與Java對象的主鍵屬性。
?
四、工作原理
1、加載mybatis配置文件,得到文件的字符流(配置文件中配置著數(shù)據(jù)源,別名,類型轉(zhuǎn)換這些基礎(chǔ)配置),
?
2、通過SqlSessionFactoryBulider讀取文件的字符流得到SqlSessionFactory
?
3、通過SqlSessionFactory得到SqlSession
?
4、通過SqlSession可以調(diào)用Mapper接口中的方法
?
5、通過接口中的方法調(diào)用與其對應(yīng)的MapperStatement對象
?
6、MapperStatement對象被解析(sql參數(shù)轉(zhuǎn)化,動態(tài)sql拼接),生成jdbc?Statement對象
?
7、JDBC執(zhí)行sql
?
8、通過MappedStatement中的結(jié)果映射關(guān)系,將返回結(jié)果轉(zhuǎn)化為JavaBean或HashMap進行返回
?
五、鎖機制
共享鎖:SELECT .....? LOCK IN SHARE MODE;事務(wù)對數(shù)據(jù)加了共享鎖之后,允許其它事務(wù)繼續(xù)加共享鎖讀取數(shù)據(jù),不允許添加排它鎖,不允許進行寫操作
排它鎖:SELECT .... FOR UPDATE,對數(shù)據(jù)加了排它鎖之后,可以進行讀和寫,其它事務(wù)不能在對此數(shù)據(jù)封裝任何形式的鎖。對于InnoDB引擎來說,增刪改操作會自動給涉及的數(shù)據(jù)加上排它鎖
注意:共享鎖在事務(wù)結(jié)束之后才會釋放,但是事務(wù)的共享鎖可以升級為排它鎖,前提是事務(wù)操控的數(shù)據(jù)未被其它事務(wù)加鎖;因此當(dāng)有兩個事務(wù)同時對同一個數(shù)據(jù)開啟了共享鎖之后,又同時想把共享鎖轉(zhuǎn)化為排它鎖時就會發(fā)生死鎖,所以引入了更新鎖。共享鎖和排它鎖不兼容,與共享鎖兼容
更新鎖:加了更新鎖之后,表示此事務(wù)目前只是讀操作,但未來可能執(zhí)行寫操作;其它事務(wù)可以執(zhí)行讀操作,但是必須等加了更新鎖的事務(wù)結(jié)束后才能執(zhí)行寫操作
更新鎖與共享鎖兼容,與排它鎖不兼容,與自身不兼容
意向鎖:表示此表中的數(shù)據(jù)是否已經(jīng)被加了鎖
計劃鎖:限制DDL操作,進行DDL操作過程中,不允許sqlsession連接該表,在進行DML過程中,不允許使用DDL語言
悲觀鎖:每次都假設(shè)出現(xiàn)最壞的情況,即認為拿數(shù)據(jù)后會進行修改,所以會對此數(shù)據(jù)上鎖,比如表鎖,行鎖,頁鎖,排它鎖。
樂觀鎖:每次都是假設(shè)最好的情況,即認為拿數(shù)據(jù)時不會進行修改,只在更新數(shù)據(jù)的時候檢查下在此期間數(shù)據(jù)有沒有被其它人修改過,判斷有沒有別修改可以采用版本號機制或者CAS算法。版本控制:在數(shù)據(jù)表格中新加一個版本字段,進行更新操作時,判斷當(dāng)前行數(shù)據(jù)版本字段的值是否和初始時發(fā)生了改變;CAS算法:有3個操作數(shù),內(nèi)存上的值V,舊的預(yù)期值A(chǔ),要更新的信息B,當(dāng)且僅當(dāng)A=V時,進行修改
?
?
Java?Web
?
一、什么是servlet
servlet是運行在web服務(wù)器或應(yīng)用服務(wù)器上的程序,可以接收來自網(wǎng)頁表單的用戶輸入,呈現(xiàn)來自數(shù)據(jù)庫的數(shù)據(jù),可以動態(tài)生成網(wǎng)頁
二、servlet的生命周期?
servlet類加載完成實例化,通過init()進行初始化,調(diào)用service()處理客戶端的請求,調(diào)用destroy()方法終止,最后Servlet通過垃圾回收器進行回收
三、jsp內(nèi)置對象及作用?
request?獲取客戶端傳輸過來的信息
response?向客戶端響應(yīng)信息
out? ? 向客戶端輸出數(shù)據(jù)
session? ? 保存會話對象,存儲在服務(wù)器端,瀏覽器關(guān)閉即會失效
application?? ? 在服務(wù)器上存儲數(shù)據(jù),只要程序未停止就會一直保存
pagecontext? ? 保存了其它的所有對象
page? ? 代表當(dāng)前jsp頁面本身
exception? ? 表示jsp引擎在執(zhí)行時會拋出的異常
config? ? 保存當(dāng)前jsp的配置信息
?
四、jsp動態(tài)引入和靜態(tài)引入的區(qū)別
動態(tài)引入是通過jsp動作引入的,可以傳遞參數(shù),適用于引入動態(tài)頁面,動作的標志為jsp:
靜態(tài)引入是通過jsp指令引入的,?適用于靜態(tài)引入,指令的標志為@
?
五、應(yīng)用服務(wù)器和web服務(wù)器的區(qū)別
web服務(wù)器用來接收請求和返回響應(yīng),只能夠處理靜態(tài)頁面;因此那種需要動態(tài)處理的數(shù)據(jù)交給應(yīng)用服務(wù)器處理,處理后的結(jié)果再交給web服務(wù)器進行響應(yīng)
?
六、Tomcat是什么
因為可以通過HTTP提供HTML頁面等靜態(tài)內(nèi)容的請求訪問,所以是一?
個WEB服務(wù)器;
因為實現(xiàn)了Servlet規(guī)范,所以也是一個Servlet容器,可以運行?
Servlet程序;
因為可以通過Servlet容器,調(diào)用Servlet處理動態(tài)請求,所以也是?
一個應(yīng)用服務(wù)器;
七、jsp和servlet的區(qū)別和聯(lián)系:
1.jsp經(jīng)編譯后就變成了Servlet.
(JSP的本質(zhì)就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
2.jsp更擅長表現(xiàn)于頁面顯示,servlet更擅長于邏輯控制.
3.Servlet中沒有內(nèi)置對象,
?
Spring框架
?
一、什么是spring框架,有哪些主要模塊
spring框架是一個為java應(yīng)用程序的開發(fā)提供了綜合,廣泛的基礎(chǔ)性支持的java平臺,幫助開發(fā)者解決了一些基礎(chǔ)性的問題,使得開發(fā)人員可以專注于應(yīng)用程序的開發(fā),包含的模塊有數(shù)據(jù)訪問,web,AOP,測試等功能模塊
二、使用spring框架有哪些好處
首先,我們可以不用把精力放在基礎(chǔ)配置上,其次它提供許多模塊,我們可以根據(jù)自己的需求添加需要的模塊功能加以整合,它提供的控制反轉(zhuǎn)和依賴注入的機制,讓我們更容易設(shè)計出高內(nèi)聚低耦合的項目。
?
三、控制反轉(zhuǎn)IOC和依賴注入DI
在傳統(tǒng)項目中我們生成一個對象時,需要自己new生成,在spring中,是通過容器為我們創(chuàng)建和管理對象的,這叫做控制反轉(zhuǎn),而依賴注入是指我們在一個類中需要另一個類的對象時,不需要自己new,僅需通過生命,容器就會為我們自動注入。因此,控制反轉(zhuǎn)是依賴注入的前提,依賴注入是控制反轉(zhuǎn)的體現(xiàn)。
依賴注入的本質(zhì)就是自動裝配,裝配是依賴注入的具體行為。
四、spring裝配的類型
no,bytype,byname,construct(根據(jù)構(gòu)造函數(shù)中的參數(shù)類型),autodetect(自動探測,有構(gòu)造函數(shù)根據(jù)構(gòu)造函數(shù)進行裝配,沒有構(gòu)造函數(shù)根據(jù)bytype進行裝配)
五,依賴注入的方式有哪些?
set方法注入,
構(gòu)造器注入,
接口注入
?
六、BeanFactory和ApplicationContext和FactoryBean的區(qū)別
BeanFactory是一個factory,管理著所有的bean,在容器啟動時不會去實例化bean,當(dāng)從容器中取bean時才會去實例化
FactoryBean是一個bean,使用它我們可以自定義一個bean的配置信息加入容器中
ApplicationContext是BeanFactory的實現(xiàn)類,擁有BeanFactory的所有功能,還提供了些其它的功能,比如支持AOP,自動裝配。在項目啟動時就將所有的bean實例化了,不過可以設(shè)置lazy-init=true讓bean延遲實例化
?
六,spring有幾種配置方式
基于XML配置,基于注解的配置,基于Java的配置
?
七、Spring支持的幾種bean的作用域
singleton:默認,每個容器中只有一個bean的實例,
prototype:為每一個bean請求提供一個實例
request:為每一個網(wǎng)絡(luò)請求創(chuàng)建一個實例,在請求完成之后,bean會失效并被垃圾回收器回收
session:確保每個session中有一個bean的實例,在session過期后,bean會隨之失效
global-session:所有的session共享一個bean
?
八、spring框架中的單例bean是線程安全的嗎
spring框架并沒有對單例的bean進行任何多線程的封裝處理,所以并非線程安全的,但是spring中封裝的大部分bean是無狀態(tài)的bean(dao層對象),因此線程是安全的;而對于有狀態(tài)的bean(modelAndView),可以通過改變它的作用域為prototype來使其線程安全。
?
九、@Autowired和@Resource的區(qū)別
?
@Autowired默認根據(jù)類型進行裝配,如果想要使用name裝配,可以結(jié)合@Quanlifier一起使用
@Resource默認根據(jù)name裝配,
?? ??? ?如果指定type,則按照類型匹配,找不到或找到多個,都會拋出異常
?? ?? ? 如果指定name,則按照name匹配,找不到則拋出異常
?? ?? ? 如果同時指定name和type,則按照兩者進行尋找
十、spring中用到了哪些設(shè)計模式
BeanFactory管理著所有的bean,采用了工廠模式;
bean的創(chuàng)建默認為單例模式;
代理模式:在使用Spring AOP功能時使用了動態(tài)代理
模板方法:用來解決代碼重復(fù)的問題,如RestTemplate,和JpaTemplate
觀察者模式:當(dāng)一個對象狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知記性更新,如spring中l(wèi)istener的實現(xiàn)--ApplicationListener
十一、Spring事務(wù)的種類
通過TransactionTemplate或 PlatformTransactionManager實現(xiàn)編程式事務(wù)管理
通過AOP或@Transaction實現(xiàn)聲明式事務(wù)管理,
編程式事務(wù)管理可以將事務(wù)級別作用到代碼塊,但是需要在邏輯代碼中添加相應(yīng)的事務(wù)管理代碼
聲明式事務(wù)管理更加簡單易用,但是事務(wù)級別只能作用于方法
?
事務(wù)實現(xiàn): https://blog.csdn.net/weixin_40486739/article/details/89286590
?
十二、spring事務(wù)的傳播行為
?
1、PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),就加入該事務(wù),不存在,則開啟新事務(wù)
2、PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),就加入該事物,不存在則以非事務(wù)執(zhí)行
3、PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),就加入該事務(wù),不存在,拋出異常
4、PROPAGATION_REQUIRES_NEW:無論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)
5、PROPAGATION_NOT_SUPPORTED:以非事務(wù)執(zhí)行,若當(dāng)前存在事務(wù),則將事務(wù)掛起
6、PROPAGATION_NEVER:以非事務(wù)執(zhí)行,若當(dāng)前存在事務(wù),則拋出異常
7、PROPAGATION_NESTED:如當(dāng)前存在事務(wù),則在當(dāng)前事務(wù)內(nèi)開啟子事務(wù),不存在,則開啟新事務(wù)(父事務(wù)回滾,子事務(wù)回滾;子事務(wù)回滾,父事務(wù)不受影響)
https://blog.csdn.net/u010963948/article/details/82761383
?
十三、Spring隔離級別
1、ISOLATION_DEFAULT:采用后端數(shù)據(jù)庫的級別,mysql為可重復(fù)讀,oracle為讀已提交級別
2、 ISOLATION_READ_UNCOMMITTED:最低隔離級別,讀未提交,可能會發(fā)生,臟讀,幻讀,不可重復(fù)讀
3、 ISOLATION_READ_COMMITTED:讀已提交,避免臟讀,不能避免幻讀和不可重復(fù)讀
4、 ISOLATION_REPEATABLE_READ:可重復(fù)讀,即一個事務(wù)內(nèi)兩次讀取數(shù)據(jù)時,如果前后數(shù)據(jù)不一致,此事務(wù)讀時禁止其他事務(wù)寫數(shù)據(jù);避免了臟讀,不可重復(fù)讀,可能會造成幻讀
5、ISOLATION_SERIALIZABLE:串行化,在事務(wù)執(zhí)行時間不允許其它事務(wù)對數(shù)據(jù)做出的增刪改操作,安全性最高,效率最低
?
十四、java反射機制
?
反射機制指的是程序在運行時能夠獲得傳過來的類的所有屬性和方法,調(diào)用傳輸過來的對象的所有屬性和方法。可以根據(jù)傳入的對象動態(tài)的進行操作,使操作更加靈活,代碼具有更好擴展性,缺點是消耗了更多的性能
?
?
十五、spring應(yīng)用上下文
?
首先我們進行依賴注入時,是通過spring容器獲取對象,但是我們需要將需要注入的對象以及對象之間的依賴關(guān)系通過spring的應(yīng)用上下文來告訴spring時容器
ioc是一種思想,spring實現(xiàn)了ioc,但實現(xiàn)了ioc的還有其它框架
?
十六、Bean的生命周期
?
1、spring對bean進行實例化
2、將屬性和對其它bean的引用進行注入
3、如果bean實現(xiàn)了BeanNameAware接口,將bean的id傳遞給setBeanName方法(此接口讓bean自己可以獲取自己在spring容器中的id)
4、如果bean實現(xiàn)了BeanFactoryAware接口,將調(diào)用BeanFactory容器實例傳入。(可以獲取到他們的BeanFactory)
5、如果實現(xiàn)了ApplicationContextAware接口,將調(diào)用setApplicationContext方法,將上下文的引用傳入
6、如果實現(xiàn)了BeanPostProcessor接口,將調(diào)用postProcessBeforeInitialization方法(在對象實例化前進行操作)
7、如果實現(xiàn)了InitializingBean接口,或者在bean中聲明了init-method則調(diào)用他們的初始化方法對bean進行初始化(如果兩個都指定,則先執(zhí)行接口中指定的方法,再執(zhí)行配置中指定的初始化方法)
8、如果實現(xiàn)了BeanPostProcessor接口,將調(diào)用postProcessAfterInitialization方法(在對象實例化前進行操作)
9、此時Bean 已經(jīng)準備就緒.可以被應(yīng)用程序使用了. 它們將一直駐留在應(yīng)用上下文中.直到該應(yīng)用上下文補銷毀
10、如果實現(xiàn)了DisposableBean接口,spring將調(diào)用它的destroy()接口,如果Bean 使用destroy-method 聲明了銷毀方法,方法也會被調(diào)用。(調(diào)用順序同7)
?
十七、spring的AOP支持
1、使用@Asepect注解,在類中定義切點及各種通知
2、經(jīng)典的基于代理的AOP實現(xiàn),在一個類中實現(xiàn)各種通知的接口,在配置文件中配置切點,切面
https://blog.csdn.net/summer_yuxia/article/details/75104949
?
十八、什么是線程安全
線程安全是指在多線程訪問數(shù)據(jù)時,采用加鎖機制,當(dāng)一個線程訪問該類的某個數(shù)據(jù)時,提供數(shù)據(jù)保護,不允許其它線程訪問此數(shù)據(jù)直至當(dāng)前線程訪問結(jié)束,由此可以避免數(shù)據(jù)污染
?
十九、線程池的好處
1、提高效率:創(chuàng)建線程和銷毀線程都是比較消耗系統(tǒng)資源的,線程池為我們提供了一定數(shù)量的線程,可以避免頻繁的創(chuàng)建和銷毀線程
2、方便管理:將線程放在線程池中,對線程的數(shù)量及使用情況進行統(tǒng)一管理,避免在程序中額外的創(chuàng)建線程
二十、線程池的無界隊列和有界隊列
首先理解三個名詞,
corePoolSize:線程池的基本線程數(shù)量,注意在剛創(chuàng)建線程池時不會創(chuàng)建線程,當(dāng)有任務(wù)提交時才開始創(chuàng)建線程。
maxiMumSize:線程池的最大線程數(shù),可以調(diào)用setMaxiMumSize方法定義
poolSize:線程池中當(dāng)前的線程數(shù)量
有界隊列:當(dāng)線程數(shù)poolsize小于corepoolSize時,提交的runable任務(wù)會直接創(chuàng)建分配一個線程,立刻執(zhí)行
大于時,將線程任務(wù)放在blockqueue中,如果阻塞隊列已滿,如果poolsize<maximumSize,則創(chuàng)建一個新的線程,如果已經(jīng)=,則執(zhí)行reject策略
無界隊列:當(dāng)poolSize<corePoolSize時,提交的runable任務(wù)會直接分配一個線程,不小于,則將線程任務(wù)放入無界隊列中進行等待,直至內(nèi)存耗盡
二十一、線程池的種類
1、newCachedThreadPool:緩存線程池,線程池中線程不固定,無最大線程數(shù)
2、newFixedThreadPool:定長線程池,線程池中線程數(shù)量一定,超過corepoolsize時,線程任務(wù)在無界隊列中等待
3、newSingleThreadExecutor:單例線程池,線程池中線程數(shù)固定為1,其它的線程任務(wù)在無界隊列中進行等待
4、newScheduleThreadPool:定長定時線程池,創(chuàng)建指定數(shù)量的線程池,線程的執(zhí)行可指定延遲執(zhí)行時間,以及周期
5、newSingleScheduledExector:單例定時線程,創(chuàng)建一個線程的線程池,線程的執(zhí)行可指定延遲時間,以及周期
?
二十二、如何給定線程池的線程數(shù)量
1、首先cpu密集型程序是指,對業(yè)務(wù)邏輯的處理計算比較多,io密集型應(yīng)用是指經(jīng)常做文件的讀寫操作,
2,設(shè)系統(tǒng)的cpu數(shù)量為n,則理論上對于cpu密集型創(chuàng)建的線程數(shù)為n+1,對于io密集型創(chuàng)建的線程數(shù)為2n+1
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的整理的一些java基础知识点,欢迎补充指正的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨境电商如何利用Quora帮你引上万流量
- 下一篇: php布尔运算,布尔逻辑运算符有哪些?