JAVA中高級工程師面試題庫_第1頁
JAVA中高級工程師面試題庫_第2頁
JAVA中高級工程師面試題庫_第3頁
JAVA中高級工程師面試題庫_第4頁
JAVA中高級工程師面試題庫_第5頁
免費預(yù)覽已結(jié)束,剩余37頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、華坤集團(tuán)JAVA面試題庫【中高級開發(fā)工程師適用】IT流程部刊印2020-7-28Java中高級的面試接口有什么用1、通過接口可以實現(xiàn)不相關(guān)類的相同行為,而不需要了解對象所對應(yīng)的類。2、通過接口可以指明多個類需要實現(xiàn)的方法。3、通過接口可以了解對象的交互界面,而不需了解對象所對應(yīng)的類。另:Java是單繼承,接口可以使其實現(xiàn)多繼承的功能說說http,https t辦議HTTP :是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn) (TCP),用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加 高效,使網(wǎng)絡(luò)傳輸減少。HTTPS :是以安全為目標(biāo)的HTTP

2、通道,簡單講是HTTP的安全版.即HTTP下加入SSL層,HTTPS 的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。區(qū)別:1、https協(xié)議需要到ca申請證書,一般免費證書較少,因而需要一定費用。2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是4430 4、http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳 輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。說說tcp/ip協(xié)議族TCP/IP協(xié)議族是一個四層協(xié)議系統(tǒng),自底而上

3、分別是數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用 層。每一層完成不同的功能,且通過若干協(xié)議來實現(xiàn),上層協(xié)議使用下層協(xié)議提供的服務(wù)c1、數(shù)據(jù)鏈路層負(fù)責(zé)幀數(shù)據(jù)的傳遞。2、網(wǎng)絡(luò)層責(zé)數(shù)據(jù)怎樣傳遞過去。3、傳輸層負(fù)責(zé)傳輸數(shù)據(jù)的控制(準(zhǔn)確性、安全性)4、應(yīng)用層負(fù)責(zé)數(shù)據(jù)的展示和獲取。tcp五層網(wǎng)絡(luò)協(xié)議物理層:為數(shù)據(jù)端設(shè)備提供傳送數(shù)據(jù)的通路,數(shù)據(jù)通路可以是一個物理媒體,也可以是多個物理媒體 連接而成。數(shù)據(jù)鏈路層:為網(wǎng)絡(luò)層提供數(shù)據(jù)傳送服務(wù)。網(wǎng)絡(luò)層:路由選擇和中繼、激活,終止網(wǎng)絡(luò)連接、在一條數(shù)據(jù)鏈路上復(fù)用多條網(wǎng)絡(luò)連接,多采取分時復(fù)用技術(shù)、差錯檢測與恢復(fù)、排序,流量控制、服務(wù)選擇、網(wǎng)絡(luò)管理。傳輸層:傳輸層是兩臺計算機經(jīng)過網(wǎng)絡(luò)

4、進(jìn)行數(shù)據(jù)通信時第一個端到端的層次,具有緩沖作用0應(yīng)用層:應(yīng)用層向應(yīng)用程序提供服務(wù)TCP與UDP的區(qū)別工、基于連接與無連接2、TCP要求系統(tǒng)資源較多,UDP較少;3、UDP程序結(jié)構(gòu)較簡單4、流模式(TCP)與數(shù)據(jù)報模式(UDP);5、TCP保證數(shù)據(jù)正確性,UDP可能丟包6、TCP保證數(shù)據(jù)順序,UDP不保證 cookie和session的區(qū)別,分布式環(huán)境怎么保存用戶狀態(tài)1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,考慮到 安全應(yīng)當(dāng)使用session03、session會在一定時間內(nèi)保

5、存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,考 慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKlEo4、單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。分布式環(huán)境下的session (舉例兩種):服務(wù)器session復(fù)制原理:任何一個服務(wù)器上的session發(fā)生改變(增刪改),該節(jié)點會把這個session的所有內(nèi) 容序列化,然后廣播給所有其它節(jié)點,不管其他服務(wù)器需不需要session,以此來保證Session 同步。優(yōu)點:可容錯,各個服務(wù)器間session能夠?qū)崟r響應(yīng)。缺點:會對網(wǎng)絡(luò)負(fù)荷造成一定壓力,如果session量大的話可能會造成網(wǎng)絡(luò)堵塞.拖

6、慢服務(wù) 器性能。session共享機制使用分布式緩存方案比如memcacheds redis,但是要求Memcached或Redis必須是集群。GIT和SVN的區(qū)別1、GIT是分布式的,SVN不是。2、GIT把內(nèi)容按元數(shù)據(jù)方式存儲,而SVN是按文件。3、GIT分支和SVN的分支不同。4、GIT沒有一個全局的版本號,而SVN有。5、GIT的內(nèi)容完整性要優(yōu)于SVN。(一般問會不會用,知道這些區(qū)別貌似也沒卵用)請寫一段棧溢出、堆溢出的代碼遞歸調(diào)用可以導(dǎo)致棧溢出不斷創(chuàng)建對象可以導(dǎo)致堆溢出代碼如下:public class Testpublic void testHeap()%(;)ArrayList

