throw和throws的區(qū)別:
1.throw代表動作,表示拋出一個異常的動作;throws代表一種狀態(tài),代表方法可能有異常拋出
2.throw用在方法實現(xiàn)中,而throws用在方法聲明中
3.throw只能用于拋出一種異常,而throws可以拋出多個異常final finally finalize的區(qū)別(以問到)
final:java中的關鍵字,修飾符。
A).如果一個類被聲明為final乌企,就意味著它不能再派生出新的子類,不能作為父類被繼承礁鲁。因此巢价,一個類不能同時被聲明為abstract抽象類的和final的類。
B).如果將變量或者方法聲明為final叠萍,可以保證它們在使用中不被改變.
1)被聲明為final的變量必須在聲明時給定初值造壮,而在以后的引用中只能讀取渡讼,不可修改。
2)被聲明final的方法只能使用费薄,不能重載硝全,重寫。
finally:java的一種異常處理機制楞抡。
finally是對Java異常處理模型的補充伟众。finally結構使代碼總會執(zhí)行,而不管無異常發(fā)生召廷。使用finally可以維護對象的內部狀態(tài)凳厢,并可以清理非內存資源。特別是在關閉數(shù)據(jù)庫連接這方面竞慢,如果程序員把數(shù)據(jù)庫連接的close()方法放到finally中先紫,就會大大降低程序出錯的幾率。
finalize:Java.lang.Object類中的一個方法名筹煮。
Java技術使用finalize()方法在垃圾收集器將對象從內存中清除出去前遮精,做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒被引用時對這個對象調用的。它是在Object類中定義的本冲,因此所的類都繼承了它准脂。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象調用的檬洞。try-catch-finally哪部分可以省略
catch 和 finally可以省略一個狸膏,不能兩個都省略。try-catch-finally 如果catch中有return finally還會執(zhí)行嗎添怔。
會的湾戳,因為finally是一定會執(zhí)行的語句,所以return會在finally之后執(zhí)行广料。
finally中的return會覆蓋catch中的return的值也會覆蓋try中return的值砾脑。常見的異常類有哪些?
NullPointerException 當應用程序試圖訪問空對象時艾杏,則拋出該異常拦止。
ClasscastException 兩個類型間轉換不兼容時引發(fā)的運行時異常。
SQLException 提供關于數(shù)據(jù)庫訪問錯誤或其他錯誤信息的異常糜颠。
IOException當發(fā)生某種I/O異常時,拋出此異常萧求。
IndexOfBoundsException 索引越界異常其兴。簡單工廠模式和抽象工廠有什么區(qū)別?
“簡單工廠模式”使用fw模式建立對象夸政;“
抽象工廠模式”則使用迭代模式創(chuàng)建對象元旬。
接口數(shù)量不同∈匚剩“簡單工廠模式”只有一個接口匀归。
抽象工廠模式理論上具有無限個接口。
簡單模式比較適用于小項目forward和Redirect(轉發(fā)和重定向有什么區(qū)別)(以問到)
forward(轉發(fā)):是服務器行為耗帕,只需要一次請求穆端,效率高,一般用于用戶登錄場景仿便。屬于同一請求下体啰,所以可以使用request域下的數(shù)據(jù)。
Redirect(重定向屬于):是客戶端行為嗽仪,url第一次請求時response返回一個新的url在客戶端再次請求荒勇,一般用于頁面跳轉。轉發(fā)不行闻坚。java中都有哪些容器
數(shù)組,String,集合容器Collections和Collection有什么區(qū)別沽翔?(以問到)
Collection是單列集合的接口。
Collections是一個包裝類窿凤,不能被實例化仅偎,其中有很多集合操作的靜態(tài)方法跨蟹。List、Set哨颂、Map之間的區(qū)別 (以問到)
List是單列有序集合的接口喷市,有三個主要實現(xiàn)類:
ArrayList:成員可以重復,因為底層是用數(shù)組實現(xiàn)的威恼,內存空間分配是連續(xù)的品姓,查詢效率高,線程是不安全的箫措。允許有null腹备。
Linkedlist:是用雙向鏈表實現(xiàn),內存空間分配分散斤蔓,但是插入操作效率高植酥,線程也是不安全的。允許有null弦牡。
Vector:是用數(shù)組實現(xiàn)的友驮,但是查詢操作比ArrayList的效率低,是線程安全的驾锰,一般不考慮線程問題卸留,用ArrayList。
Set是單列無序集合的接口:
其中HashSet:不允許有null 和重復的元素椭豫,并且是無序的耻瑟,線程不安全。
Map是雙列集合的接口:
其中:
HashMap:每一個元素對應這鍵和值赏酥,并且允許null值和null鍵喳整,但是無序的。HashMap和HashTable的區(qū)別:(感覺每次都會被問裸扶,高頻考點)
首先兩者繼承的父類不同框都,HashMap繼承AbstractMap類,HashTable繼承與Dictionary姓言,但又都同時實現(xiàn)了Map接口瞬项。
二者的線程安全不同,HashMap適用于單線程(多線程要用currentHashMap處理)何荚,是非線程安全的囱淋,HashTable單線程,多線程都可用餐塘,并且是線程安全的妥衣。
HashMap沒有contains方法只有containsKey和containsValue,HashTable三者都有。
HashMap的初始容量是16税手,每次擴容為當前容量的2倍蜂筹;HashTable的初始容量為11,每次擴容為當前容量的2倍+1芦倒;如何決定使用HashMap和HashTree艺挪?
因為HashTree的key要求實現(xiàn)comparable,并默認按升序排序兵扬,所以如果你想要一個有序的結果麻裳,選擇HashTree,但是HashMap又更高的效率器钟,所以一般使用HashMap津坑。
四種會話跟蹤技術:
- 隱藏表單域:<input type=’’hidden”> 作為會話跟蹤,在頁面中不顯示傲霸,但可以獲取其的value值疆瑰。
- URL重寫:URL可以在后面附加參數(shù),和服務器的請求一起發(fā)送昙啄,這些參數(shù)為名字的值對穆役。 試用場景驗證碼。
- Cookie:將部分數(shù)據(jù)綁定在客戶端梳凛,適用于購物車未登錄時孵睬。
- Session:使用setAttribute的方法將對象綁定到會話。例如:權限過濾伶跷。
- 線程的聲明周期:
新建,就緒秘狞,運行叭莫,阻塞,銷毀 - 線程池的五種狀態(tài):(以問)
Running烁试、ShutDown雇初、Stop、Tidying减响、Terminated靖诗。
Spring Ioc Aop: (高頻aop)
- Ioc: 控制反轉 , 控制是創(chuàng)建對象和對對象的管理支示, 反轉是將創(chuàng)建對象和管理交給容器刊橘,我們只需要調用。(spring容器默認調用對象的無參構造)
- Aop:面向切面編程颂鸿,底層是動態(tài)代理促绵,我們只需要著重于找出切面,切面執(zhí)行的時間和執(zhí)行的地點,作用是:解耦合败晴,業(yè)務增強浓冒,代碼復用提高,專注于代碼邏輯尖坤,使業(yè)務和非業(yè)務功能分離稳懒。
[Spring aop知點]http://www.reibang.com/p/c15382863eea
mybatis如何防止sql注入?
框架底層慢味,是JDBC中的PreparedStatement類在起作用场梆,我們使用#{}作為標識符,可以防止注入
-
PreparedStatement:
Minor GC 和 Full GC
Minor GC : 回收新生代贮缕,因為新生代對象存活時間很短辙谜,因此Minor GC會頻繁執(zhí)行, 執(zhí)行的速度一般也會比較感昼。
Full GC: 回收老年代和新生代装哆,老年代對象其存活時間長,因此Full GC很少執(zhí)行定嗓, 執(zhí)行速度會比Minor GC慢很多蜕琴。
- 什么是新生代和老生代
- 新生代(New Generation)
大多數(shù)情況下Java程序中新建的對象都從新生代分配內存。 - 老年代(Old Generation或Tenuring Generation)
用于存放新生代中經(jīng)過多次垃圾回收仍然存活的對象宵溅,例如緩存對象凌简,新建的對象也有可能在老年代上直接分配內存。主要有兩種狀況(由不同的GC實現(xiàn)來決定):一種為大對象恃逻,可通過在啟動參數(shù)上設置-XX:PretenureSizeThreshold=1024(單位為字節(jié)雏搂,默認值為0)來代表當對象超過多大時就不在新生代分配,而是直接在老年代分配寇损,此參數(shù)在新生代采用Parallel Scavenge GC時無效凸郑,Parallel Scavenge GC會根據(jù)運行狀況決定什么對象直接在老年代上分配內存;另一種為大的數(shù)組對象矛市,且數(shù)組中無引用外部對象芙沥。
sql
- UNION 語句:用于將不同表中相同列中查詢的數(shù)據(jù)展示出來;(不包括重復數(shù)據(jù))(結果集的并集)
- UNION ALL 語句:用于將不同表中相同列中查詢的數(shù)據(jù)展示出來浊吏;(包括重復數(shù)據(jù))
使用形式如下:
SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱而昨;
SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱; - 內連接和外連接
1找田、內聯(lián)接(典型的聯(lián)接運算歌憨,使用像 = 或 <> 之類的比較運算符)。包括相等聯(lián)接和自然聯(lián)接墩衙。
內聯(lián)接使用比較運算符根據(jù)每個表共有的列的值匹配兩個表中的行躺孝。
2享扔、外聯(lián)接。外聯(lián)接可以是左向外聯(lián)接植袍、右向外聯(lián)接或完整外部聯(lián)接笆搓。
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯(lián)接的結果集包括 LEFT OUTER子句中指定的左表的所有行暇番,而不僅僅是聯(lián)接列所匹配的行肋拔。如果左表的某行在右表中沒有匹配行编饺,則在相關聯(lián)的結果集行中右表的所有選擇列表列均為空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接厅篓。將返回右表的所有行秀存。如果右表的某行在左表中沒有匹配行,則將為左表返回空值羽氮。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯(lián)接返回左表和右表中的所有行或链。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值档押。如果表之間有匹配行澳盐,則整個結果集行包含基表的數(shù)據(jù)值。
servlet是否是線程安全的令宿,怎么解決叼耙?
Servlet是線程不安全的。Servlet體系是建立在java多線程的基礎之上的,它的生命周期是由Tomcat 來維護的粒没。當客戶端第一次請求Servlet的時候,tomcat會根據(jù)web.xml配置文件實例化servlet筛婉,當又有一個客戶端訪問該servlet的時候,不會再實例化該servlet癞松,也就是多個線程在使用這個實例爽撒。
雖然servlet是單例模式,只有一個對象响蓉,但是依然有線程安全問題匆浙。解決辦法:
- 盡量把成員變量變成局部變量。
- 給servlet對象加鎖厕妖,synchronized
- 實現(xiàn)SingleThreadModel接口。
實現(xiàn)了SingleThreadModel接口的servlet類只能保證在同一時刻挑庶,只有一個線程執(zhí)行該servlet實例的service方法言秸,在tomcat實現(xiàn)中會創(chuàng)建多個servlet實例,即為每個用戶創(chuàng)建一個實例迎捺,這將導致嚴重的性能問題举畸。
實現(xiàn)了SingleThreadModel接口的servlet并不能保證是線程安全的,該接口并不能防止servlet訪問共享資源造成的同步問題凳枝。
但是在分布式環(huán)境中可以創(chuàng)建多個servlet. 目前此接口已被棄用抄沮。
MyISAM與InnoDB最大的不同的是:MyISAM不支持事務跋核,而InnoDB支持事務
具體的不同在于:
MyISAM:
1)不支持事務和外鍵
2)極度強調讀取速度(這方面性能高)
3)不支持崩潰后災難恢復
4)使用的鎖是表鎖
InnoDB:
1)實現(xiàn)了ACID的事務特性,并且如果開啟了事務叛买,隔離級別默認是可重復讀砂代,同時支持外鍵
2)寫速度(百萬級別的數(shù)據(jù))遠遠慢于MyISAM,讀的速度也不是很快率挣,雖然速度慢刻伊,但是增刪有事務不錯,慢點可以接受
3)通過bin-log 進行災難恢復和做數(shù)據(jù)庫主從
4)在說明范圍的情況下可以使用行鎖
如何選擇
默認Innodb
MyISAM:以讀為主的應?程序椒功,?如博客系統(tǒng)捶箱、新聞?戶?站
Innodb:更新(刪除)操作頻率也?,或者要保證數(shù)據(jù)的完整性动漾;并發(fā)量?丁屎,?持事務和外鍵保證數(shù)據(jù)完整性。?如OA?動化辦公系統(tǒng)旱眯。
避免死鎖(銀行家算法):
預防死鎖的幾種策略晨川,會嚴重地損害系統(tǒng)性能。因此在避免死鎖時键思,要施加較弱的限制础爬,從而獲得 較滿意的系統(tǒng)性能。由于在避免死鎖的策略中吼鳞,允許進程動態(tài)地申請資源看蚜。因而,系統(tǒng)在進行資源分配之前預先計算資源分配的安全性赔桌。若此次分配不會導致系統(tǒng)進入不安全狀態(tài)供炎,則將資源分配給進程;否則疾党,進程等待音诫。其中最具有代表性的避免死鎖算法是銀行家算法。
檢測死鎖
首先為每個進程和每個資源指定一個唯一的號碼雪位; 然后建立資源分配表和進程等待表竭钝,
解除死鎖
當發(fā)現(xiàn)有進程死鎖后,便應立即把它從死鎖狀態(tài)中解脫出來雹洗,常采用的方法有:
剝奪資源:從其它進程剝奪足夠數(shù)量的資源給死鎖進程香罐,以解除死鎖狀態(tài);
撤消進程:可以直接撤消死鎖進程或撤消代價最小的進程时肿,直至有足夠的資源可用庇茫,死鎖狀態(tài).消除為止;所謂代價是指優(yōu)先級螃成、運行代價旦签、進程的重要性和價值等查坪。
避免一個線程同時獲取多個鎖 避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源宁炫。 嘗試使用定時鎖偿曙,使用lock.tryLock(timeout)來替代使用內部鎖機制。 對于數(shù)據(jù)庫鎖淋淀,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里遥昧,否則會出現(xiàn)解鎖失敗的情況。
1.因競爭資源發(fā)生死鎖 現(xiàn)象:系統(tǒng)中供多個進程共享的資源的數(shù)目不足以滿足全部進程的需要時朵纷,就會引起對諸資源的競爭而發(fā)生死鎖現(xiàn)象
2.進程推進順序不當發(fā)生死鎖
- volatile
我的理解是炭臭,被volatile修飾的共享變量,就會具有以下兩個特性:
保證了不同線程對該變量操作的內存可見性(一旦更改立即刷新到主存上)袍辞。此外還有線程的工作內存鞋仍。
禁止指令重排序。