1、String、StringBuilder、StringBuffer的區(qū)別
String:字符串常量,是一個常量,值不會改變,例:s="aaa";s=s+"d"; ==>> s="aaad";
StringBuffer:字符創(chuàng)變量,使用它線程安全
StringBuilder:字符創(chuàng)變量,使用它線程不安全
執(zhí)行速度:StringBuilder > StringBuffer > String
2、list和set的區(qū)別
對于Set 和 List都是 接口 Collection 的子接口
主要的區(qū)別:
Set 不允許重復(fù),List允許重復(fù)
Set 沒有順序,List有順序
3、常用的集合類,作用及使用場景
使用場景
(1) 對于需要快速插入,刪除元素,應(yīng)該使用LinkedList;
(2) 對于需要快速隨機訪問元素,應(yīng)該使用ArrayList;
(3) 對于“單線程環(huán)境” 或者 “多線程環(huán)境,但List僅僅只會被單個線程操作”,此時應(yīng)該使用非同步的類(如ArrayList);
(4) 對于“多線程環(huán)境,且List可能同時被多個線程操作”,此時,應(yīng)該使用同步的類(如Vector)。
(5) HashSet是基于Hash算法實現(xiàn)的,其性能通常都優(yōu)于TreeSet。為快速查找而設(shè)計的Set,我們通常都應(yīng)該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。
(6) HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允許空鍵值,而HashTable不允許。
HashMap:適用于Map中插入、刪除和定位元素。
Treemap:適用于按自然順序或自定義順序遍歷鍵(key)。
4、數(shù)據(jù)庫連接池
工作機制:
數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。
常用參數(shù)及其含義:
(1) maxActive 連接池支持的最大連接數(shù),這里取值為20,表示同時最多有20個數(shù)據(jù)庫連接。一般把maxActive設(shè)置成可能的并發(fā)量就行了,設(shè) 0 為沒有限制。
(2) maxIdle 連接池中最多可空閑maxIdle個連接 ,這里取值為20,表示即使沒有數(shù)據(jù)庫連接時依然可以保持20空閑的連接,而不被清除,隨時處于待命狀態(tài)。設(shè) 0 為沒有限制。
(3). minIdle 連接池中最小空閑連接數(shù),當(dāng)連接數(shù)少于此值時,連接池會創(chuàng)建連接來補充到該值的數(shù)量
(4). initialSize 初始化連接數(shù)目
(5). maxWait 連接池中連接用完時,新的請求等待時間,毫秒,這里取值-1,表示無限等待,直到超時為止,也可取值9000,表示9秒后超時。超過時間會出錯誤信息
(6). removeAbandoned 是否清除已經(jīng)超過“removeAbandonedTimout”設(shè)置的無效連接。如果值為“true”則超過“removeAbandonedTimout”設(shè)置的無效連接將會被清除。設(shè)置此屬性可以從那些沒有合適關(guān)閉連接的程序中恢復(fù)數(shù)據(jù)庫的連接。
(7). removeAbandonedTimeout 活動連接的最大空閑時間,單位為秒 超過此時間的連接會被釋放到連接池中,針對未被close的活動連接
(8). minEvictableIdleTimeMillis 連接池中連接可空閑的時間,單位為毫秒 針對連接池中的連接對象(9). timeBetweenEvictionRunsMillis / minEvictableIdleTimeMillis 每timeBetweenEvictionRunsMillis毫秒秒檢查一次連接池中空閑的連接,把空閑時間超過minEvictableIdleTimeMillis毫秒的連接斷開,直到連接池中的連接數(shù)到minIdle為止.
5、遍歷某一文件夾下的文件和目錄(遞歸)
public void traverseFolder2(String path) {
File file = new File(path);
if (file.exists()) {
File[] files = file.listFiles();
if (null == files || files.length == 0) {
System.out.println("文件夾是空的!");
return;
} else {
for (File file2 : files) {
if (file2.isDirectory()) {
System.out.println("文件夾:" + file2.getAbsolutePath());
traverseFolder2(file2.getAbsolutePath());
} else {
System.out.println("文件:" + file2.getAbsolutePath());
}
}
}
} else {
System.out.println("文件不存在!");
}
}
6、線程的實現(xiàn)方法
從JDK的文檔上看,在Java中實現(xiàn)線程有兩種方式,一種是繼承Thread類,另一種是實現(xiàn)Runnable接口。
它們的區(qū)別是:
(1)Thread類本身也是實現(xiàn)了Runnable接口,因此也是實現(xiàn)了Runnable接口中的run方法。
(2)當(dāng)使用繼承Thread類去實現(xiàn)線程時,我們需要重寫run方法,因為Thread類中的run方法本身什么事情都不干。
(3)當(dāng)使用實現(xiàn)Runnable接口去實現(xiàn)線程時,我們需要重寫run方法,然后使用new Thread(Runnable)這種方式來生成線程對象,這個時候線程對象中的run方法才會去執(zhí)行我們自己實現(xiàn)的Runnable接口中的run方法。
7、Thread.sleep()和 Object.wait() 有什么區(qū)別?
最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
8、方法重載和重寫的區(qū)別
方法重載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數(shù)列表,即參數(shù)的數(shù)量或參數(shù)類型不能完全相同
方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數(shù)表和相同的返回類型
9、final finally finalize區(qū)別
final用于聲明屬性,方法和類,分別表示屬性不可交變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,供垃圾收集時的其他資源回收,例如關(guān)閉文件等。
10、JSP中動態(tài)include和靜態(tài)include區(qū)別
靜態(tài) INCLUDE 用 include 偽碼實現(xiàn) , 不會檢查所含文件的變化 , 適用于包含靜態(tài)頁面 <%@ include file="included.htm" %> 。先將文件的代碼被原封不動地加入到了主頁面從而合成一個文件,然后再進行翻譯
動態(tài) INCLUDE 用 jsp:include 動作實現(xiàn) <jsp:include page="included.jsp" flush="true" /> 它總是會檢查所含文件中的變化 , 適合用于包含動態(tài)頁面 , 并且可以帶參數(shù)。各個文件分別先編譯,然后組合成一個文件。
兩者有幾個不同點:
(1)靜態(tài)導(dǎo)入是將被導(dǎo)入頁面的代碼完全融入,兩個頁面融合成一個整體的servlet;而動態(tài)導(dǎo)入則在servlet中使用include方法來引入被導(dǎo)入頁面的內(nèi)容。
(2)靜態(tài)導(dǎo)入時被導(dǎo)入的頁面的編譯指令會起作用,而動態(tài)導(dǎo)入時被導(dǎo)入的頁面的編譯指令則失去作用,只是插入被導(dǎo)入頁面的body內(nèi)容。
(3)動態(tài)包含可以包含相同變量,而靜態(tài)包含不行。
(4)如果被包含文件經(jīng)常變動,則應(yīng)該使用動態(tài)包含,而使用靜態(tài)包含時,改變被包含文件后,有可能不能及時更新
11、數(shù)據(jù)庫事務(wù)
是指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。
原子性:事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。
一致性:事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
隔離性:由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。
持久性:事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持。
12、垃圾回收機制