7、list = new ArrayList (2000);)int num=l;public void testStack(Xnum +;this.testStackf);)public static void main(String argsXTest t = new Test ();t.testHeap();t.testStack();)sprmgmvc的核心是什么,請求的流程是怎么處理的,控制反轉(zhuǎn)怎么實現(xiàn)的核心:控制反轉(zhuǎn)和面向切面請求處理流程:1、首先用戶發(fā)送請求到前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一 個頁面控制器進(jìn)行處理并把請求委托給它,即以前的控制器的控制邏輯部

8、分;2、頁面控制器接收到請求后,進(jìn)行功能處理,首先需要收集和綁定請求參數(shù)到一個對象, 并進(jìn)行臉證,然后將命令對象委托給業(yè)務(wù)對象進(jìn)行處理;處理完畢后返回一個 ModelAndView (模型數(shù)據(jù)和邏輯視圖名);3、前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把 模型數(shù)據(jù)傳入以便視圖渲染;4、前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶??刂品崔D(zhuǎn)如何實現(xiàn):我們每次使用spring框架都要配置xml文件,這個xml配置了 bean的id和class。 spring中默認(rèn)的bean為單實例模式,通過bean的class引用反射機制可以創(chuàng)建這個實例。因此,spring框架通過

9、反射替我們創(chuàng)建好了實例并且替我們維護(hù)他們。A需要引用B類,spring框架就會通過xml把B實例的引用傳給了 A的成員變量。mybatis如何處理結(jié)果集MyBatis的結(jié)果集是通過反射來實現(xiàn)的。并不是通過get/set方法。在實體類中無論是否定 義get/set()方法,都是可以接收到的。java的多態(tài)表現(xiàn)在哪里主要有兩種表現(xiàn)形式:重載和重寫重載:是發(fā)生在同一類中,具有相同的方法名,主要是看參數(shù)的個數(shù),類型,順序不同實現(xiàn)方法的 重載的,返回值的類型可以不同。重寫:是發(fā)生在兩個類中(父類和子類),具有相同的方法名,主要看方法中參數(shù),個數(shù),類型必 須相同,返回值的類型必須相同。List和Set比較

10、,各自的子類比較對比一:Arraylist 與 Linked Li st 的比較1、ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因為地址連續(xù),一旦數(shù)據(jù)存儲好了,查詢操 作效率會比較高(在內(nèi)存里是連著放的)。2、因為地址連續(xù),ArrayUst要移動數(shù)據(jù),所以插入和刪除操作效率比較低。3、LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu),地址是任意的,所以在開辟內(nèi)存空間的時候不需要等一 個連續(xù)的地址,對于新增和刪除操作add和remove, Lined List比較占優(yōu)勢。4、因為LinkedList要移動指針,所以查詢操作性能比較低。適用場景分析:當(dāng)需要對數(shù)據(jù)進(jìn)行對此訪問的情況下選用ArrayLis

11、t,當(dāng)需要對數(shù)據(jù)進(jìn)行多次增加刪除修改時 采用 LinkedListo對比二:Array Li st與Vector的比較1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,Array Li st的性能比Vector好。2、當(dāng)Vector或Array Li st中的元素超過它的初始大小時,Vector會將它的容量翻倍,而 ArrayList只增加50%的大小,這樣。Array List就有利于節(jié)約內(nèi)存空間。3、大多數(shù)情況不使用Vector,因為性能不好,但是它支持線程的同步,即某一時刻只有一 個線程能夠?qū)慥ector,避免多線程同時寫

12、而引起的不一致性。4、Vector可以設(shè)置增長因子,而Array List不可以。適用場景分析:1、Vector是線程同步的,所以它也是線程安全的,而Array List是線程異步的,是不安全的 如果不考慮到線程的安全因素,一般用ArrayList效率比較高。2、如果集合中的元素的數(shù)目大于目前集合數(shù)組的長度時,在集合中使用數(shù)據(jù)量比較大的數(shù) 據(jù),用Vector有一定的優(yōu)勢。對比三:HashSet與TreeSet的比較1 .TreeSet是二叉樹實現(xiàn)的,Treeset中的數(shù)據(jù)是自動排好序的,不允許放入null值。2 .HashSet是哈希表實現(xiàn)的,HashSet中的數(shù)據(jù)是無序的,可以放入null,

