JavaSE面試總結(jié)

  • throw和throws的區(qū)別:
    1.throw代表動(dòng)作,表示拋出一個(gè)異常的動(dòng)作;throws代表一種狀態(tài),代表方法可能有異常拋出
    2.throw用在方法實(shí)現(xiàn)中,而throws用在方法聲明中
    3.throw只能用于拋出一種異常,而throws可以拋出多個(gè)異常

  • final finally finalize的區(qū)別(以問到)
    final:java中的關(guān)鍵字,修飾符。
    A).如果一個(gè)類被聲明為final,就意味著它不能再派生出新的子類,不能作為父類被繼承。因此,一個(gè)類不能同時(shí)被聲明為abstract抽象類的和final的類。
    B).如果將變量或者方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?
      1)被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。
      2)被聲明final的方法只能使用,不能重載,重寫。
    finally:java的一種異常處理機(jī)制。
      finally是對(duì)Java異常處理模型的補(bǔ)充。finally結(jié)構(gòu)使代碼總會(huì)執(zhí)行,而不管無異常發(fā)生。使用finally可以維護(hù)對(duì)象的內(nèi)部狀態(tài),并可以清理非內(nèi)存資源。特別是在關(guān)閉數(shù)據(jù)庫連接這方面,如果程序員把數(shù)據(jù)庫連接的close()方法放到finally中,就會(huì)大大降低程序出錯(cuò)的幾率。
    finalize:Java.lang.Object類中的一個(gè)方法名。
    Java技術(shù)使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去前,做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在Object類中定義的,因此所的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。

  • try-catch-finally哪部分可以省略
    catch 和 finally可以省略一個(gè),不能兩個(gè)都省略。

  • try-catch-finally 如果catch中有return finally還會(huì)執(zhí)行嗎。
    會(huì)的,因?yàn)閒inally是一定會(huì)執(zhí)行的語句,所以return會(huì)在finally之后執(zhí)行。
    finally中的return會(huì)覆蓋catch中的return的值也會(huì)覆蓋try中return的值。

  • 常見的異常類有哪些?
    NullPointerException 當(dāng)應(yīng)用程序試圖訪問空對(duì)象時(shí),則拋出該異常。
    ClasscastException 兩個(gè)類型間轉(zhuǎn)換不兼容時(shí)引發(fā)的運(yùn)行時(shí)異常。
    SQLException 提供關(guān)于數(shù)據(jù)庫訪問錯(cuò)誤或其他錯(cuò)誤信息的異常。
    IOException當(dāng)發(fā)生某種I/O異常時(shí),拋出此異常。
    IndexOfBoundsException 索引越界異常。

  • 簡(jiǎn)單工廠模式和抽象工廠有什么區(qū)別?
    “簡(jiǎn)單工廠模式”使用fw模式建立對(duì)象;“
    抽象工廠模式”則使用迭代模式創(chuàng)建對(duì)象。
    接口數(shù)量不同。“簡(jiǎn)單工廠模式”只有一個(gè)接口。
    抽象工廠模式理論上具有無限個(gè)接口。
    簡(jiǎn)單模式比較適用于小項(xiàng)目

  • forward和Redirect(轉(zhuǎn)發(fā)和重定向有什么區(qū)別)(以問到)
    forward(轉(zhuǎn)發(fā)):是服務(wù)器行為,只需要一次請(qǐng)求,效率高,一般用于用戶登錄場(chǎng)景。屬于同一請(qǐng)求下,所以可以使用request域下的數(shù)據(jù)。
    Redirect(重定向?qū)儆冢菏强蛻舳诵袨?,url第一次請(qǐng)求時(shí)response返回一個(gè)新的url在客戶端再次請(qǐng)求,一般用于頁面跳轉(zhuǎn)。轉(zhuǎn)發(fā)不行。

  • java中都有哪些容器
    數(shù)組,String,集合容器

  • Collections和Collection有什么區(qū)別?(以問到)
    Collection是單列集合的接口。
    Collections是一個(gè)包裝類,不能被實(shí)例化,其中有很多集合操作的靜態(tài)方法。

  • List、Set、Map之間的區(qū)別 (以問到)
    List是單列有序集合的接口,有三個(gè)主要實(shí)現(xiàn)類:
    ArrayList:成員可以重復(fù),因?yàn)榈讓邮怯脭?shù)組實(shí)現(xiàn)的,內(nèi)存空間分配是連續(xù)的,查詢效率高,線程是不安全的。允許有null。
    Linkedlist:是用雙向鏈表實(shí)現(xiàn),內(nèi)存空間分配分散,但是插入操作效率高,線程也是不安全的。允許有null。
    Vector:是用數(shù)組實(shí)現(xiàn)的,但是查詢操作比ArrayList的效率低,是線程安全的,一般不考慮線程問題,用ArrayList。
    Set是單列無序集合的接口:
    其中HashSet:不允許有null 和重復(fù)的元素,并且是無序的,線程不安全。
    Map是雙列集合的接口:
    其中:
    HashMap:每一個(gè)元素對(duì)應(yīng)這鍵和值,并且允許null值和null鍵,但是無序的。

  • HashMap和HashTable的區(qū)別:(感覺每次都會(huì)被問,高頻考點(diǎn))
    首先兩者繼承的父類不同,HashMap繼承AbstractMap類,HashTable繼承與Dictionary,但又都同時(shí)實(shí)現(xiàn)了Map接口。
    二者的線程安全不同,HashMap適用于單線程(多線程要用currentHashMap處理),是非線程安全的,HashTable單線程,多線程都可用,并且是線程安全的。
    HashMap沒有contains方法只有containsKey和containsValue,HashTable三者都有。
    HashMap的初始容量是16,每次擴(kuò)容為當(dāng)前容量的2倍;HashTable的初始容量為11,每次擴(kuò)容為當(dāng)前容量的2倍+1;

  • 如何決定使用HashMap和HashTree?
    因?yàn)镠ashTree的key要求實(shí)現(xiàn)comparable,并默認(rèn)按升序排序,所以如果你想要一個(gè)有序的結(jié)果,選擇HashTree,但是HashMap又更高的效率,所以一般使用HashMap。