13、但只能放入一個 null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫中唯一約束。3 .HashSet要求放入的對象必須實現(xiàn)HashCode()方法,放入的對象,是以hashcode碼作為 標(biāo)識的,而具有相同內(nèi)容的String對象,hashcode是一樣,所以放入的內(nèi)容不能重復(fù)。但 是同一個類的對象可以放入不同的實例。適用場景分析:HashSet是基于Hash算法實現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet, 在我們需要排序的功能時,我們才使用TreeSet。HashMap 和 ConcurrentHashMap 的區(qū)別1、HashMap不是線程安全的,而ConcurrentH

14、ashMap是線程安全的。2、ConcurrentHashM叩采用鎖分段技術(shù),將整個Hash桶進(jìn)行了分段segment,也就是將 這個大的數(shù)組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在, 那么在插入元素的時候就需要先找到應(yīng)該插入到哪一個片段segment,然后再在這個片段上 面進(jìn)行插入,而且這里還需要獲取segment鎖。3、ConcurrentHashMap讓鎖的粒度更精細(xì)一些,并發(fā)性能更好。至于兩者的底層實現(xiàn),你如果想通過一篇文章就理解了,那就tooyoung 了,好好找些博文 +看源碼去吧。HashTable 和 ConcurrentHashMap 的

15、區(qū)別它們都可以用于多線程的環(huán)境,但是當(dāng)Hashtable的大小增加到一定的時候,性能會急劇下 降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割 (segmentation),不論它變得多么大,僅僅需要鎖定m叩的某個部分,而其它的線程不需要 等到迭代完成才能訪問mapo簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定 map的某個部分,而Hashtable則會鎖定整個m叩。String,StringBuffer 和 StringBuilder 的區(qū)別工、運行速度,或者說是執(zhí)行速度,在這方面運行速度快慢為:StringBuilder >

16、 StringBuffer > String o2、線程安全上,StringBuilder是線程不安全的,而StnngBuffer是線程安全的。適用場景分析:String :適用于少量的字符串操作的情況StringBuilder :適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況StnngBuffer :適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況wait和sleep的區(qū)別1、sleep。方法是屬于Thread類中的,而wait。方法,則是屬于Object類中的。2、sleep。方法導(dǎo)致了程序暫停執(zhí)行指定的時間,讓出cpu給其他線程,但是他的監(jiān)控狀態(tài) 依然保持著,當(dāng)指定的時間到了又會自動恢復(fù)運

17、行狀態(tài)。所以在調(diào)用sleep。方法的過程中, 線程不會釋放對象鎖。3、調(diào)用wait。方法的時候,線程會放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此 對象調(diào)用not®()方法后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲取對象鎖進(jìn)入運行狀態(tài)。Java面試題大全(2020版)一s Java基礎(chǔ)1 . JDK和JRE有什么區(qū)別?JDK : Java Development Kit的簡稱,java開發(fā)工具包,提供了 java的開發(fā)環(huán)境和運行環(huán)境。_JRE : Java Runtime Environment的簡稱,java運行環(huán)境,為java的運行提供了所需環(huán)境。具體來說JDK其實包含了 JRE,同時

18、還包含了編譯java源碼的編譯器javac,還包含了很 多java程序調(diào)試和分析的工具;簡單來說:如果你需要運行java程序,只需安裝JRE就 可以了,如果你需要編寫java程序,需要安裝JDKo2 .二二和equals的區(qū)別是什么?-解讀對于基本類型和引用類型=的作用效果是不同的,如下所示:基本類型:比較的是值是否相同;引用類型:比較的是引用是否相同;代碼示例:String x = "string"String y = "string',;String z = new String(Mstring");System.out.println(x=

19、y); / trueSystem.out.println(x=z); /falseSystem. out. pri ntl n(x. eq uaI s(y); / trueSystem.out.println(x.equals(z); / true代碼解讀:因為x和y指向的是同一個引用,所以=也是true,而new String。方法則 重寫開辟了內(nèi)存空間,所以二二結(jié)果為false,而equals比較的一直是值,所以結(jié)果都為 true。equals解讀equals本質(zhì)上就是二二,只不過String和Integer等重寫了 equals方法,把它變成了值 比較??聪旅娴拇a就明白了。首先來看默認(rèn)

20、情況下equals比較一個有相同值的對象,代碼如下:class Cat public Cat(String name) = name;private String name;public String getNameQ return name;public void setName(String name) = name;)Cat cl = new Cat(“王磊)Cat c2 = new Cat(“王磊)System.out.println(cl.equals(c2); / false輸出結(jié)果出乎我們的意料,竟然是false?這是怎么回事,看了 equ

21、als源碼就知道了,源碼 如下:public boolean equals(Object obj) return (this = obj);)原來equals本質(zhì)上就是二二。那問題來了,兩個相同值的String對象,為什么返回的是true ?代碼如下:String si = new String(“老王)String s2 = new String("老王)System.out.println(sl.equals(s2); / true同樣的,當(dāng)我們進(jìn)入String的equals方法,找到了答案,代碼如下:public boolean equals(Object anObject)

22、if (this = anObject) return true;)if (anObject instanceof String) String anotherString = (String)anObject;int n = value.length;if (n = anotherString.value.length) char vl = value;char v2 = anotherString.value;int i = 0;while (n- != 0) if(vlD != v20) return false;i + +;)return true;)return false;)原來是

23、String重寫了 Object的equals方法,把引用比較改成了值比較??偨Y(jié):二二對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而equals默 認(rèn)情況下是引用比較,只是很多類重新了 equals方法,比如String. Integer等把它變成 了值比較,所以一般情況下equals比較的是值是否相等。3,兩個對象的hashCode()相同,則equals。也一定為true,對嗎?不對,兩個對象的hashCode。相同,equals。不一定true。代碼示例:String strl = "通話String str2 ="重地”;System.out.prin

24、tln(String.format("strl : %d | str2 : %d", strl.hashCodeQ,str2.hashCode();System.out.println(strl.equals(str2);執(zhí)行的結(jié)果:strl : 1179395 | str2 : 1179395false代碼解讀:很顯然,通話,和“重地"的hashCode。相同,然而equals()則為false,因為在散 列表中,hashCode。相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵 值對相等。4 . final在java中有什么作用?final修飾的

25、類叫最終類,該類不能被繼承。final修飾的方法不能被重寫。final修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。5 . java 中的 Math.round(-1.5)等于多少?等于-L因為在數(shù)軸上取值時,中間值(0.5)向右取整,所以正0.5是往上取整,負(fù)。一5 是直接舍棄。6 . String屬于基礎(chǔ)的數(shù)據(jù)類型嗎?String 不屬于基礎(chǔ)類型,基礎(chǔ)類型有 8 種:byte、boolean、char、short、int、十。at、long、 double,而String屬于對象。7 . java中操作字符串都有哪些類?它們之間有什么區(qū)別?操作字符串的類有:Strings S

26、tringBuffer、StringBuilderoString和StnngBuffers StringBuilder的區(qū)別在于String聲明的是不可變的對象,每次操作 都會生成新的String對象,然后將指針指向新的String對象,而StringBuffers StringBuilder可以在原有對象的基礎(chǔ)上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好 不要使用StringoStringBuffer和StringBuilder最大的區(qū)別在于,StringBuffer是線程安全的,而 StringBuilder是非線程安全的,但StringBuilder的性能卻高于StringBuffe

27、r,所以在單線程 環(huán)境下推薦使用StringBuilder,多線程環(huán)境下推薦使用StringBuffer。8 . String str="i"與 String str=new Stnng("i")一樣嗎?不一樣,因為內(nèi)存的分配方式不一樣。String str="i”的方式,java虛擬機會將其分配到常量 池中;而String str=new String("i")則會被分到堆內(nèi)存中。9 .如何將字符串反轉(zhuǎn)?使用 StringBuilder 或者 StringBuffer 的 reverseQ 方法。示例代碼:/ String

28、Buffer reverseStringBuffer StringBuffer : new StringBuffer);stringBuffer.appendf'abcdefg");System.out.println(stringBuffer.reverse(); / gfedcba/ StringBuilder reverseStringBuilder StringBuilder = new StringBuilderQ;stringBuilder.appendf'abcdefg");System.out.println(stringBuilder.re

29、verse(); / gfedcba10 . String類的常用方法都有那些?indexOf():返回指定字符的索引。charAt():返回指定索引處的字符。replace():字符串替換。trim。:去除字符串兩端空白。split。:分割字符串,返回一個分割后的字符串?dāng)?shù)組。getBytesQ :返回字符串的byte類型數(shù)組。lengthQ :返回字符串長度。toLowerCaseQ -將字符串轉(zhuǎn)成小寫字母。toUpperCaseQ :將字符串轉(zhuǎn)成大寫字符。substringQ :截取字符串。equalsQ :字符串比較。11 .抽象類必須要有抽象方法嗎?不需要,抽象類不一定非要有抽象方法。

30、示例代碼:abstract class Cat public static void sayHi() System. out. println("hi");)上面代碼,抽象類并沒有抽象方法但完全可以正常運行。12 .普通類和抽象類有哪些區(qū)別?普通類不能包含抽象方法,抽象類可以包含抽象方法。抽象類不能直接實例化,普通類可以直接實例化。13 .抽象類能使用final修飾嗎?不能,定義抽象類就是讓其他類繼承的,如果定義為final該類就不能被繼承,這樣彼此就 會產(chǎn)生矛盾,所以final不能修飾抽象類,如下圖所示,編輯器也會提示錯誤信息:14 .接口和抽象類有什么區(qū)別?實現(xiàn):抽象類