四種會(huì)話跟蹤技術(shù):

  1. 隱藏表單域:<input type=’’hidden”> 作為會(huì)話跟蹤,在頁面中不顯示,但可以獲取其的value值。
  2. URL重寫:URL可以在后面附加參數(shù),和服務(wù)器的請(qǐng)求一起發(fā)送,這些參數(shù)為名字的值對(duì)。 試用場(chǎng)景驗(yàn)證碼。
  3. Cookie:將部分?jǐn)?shù)據(jù)綁定在客戶端,適用于購物車未登錄時(shí)。
  4. Session:使用setAttribute的方法將對(duì)象綁定到會(huì)話。例如:權(quán)限過濾。
  • 線程的聲明周期:
    新建,就緒,運(yùn)行,阻塞,銷毀
  • 線程池的五種狀態(tài):(以問)
    Running、ShutDown、Stop、Tidying、Terminated。

Spring Ioc Aop: (高頻aop)

  1. Ioc: 控制反轉(zhuǎn) , 控制是創(chuàng)建對(duì)象和對(duì)對(duì)象的管理, 反轉(zhuǎn)是將創(chuàng)建對(duì)象和管理交給容器,我們只需要調(diào)用。(spring容器默認(rèn)調(diào)用對(duì)象的無參構(gòu)造)
  2. Aop:面向切面編程,底層是動(dòng)態(tài)代理,我們只需要著重于找出切面,切面執(zhí)行的時(shí)間和執(zhí)行的地點(diǎn),作用是:解耦合,業(yè)務(wù)增強(qiáng),代碼復(fù)用提高,專注于代碼邏輯,使業(yè)務(wù)和非業(yè)務(wù)功能分離。

[Spring aop知點(diǎn)]http://www.itdecent.cn/p/c15382863eea

mybatis如何防止sql注入?

框架底層,是JDBC中的PreparedStatement類在起作用,我們使用#{}作為標(biāo)識(shí)符,可以防止注入

  • PreparedStatement:


Minor GC 和 Full GC