31、的子類使用extends來繼承;接口必須使用implements來實現(xiàn)接口。構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。main方法:抽象類可以有main方法,并且我們能運行它;接口不能有main方法。實現(xiàn)數(shù)量:類可以實現(xiàn)很多個接口;但是只能繼承一個抽象類。訪問修飾符:接口中的方法默認(rèn)使用public修飾;抽象類中的方法可以是任意訪問修飾符。15 . java中10流分為幾種?按功能來分:輸入流(input),輸出流(output)o按類型來分:字節(jié)流和字符流。字節(jié)流和字符流的區(qū)別是:字節(jié)流按8位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù).字符流按16 位傳輸以字符為單位輸入輸出數(shù)據(jù)°16 BI0

32、、NIO、AI0有什么區(qū)別?BIO : Block 10同步阻塞式10,就是我們平常使用的傳統(tǒng)10.它的特點是模式簡單使用方 便,并發(fā)處理能力低。NIO :NewlO同步非阻塞10,是傳統(tǒng)10的升級,客戶端和服務(wù)器端通過Channel (通道) 通訊,實現(xiàn)了多路復(fù)用。AI0 : Asynchronous 10是NI0的升級,也叫NI02,實現(xiàn)了異步非堵塞10 ,異步10的 操作基于事件和回調(diào)機制。17 . Files的常用方法都有哪些?Files.existsQ :檢測文件路徑是否存在。Files.creaeFile。:創(chuàng)建文件:.Files.createDirectoryQ :創(chuàng)建文件夾::

33、Files.deleteQ :刪除一個文件或目錄。Files.copy():復(fù)制文件。Files.move():移動文件。Files.sizef):查看文件個數(shù)。Files.readQ .讀取文件。Files.write():寫入文件。 二、容器18 . java容器都有哪些? 常用容器的圖錄:19 . Collection 和 Collections 有什么區(qū)別?java.util.Collection是一個集合接口(集合類的一個頂級接口)。它提供了對集合對象進(jìn)行基 本操作的通用接口方法。Collection接口在Java類庫中有很多具體的實現(xiàn)。Collection接口 的意義是為各種具體的

34、集合提供了最大化的統(tǒng)一操作方式,其直接繼承接口有List與Set。 Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態(tài)方法,用于對集合中 元素進(jìn)行排序、搜索以及線程安全等各種操作。20 . List、Sets Map之間的區(qū)別是什么?21 . HashMap 和 Hashtable 有什么區(qū)別?hashM叩去掉了 HashTable 的 contains 方法,但是加上了 containsValue ()和 containsKey 0方法。hashTable同步的,而HashM叩是非同步的,效率上逼hashTable要高。hashM叩允許空鍵值,而hashTable不允

35、許。22 .如何決定使用HashM叩還是TreeM叩?對于在Map中插入、刪除和定位元素這類操作,HashM叩是最好的選擇。然而,假如你需 要對一個有序的key集合進(jìn)行遍歷,TreeM叩是更好的選擇。基于你的collection的大小, 也許向HashM沖中添加元素會更快,將m叩換為TreeM沖進(jìn)行有序key的遍歷。23 .說一下HashM叩的實現(xiàn)原理?HashM叩概述:HashM叩是基于哈希表的M叩接口的非同步實現(xiàn)。此實現(xiàn)提供所有可選 的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序 恒久不變。HashM叩的數(shù)據(jù)結(jié)構(gòu):在java編程語言中,最基本的結(jié)構(gòu)

36、就是兩種,一個是數(shù)組,另外一 個是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,HashMap也不 例外。HashM叩實際上是一個“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體二當(dāng)我們往Hashmap中put元素時,首先根據(jù)key的hashcode重新計算hash值,根絕hash值 得到這個元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這 個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中 該位置沒有元素.就直接將該元素放到數(shù)組的該位置上。需要注意Jdk 1.8中對HashM叩的實現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點數(shù)據(jù)超過八個

37、之后,該鏈表 會轉(zhuǎn)為紅黑樹來提高查詢效率,從原來的O(n)到O(logn)24 .說一下HashSet的實現(xiàn)原理?HashSet底層由HashM沖實現(xiàn)HashSet的值存放于HashMap的key上HashMap 的 value 統(tǒng)一為 PRESENT25 . ArrayList 和 Linked Li st 的區(qū)別是什么?最明顯的區(qū)別是AnrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機訪問,而Linked Li st的底層數(shù) 據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表,不支持隨機訪問。使用下標(biāo)訪問一個元素,ArrayList的時間復(fù)雜度 是 0(1),而 Linked List 是 0(n)。26 .如何實現(xiàn)數(shù)組和

38、List之間的轉(zhuǎn)換?List轉(zhuǎn)換成為數(shù)組:調(diào)用ArrayList的to Ar ray方法。數(shù)組轉(zhuǎn)換成為List :調(diào)用Arrays的asList方法。27 . ArrayList和Vector的區(qū)別是什么?Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候?qū)α斜磉M(jìn)行改變,你 應(yīng)該使用 CopyOnWriteArrayListoArrayList比Vector快,它因為有同步,不會過載。ArrayList更加通用,因為我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。28 . Array 和 ArrayList 有何區(qū)別?Array可以容納基本類型和

39、對象,而ArrayList只能容納對象。Array是指定大小的,而ArrayList大小是固定的。Array沒有提供ArrayList那么多功能,比如addAlL removeAII和iterator等。29 .在Queue中poll()和removeQ有什么區(qū)別?poll()和remove()都是從隊列中取出一個元素,但是poll()在獲取元素失敗的時候會返回 空,但是removeQ失敗的時候會拋出異常。30 .哪些集合類是線程安全的?vector :就比arraylist多了個同步化機制(線程安全),因為效率較低,現(xiàn)在已經(jīng)不太建議使 用。在web應(yīng)用中.特別是前臺頁面,往往效率(頁面響應(yīng)速

40、度)是優(yōu)先考慮的。statck:堆棧類,先進(jìn)后出。hashtable :就比hashm叩多了個線程安全。enumeration :枚舉,相當(dāng)于迭代器。31 .迭代器Iterator是什么?迭代器是一種設(shè)計模式,它是一個對象.它可以遍歷并選擇序列中的對象,而開發(fā)人員不需 要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為“輕量級"1對象,因為創(chuàng)建它的代價小。32 . Iterator怎么使用?有什么特點?Java中的Iterator功能比較簡單,并且只能單向移動:(1)使用方法iterator。要求容器返回一個Iterator。第一次調(diào)用Iterator的next。方法時,它 返回序列的第一個元

41、素。注意:iterator。方法是java.lang.lterable接口,被Collection繼承。(2)使用next。獲得序列中的下一個元素。 使用hasNext()檢查序列中是否還有元素。使用remove。將迭代器新返回的元素刪除。Iterator是Java迭代器最簡單的實現(xiàn),為List設(shè)計的Listiterator具有更多的功能,它可以從 兩個方向遍歷List,也可以從List中插入和刪除元素。33 . Iterator 和 Listiterator 有什么區(qū)別?Iterator可用來遍歷Set和List集合,但是Listiterator只能用來遍歷List.:Iterator對集合

42、只能是前向遍歷,Listiterator既可以前向也可以后向。Listiterator實現(xiàn)了 Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前 一個和后一個元素的索引,等等。三、多線程35 .并行和并發(fā)有什么區(qū)別?并行是指兩個或者多個事件在同一時刻發(fā)生;而并發(fā)是指兩個或多個事件在同一時間間隔發(fā) 生。并行是在不同實體上的多個事件,并發(fā)是在同一實體上的多個事件。在一臺處理器上“同時”處理多個任務(wù),在多臺處理器上同時處理多個任務(wù)。如hadoop分布 式集群。所以并發(fā)編程的目標(biāo)是充分的利用處理器的每一個核,以達(dá)到最高的處理性能。36 .線程和進(jìn)程的區(qū)別?簡而言之,進(jìn)程是程序運行

43、和資源分配的基本單位,一個程序至少有一個進(jìn)程,一個進(jìn)程至 少有一個線程。進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存資源,減少切 換次數(shù),從而效率更高。線程是進(jìn)程的一個實體,是cpu調(diào)度和分派的基本單位,是比程序 更小的能獨立運行的基本單位。同一進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行。37 .守護(hù)線程是什么?守護(hù)線程(即daemon thread),是個服務(wù)線程,準(zhǔn)確地來說就是服務(wù)其他的線程。38 .創(chuàng)建線程有哪幾種方式?.繼承Thread類創(chuàng)建線程類定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就代表了線程要完成 的任務(wù)。因此把run()方法稱為執(zhí)行體。創(chuàng)建Thr

44、ead子類的實例,即創(chuàng)建了線程對象。調(diào)用線程對象的start。方法來啟動該線程。 通過Runnable接口創(chuàng)建線程類定義runnable接口的實現(xiàn)類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線 程的線程執(zhí)行體。創(chuàng)建Runnable實現(xiàn)類的實例,并依此實例作為Thread的target來創(chuàng)建Thread對象.該 Thread對象才是真正的線程對象。調(diào)用線程對象的start。方法來啟動該線程。31通過Callable和Future創(chuàng)建線程創(chuàng)建Callable接口的實現(xiàn)類,并實現(xiàn)call。方法,該call。方法將作為線程執(zhí)行體,并且有返 回值二創(chuàng)建Callable實現(xiàn)類的實例,