Minor GC : 回收新生代,因?yàn)樾律鷮?duì)象存活時(shí)間很短,因此Minor GC會(huì)頻繁執(zhí)行, 執(zhí)行的速度一般也會(huì)比較。
Full GC: 回收老年代和新生代,老年代對(duì)象其存活時(shí)間長(zhǎng),因此Full GC很少執(zhí)行, 執(zhí)行速度會(huì)比Minor GC慢很多。

  • 什么是新生代和老生代
  1. 新生代(New Generation)
    大多數(shù)情況下Java程序中新建的對(duì)象都從新生代分配內(nèi)存。
  2. 老年代(Old Generation或Tenuring Generation)
    用于存放新生代中經(jīng)過多次垃圾回收仍然存活的對(duì)象,例如緩存對(duì)象,新建的對(duì)象也有可能在老年代上直接分配內(nèi)存。主要有兩種狀況(由不同的GC實(shí)現(xiàn)來決定):一種為大對(duì)象,可通過在啟動(dòng)參數(shù)上設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)值為0)來代表當(dāng)對(duì)象超過多大時(shí)就不在新生代分配,而是直接在老年代分配,此參數(shù)在新生代采用Parallel Scavenge GC時(shí)無效,Parallel Scavenge GC會(huì)根據(jù)運(yùn)行狀況決定什么對(duì)象直接在老年代上分配內(nèi)存;另一種為大的數(shù)組對(duì)象,且數(shù)組中無引用外部對(duì)象。

sql

  • UNION 語句:用于將不同表中相同列中查詢的數(shù)據(jù)展示出來;(不包括重復(fù)數(shù)據(jù))(結(jié)果集的并集)
  • UNION ALL 語句:用于將不同表中相同列中查詢的數(shù)據(jù)展示出來;(包括重復(fù)數(shù)據(jù))
    使用形式如下:
    SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
    SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
  • 內(nèi)連接和外連接
    1、內(nèi)聯(lián)接(典型的聯(lián)接運(yùn)算,使用像 = 或 <> 之類的比較運(yùn)算符)。包括相等聯(lián)接和自然聯(lián)接。
    內(nèi)聯(lián)接使用比較運(yùn)算符根據(jù)每個(gè)表共有的列的值匹配兩個(gè)表中的行。
    2、外聯(lián)接。外聯(lián)接可以是左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接。
    1)LEFT JOIN或LEFT OUTER JOIN
    左向外聯(lián)接的結(jié)果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。
    2)RIGHT JOIN 或 RIGHT OUTER JOIN
    右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
    3)FULL JOIN 或 FULL OUTER JOIN
    完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。

servlet是否是線程安全的,怎么解決?

Servlet是線程不安全的。Servlet體系是建立在java多線程的基礎(chǔ)之上的,它的生命周期是由Tomcat 來維護(hù)的。當(dāng)客戶端第一次請(qǐng)求Servlet的時(shí)候,tomcat會(huì)根據(jù)web.xml配置文件實(shí)例化servlet,當(dāng)又有一個(gè)客戶端訪問該servlet的時(shí)候,不會(huì)再實(shí)例化該servlet,也就是多個(gè)線程在使用這個(gè)實(shí)例。
雖然servlet是單例模式,只有一個(gè)對(duì)象,但是依然有線程安全問題。解決辦法:

  1. 盡量把成員變量變成局部變量。
  2. 給servlet對(duì)象加鎖,synchronized
  3. 實(shí)現(xiàn)SingleThreadModel接口。
    實(shí)現(xiàn)了SingleThreadModel接口的servlet類只能保證在同一時(shí)刻,只有一個(gè)線程執(zhí)行該servlet實(shí)例的service方法,在tomcat實(shí)現(xiàn)中會(huì)創(chuàng)建多個(gè)servlet實(shí)例,即為每個(gè)用戶創(chuàng)建一個(gè)實(shí)例,這將導(dǎo)致嚴(yán)重的性能問題。
    實(shí)現(xiàn)了SingleThreadModel接口的servlet并不能保證是線程安全的,該接口并不能防止servlet訪問共享資源造成的同步問題。
    但是在分布式環(huán)境中可以創(chuàng)建多個(gè)servlet. 目前此接口已被棄用。