45、使用FutureTask類來包裝Callable對象,該Future!ask對象 封裝了該Callable對象的call。方法的返回值。使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程。調(diào)用FutureTask對象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值。39 .說一下runnable和callable有什么區(qū)別?有點深的問題了,也看出一個Java程序員學(xué)習(xí)知識的廣度。Runnable接口中的run。方法的返回值是void,它做的事情只是純粹地去執(zhí)行run()方法中的 代碼而已;Callable接口中的call。方法是有返回值的,是一個泛型,和Future、

46、FutureTask配合可以用 來獲取異步執(zhí)行的結(jié)果。40 .線程有哪些狀態(tài)?線程通常都有五種狀態(tài),創(chuàng)建、就緒、運行、阻塞和死亡。創(chuàng)建狀態(tài)。在生成線程對象,并沒有調(diào)用該對象的start方法,這是線程處于創(chuàng)建狀態(tài)。就緒狀態(tài)。當(dāng)調(diào)用了線程對象的start方法之后,該線程就進(jìn)入了就緒狀態(tài),但是此時線程 調(diào)度程序還沒有把該線程設(shè)置為當(dāng)前線程,此時處于就緒狀態(tài)。在線程運行之后,從等待或 者睡眠中回來之后,也會處于就緒狀態(tài)。運行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時線程就進(jìn)入了運行狀 態(tài),開始運行run函數(shù)當(dāng)中的代碼。阻塞狀態(tài)。線程正在運行的時候,被暫停,通常是為了等待某個時間的發(fā)生(

47、比如說某項資 源就緒)之后再繼續(xù)運行。sleep,suspend, wait等方法都可以導(dǎo)致線程阻塞。死亡狀態(tài)。如果一個線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后,該線程就會死亡。對 于已經(jīng)死亡的線程,無法再使用start方法令其進(jìn)入就緒41 . sleepQ和waitQ有什么區(qū)別?sleepf):方法是線程類(Thread)的靜態(tài)方法,讓調(diào)用線程進(jìn)入睡眠狀態(tài),讓出執(zhí)行機會給 其他線程,等到休眠時間結(jié)束后,線程進(jìn)入就緒狀態(tài)和其他線程一起競爭cpu的執(zhí)行時間。 因為sleepQ是static靜態(tài)的方法,他不能改變對象的機鎖,當(dāng)一個synchronized塊中調(diào)用 了 sleepQ方法,線程雖

48、然進(jìn)入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問 這個對象。wait() : wait。是Object類的方法,當(dāng)一個線程執(zhí)行到wait方法時,它就進(jìn)入到一個和該對 象相關(guān)的等待池,同時釋放對象的機鎖,使得其他線程能夠訪問,可以通過notiM notifyAII 方法來喚醒等待的線程。42 . notiiy()和 notifyAII。有什么區(qū)別?如果線程調(diào)用了對象的wait。方法,那么線程便會處于該對象的等待池中,等待池中的線程 不會去競爭該對象的鎖。當(dāng)有線程調(diào)用了對象的notifyAII()方法(喚醒所有wait線程)或notify。方法(只隨機喚醒 一個wa匯線程),被喚醒的的線

49、程便會進(jìn)入該對象的鎖池中,鎖池中的線程會去競爭該對 象鎖。也就是說,調(diào)用了 notify后只要一個線程會由等待池進(jìn)入鎖池,而notiiyAll會將該對 象等待池內(nèi)的所有線程移動到鎖池中,等待鎖競爭。優(yōu)先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池 中,唯有線程再次調(diào)用wait。方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼 續(xù)往下執(zhí)行,直到執(zhí)行完了 synchronized代碼塊,它會釋放掉該對象鎖,這時鎖池中的線 程會繼續(xù)競爭該對象鎖。43 .線程的run()和start。有什么區(qū)別?每個線程都是通過某個特定Thread對象所對應(yīng)的方法run()來完成

50、其操作的,方法run()稱 為線程體。通過調(diào)用Thread類的start。方法來啟動一個線程。start。方法來啟動一個線程,真正實現(xiàn)了多線程運行。這時無需等待run方法體代碼執(zhí)行完 畢,可以直接繼續(xù)執(zhí)行下面的代碼;這時此線程是處于就緒狀態(tài),并沒有運行。然后通 過此Thread類調(diào)用方法run()來完成其運行狀態(tài),這里方法run()稱為線程體,它包含了要 執(zhí)行的這個線程的內(nèi)容,Run方法運行結(jié)束,此線程終止。然后CPU再調(diào)度其它線程。run()方法是在本線程里的,只是線程里的一個函數(shù),而不是多線程的。如果直接調(diào)用run(),其 實就相當(dāng)于是調(diào)用了一個普通函數(shù)而已,直接待用run。方法必須等待r

51、un()方法執(zhí)行完畢才 能執(zhí)行下面的代碼,所以執(zhí)行路徑還是只有一條,根本就沒有線程的特征,所以在多線程執(zhí) 行時要使用start。方法而不是run()方法。44 .創(chuàng)建線程池有哪幾種方式?1 newFixedThreadPool(int nThreads)創(chuàng)建一個固定長度的線程池,每當(dāng)提交一個任務(wù)就創(chuàng)建一個線程,直到達(dá)到線程池的最大數(shù) 量,這時線程規(guī)模將不再變化,當(dāng)線程發(fā)生未預(yù)期的錯誤而結(jié)束時,線程池會補充一個新的 線程。 newCachedThread Pool()創(chuàng)建一個可緩存的線程池,如果線程池的規(guī)模超過了處理需求,將自動回收空閑線程,而當(dāng) 需求增加時,則可以自動添加新線程,線程池的規(guī)模不

52、存在任何限制。31 newSingleThreadExecutor()這是一個單線程的Executor,它創(chuàng)建單個工作線程來執(zhí)行任務(wù),如果這個線程異常結(jié)束.會 創(chuàng)建一個新的來替代它;它的特點是能確保依照任務(wù)在隊列中的順序來串行執(zhí)行。4:1. newScheduledThreadPool(int corePoolSize)創(chuàng)建了一個固定長度的線程池,而且以延遲或定時的方式來執(zhí)行任務(wù),類似于Timer。45,線程池都有哪些狀態(tài)?線程池有 5 種狀態(tài):Running ShutDown、Stop、Tidying、Terminatedo線程池各個狀態(tài)切換框架圖:16理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個

53、必要條件,就可以最大可能地避免、預(yù)防和解 除死鎖。所以,在系統(tǒng)設(shè)計、進(jìn)程調(diào)度等方面注意如何不讓這四個必要條件成立,如何確定資源的 合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此,對資源的分配要給予合理的 規(guī)劃。51. Thread Local是什么?有哪些使用場景?線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個線程間共享。Java提 供ThreadLocal類來支持線程局部變量,是一種實現(xiàn)線程安全的方式。但是在管理環(huán)境下(如 web服務(wù)器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期 比任何應(yīng)用變量的生命周期

54、都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java應(yīng) 用就存在內(nèi)存泄露的風(fēng)險。52. 說一下synchronized底層實現(xiàn)原理?synchronized可以保證方法或者代碼塊在運行時,同一時刻只有一個方法可以進(jìn)入到臨界區(qū), 同時它還可以保證共享變量的內(nèi)存可見性。Java中每一個對象都可以作為鎖,這是synchronized實現(xiàn)同步的基礎(chǔ):普通同步方法,鎖是當(dāng)前實例對象靜態(tài)同步方法,鎖是當(dāng)前類的class對象同步方法塊,鎖是括號里面的對象53. synchronized 和 volatile 的區(qū)別是什么?volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,

55、需要從主存 中讀?。籹ynchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻 塞住。volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。volatile僅能實現(xiàn)變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的 修改可見性和原子性。volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。volatile標(biāo)記的變量不會被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化。54. synchronized 和 Lock 有什么區(qū)別?首先synchronized是ja

56、va內(nèi)置關(guān)鍵字,在jvm層面.Lock是個java類; synchronized無法判斷是否獲取鎖的狀態(tài),Lock可以判斷是否獲取到鎖; synchronized會自動釋放鎖(a線程執(zhí)行完同步代碼會釋放鎖;b線程執(zhí)行過程中發(fā)生異常 會釋放鎖),Lock需在finally中手工釋放鎖(unlock。方法釋放鎖),否則容易造成線程死鎖; 用synchronized關(guān)鍵字的兩個線程1和線程2,如果當(dāng)前線程1獲得鎖,線程2線程等待。 如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲 取不到鎖,線程可以不用一直等待就結(jié)束了;synchronized的鎖可重入、不可中斷、

57、非公平,而Lock鎖可重入、可判斷、可公平(兩者 皆可);18但是Java給你提供一種應(yīng)該比你自己好的保存對象狀態(tài)的機制,那就是序列化。什么情況下需要序列化:a)當(dāng)你想把的內(nèi)存中的對象狀態(tài)保存到一個文件中或者數(shù)據(jù)庫中時候;b)當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對象的時候;c)當(dāng)你想通過RMI傳輸對象的時候;59 .動態(tài)代理是什么?有哪些應(yīng)用?動態(tài)代理:當(dāng)想要給實現(xiàn)了某個接口的類中的方法,加一些額外的處理。比如說加日志,加事務(wù)等???以給這個類創(chuàng)建一個代理,故名思議就是創(chuàng)建一個新的類,這個類不僅包含原來類方法的功 能,而且還在原來的基礎(chǔ)上添加了額外處理的新類。這個代理類并不是定義好的,是動態(tài)生 成的。具有解耦意義,靈活,擴(kuò)展性強。動態(tài)代理的應(yīng)用:Spring 的 AOP加事務(wù)加權(quán)限加日志60 .怎么實現(xiàn)動態(tài)代理?首先必

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論