MyISAM與InnoDB最大的不同的是:MyISAM不支持事務(wù),而InnoDB支持事務(wù)

具體的不同在于:

MyISAM:

1)不支持事務(wù)和外鍵
2)極度強(qiáng)調(diào)讀取速度(這方面性能高)
3)不支持崩潰后災(zāi)難恢復(fù)
4)使用的鎖是表鎖

InnoDB:

1)實(shí)現(xiàn)了ACID的事務(wù)特性,并且如果開啟了事務(wù),隔離級(jí)別默認(rèn)是可重復(fù)讀,同時(shí)支持外鍵
2)寫速度(百萬級(jí)別的數(shù)據(jù))遠(yuǎn)遠(yuǎn)慢于MyISAM,讀的速度也不是很快,雖然速度慢,但是增刪有事務(wù)不錯(cuò),慢點(diǎn)可以接受
3)通過bin-log 進(jìn)行災(zāi)難恢復(fù)和做數(shù)據(jù)庫主從
4)在說明范圍的情況下可以使用行鎖
如何選擇

默認(rèn)Innodb
MyISAM:以讀為主的應(yīng)?程序,?如博客系統(tǒng)、新聞?戶?站
Innodb:更新(刪除)操作頻率也?,或者要保證數(shù)據(jù)的完整性;并發(fā)量?,?持事務(wù)和外鍵保證數(shù)據(jù)完整性。?如OA?動(dòng)化辦公系統(tǒng)。

避免死鎖(銀行家算法):

預(yù)防死鎖的幾種策略,會(huì)嚴(yán)重地?fù)p害系統(tǒng)性能。因此在避免死鎖時(shí),要施加較弱的限制,從而獲得 較滿意的系統(tǒng)性能。由于在避免死鎖的策略中,允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源。因而,系統(tǒng)在進(jìn)行資源分配之前預(yù)先計(jì)算資源分配的安全性。若此次分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則將資源分配給進(jìn)程;否則,進(jìn)程等待。其中最具有代表性的避免死鎖算法是銀行家算法。

檢測(cè)死鎖
首先為每個(gè)進(jìn)程和每個(gè)資源指定一個(gè)唯一的號(hào)碼; 然后建立資源分配表和進(jìn)程等待表,
解除死鎖
當(dāng)發(fā)現(xiàn)有進(jìn)程死鎖后,便應(yīng)立即把它從死鎖狀態(tài)中解脫出來,常采用的方法有:
剝奪資源:從其它進(jìn)程剝奪足夠數(shù)量的資源給死鎖進(jìn)程,以解除死鎖狀態(tài);
撤消進(jìn)程:可以直接撤消死鎖進(jìn)程或撤消代價(jià)最小的進(jìn)程,直至有足夠的資源可用,死鎖狀態(tài).消除為止;所謂代價(jià)是指優(yōu)先級(jí)、運(yùn)行代價(jià)、進(jìn)程的重要性和價(jià)值等。
避免一個(gè)線程同時(shí)獲取多個(gè)鎖 避免一個(gè)線程在鎖內(nèi)同時(shí)占用多個(gè)資源,盡量保證每個(gè)鎖只占用一個(gè)資源。 嘗試使用定時(shí)鎖,使用lock.tryLock(timeout)來替代使用內(nèi)部鎖機(jī)制。 對(duì)于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個(gè)數(shù)據(jù)庫連接里,否則會(huì)出現(xiàn)解鎖失敗的情況。
1.因競(jìng)爭(zhēng)資源發(fā)生死鎖 現(xiàn)象:系統(tǒng)中供多個(gè)進(jìn)程共享的資源的數(shù)目不足以滿足全部進(jìn)程的需要時(shí),就會(huì)引起對(duì)諸資源的競(jìng)爭(zhēng)而發(fā)生死鎖現(xiàn)象
2.進(jìn)程推進(jìn)順序不當(dāng)發(fā)生死鎖

  • volatile
    我的理解是,被volatile修飾的共享變量,就會(huì)具有以下兩個(gè)特性:
    保證了不同線程對(duì)該變量操作的內(nèi)存可見性(一旦更改立即刷新到主存上)。此外還有線程的工作內(nèi)存。
    禁止指令重排序。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容