欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:jvm Java面試八股文

柚子快報(bào)邀請(qǐng)碼778899分享:jvm Java面試八股文

http://yzkb.51969.com/

目錄

Java基礎(chǔ)

1、Hashmap底層原理

2、如何解決哈希沖突

2.1你知道HahsMap死循環(huán)問(wèn)題嗎 ?

3、Concurrenthashmap 為什么是線程安全的?

TreeMap,HashMap,LinkedHashMap 的區(qū)別?

4、super和this的共同點(diǎn)的區(qū)別

5、final關(guān)鍵字

6、集合

6.1、map

6.2、set

6.3List

6.4、Queu

6.5、Stack

7、ArrayList,Vector, LinkedList 的存儲(chǔ)性能和特性?

8、內(nèi)存泄漏和溢出

9、int和Integer的區(qū)別

10、String、StringBuilder、StringBuffer區(qū)別

11、hashtable和hashmap的區(qū)別

12、方法重載的規(guī)則?

13、方法的重寫(xiě)的規(guī)則

14、thow和thows的區(qū)別

15.、抽象(abstract)類(lèi)和接口的區(qū)別?

16、Java的基本類(lèi)型和字節(jié)大小

17、訪問(wèn)修飾符的區(qū)別訪問(wèn)級(jí)別?

18、HashSet 的底層實(shí)現(xiàn)是什么?

19、為什么重寫(xiě) equals 時(shí)必須重寫(xiě) hashCode 方法?

20、HashSet 和 TreeSet 有什么區(qū)別?

21、Java 中的四大引用分別是什么?

22、數(shù)組在內(nèi)存中如何分配

23、Java 中怎么創(chuàng)建一個(gè)不可變對(duì)象?

24、Java 中++操作符是線程安全的嗎?

25、==與equals()區(qū)別

26、final,finalize 和 finally 的不同之處?

27、Java 的多態(tài)是什么,表現(xiàn)在哪里?**

28、static類(lèi)型有什么特點(diǎn)

29、Java 創(chuàng)建對(duì)象的幾種方式?

30、&和&&的區(qū)別?

31、在 java 源文件中可以有多個(gè)類(lèi)嗎內(nèi)部類(lèi)除外?

32.如何正確的退出多層嵌套循環(huán)?

33.內(nèi)部類(lèi)有什么作用?

34、深拷貝和淺拷貝的區(qū)別

35、值傳遞和引用傳遞

36、成員變量和局部變量的區(qū)別有哪些?

37、靜態(tài)方法和實(shí)例方法有何不同?

38、多態(tài)的優(yōu)點(diǎn)?

39、Java 面向?qū)ο蟮奶卣饔心男┓矫妫?/p>

40、什么是反射

41、反射的作用

42、break 和 continue 的區(qū)別?

43、Collection 和 Collections 的區(qū)別?

44、Error 和 Exception 有什么區(qū)別?

45、Comparable 和 Comparator 接口的區(qū)別?

46、switch 能否作用在 byte,long,String 上?

47、什么是迭代器(Iterator)?

48、Iterator 和 ListIterator 的區(qū)別是什么?

49、Enumeration 接口和 Iterator 接口的區(qū)別有哪些?

50、字符串常量池到底存在于內(nèi)存空間的哪里?

51、Java 中的編譯期常量是什么,使用它又什么風(fēng)險(xiǎn)?

52、用哪兩種方式來(lái)實(shí)現(xiàn)集合的排序?

53、說(shuō)出一些 JDK1.8 的新特性?

Java基礎(chǔ)

1、Hashmap底層原理

它的底層是數(shù)組、鏈表、因此在JDK1.8之后,加上了紅黑樹(shù)

數(shù)組初始默認(rèn)長(zhǎng)度是16,加載因子為0.75,當(dāng)超過(guò)16*0.75時(shí)會(huì)擴(kuò)容到原來(lái)的兩倍;

1、通過(guò)hash算法計(jì)算出當(dāng)前的hashcode值,跟據(jù)數(shù)組長(zhǎng)度取余,跟據(jù)獲得的余數(shù)存儲(chǔ)到相應(yīng)的數(shù)組中。

2、通過(guò)下標(biāo)存儲(chǔ)鍵值時(shí),如果當(dāng)前數(shù)組下標(biāo)沒(méi)有其他鍵直接存入,如果數(shù)組中存有其他鍵值時(shí)則會(huì)發(fā)生hash碰撞。

3、發(fā)生哈希碰撞后,會(huì)繼續(xù)比較該下標(biāo)處所有的key值,如果equals返回true,進(jìn)行覆蓋操作,false,就在最后一個(gè)鍵值對(duì)后面進(jìn)行追加操作,形成單向鏈表。

4、如果鏈表長(zhǎng)度>=8,數(shù)組長(zhǎng)度<64就進(jìn)行擴(kuò)容操作,并且會(huì)重新排序,若>=64則會(huì)形成紅黑樹(shù)。

5、當(dāng)調(diào)用remove方法時(shí),會(huì)刪除元素,當(dāng)紅黑樹(shù)剩余的鍵值對(duì)個(gè)數(shù)<=6時(shí),會(huì)重新還原成單向鏈表。

?

2、如何解決哈希沖突

1、拉鏈法(用的)

2、在哈希法

3、創(chuàng)建公共溢出區(qū)

4、開(kāi)放尋址法:

(1)線性探測(cè)法

(2)平方探測(cè)法

2.1你知道HahsMap死循環(huán)問(wèn)題嗎 ?

HashMap在擴(kuò)容數(shù)組的時(shí)候,會(huì)將舊數(shù)據(jù)遷徙到新數(shù)組中,這個(gè)操作會(huì)將原來(lái)鏈表中的數(shù)據(jù)顛倒,比如a->b->null,轉(zhuǎn)換成b->a->null這個(gè)過(guò)程單線程是沒(méi)有問(wèn)題的,但是在多線程環(huán)境,就可,能會(huì)出現(xiàn)a->b->a->b....,這就是死循環(huán)

?

在JDK1.8后,做了改進(jìn)保證了轉(zhuǎn)換后鏈表順序一致,死循環(huán)問(wèn)題得到了解決。但還是會(huì)出現(xiàn)高并發(fā)時(shí)數(shù)據(jù)丟失的問(wèn)題,因此在多線程情況下還是建議使用ConcurrentHashMap來(lái)保證線程安全問(wèn)題

3、Concurrenthashmap 為什么是線程安全的?

TreeMap,HashMap,LinkedHashMap 的區(qū)別?

LinkedHashMap 可以保證 HashMap 集合有序。存入的順序和取出的順序一致。

TreeMap 實(shí)現(xiàn)SortMap 接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用 Iterator 遍歷 TreeMap 時(shí),得到的記錄是排過(guò)序的。

HashMap 不保證順序,即為無(wú)序的,具有很快的訪問(wèn)速度。

4、super和this的共同點(diǎn)的區(qū)別

this引用當(dāng)前對(duì)象的實(shí)例變量或方法,幫助區(qū)分同名的局部變量和成員變量。

而 super引用父類(lèi)的成員變量或方法,通常用來(lái)調(diào)用父類(lèi)的方法或構(gòu)造函數(shù)。

this 和 super 的共同點(diǎn)在于它們都用于訪問(wèn)對(duì)象的屬性或方法,但 this 指向當(dāng)前實(shí)例,而 super 指向父類(lèi)。

5、final關(guān)鍵字

被final修飾的類(lèi)不能被繼承,修飾方法不能被重寫(xiě),修飾的變量不能改變。

6、集合

6.1、map

鍵值對(duì),鍵值key是不能重復(fù)的,value可以,一個(gè)key對(duì)應(yīng)一個(gè)value

treemap有序,hashmap無(wú)序

6.2、set

不可重復(fù)的集合,只能用iterator實(shí)現(xiàn)單項(xiàng)遍歷

6.3List

有序可重復(fù),用 Iterator 實(shí)現(xiàn)單向遍歷,用ListIterator 實(shí)現(xiàn)雙向遍歷

6.4、Queu

先進(jìn)先出,offer()來(lái)添加元素,使用 poll()來(lái)移除元素

6.5、Stack

遵從后進(jìn)先出原則,

7、ArrayList,Vector, LinkedList 的存儲(chǔ)性能和特性?

ArrayList 和 Vector 都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),Vector用了synchronized方法(線程安全)改查快,而 LinkedList 使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),增刪快

8、內(nèi)存泄漏和溢出

泄露是應(yīng)用程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已經(jīng)申請(qǐng)的內(nèi)存空間,及時(shí)關(guān)閉流和數(shù)據(jù)庫(kù)鏈接釋放

溢出是申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用,分批提交。

9、int和Integer的區(qū)別

Integer是int的包裝類(lèi),int是基本類(lèi)型,直接存儲(chǔ)數(shù)值;Integer是對(duì)象,里面有方法

10、String、StringBuilder、StringBuffer區(qū)別

String字符串常量,不可變,使用字符串拼接時(shí)是不同的 2 個(gè)空間

StringBuffer字符串變量,可變,線程安全,字符串拼接直接在字符串后追加

StringBuilder字符串變量,可變,非線程安全,字符串拼接直接在字符串后追加

11、hashtable和hashmap的區(qū)別

hashtable是線程安全的,不允許key和value值為null,多一個(gè)elements方法

hashmap是非線程安全的,key和value可以為null

12、方法重載的規(guī)則?

方法名一致,參數(shù)列表中參數(shù)的順序,類(lèi)型,個(gè)數(shù)不同。

重載與方法的返回值無(wú)關(guān),存在于父類(lèi)和子類(lèi),同類(lèi)中。

可以?huà)伋霾煌漠惓?,可以有不同修飾符?/p>

13、方法的重寫(xiě)的規(guī)則

參數(shù)列表、方法名、返回值類(lèi)型必須完全一致,構(gòu)造方法不能被重寫(xiě);

final修飾的方法不可以

聲明為 static 的方法不存在重寫(xiě)

訪問(wèn)權(quán)限不能比父類(lèi)低,

異常拋出范圍不能比父類(lèi)大

14、thow和thows的區(qū)別

thow:

在方法體內(nèi),表拋出異常,由方法體內(nèi)的語(yǔ)句處理。執(zhí)行thow就是一定拋出異常

thows:

用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來(lái)進(jìn)行異常的處理。表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這種異常。

15.、抽象(abstract)類(lèi)和接口的區(qū)別?

1、接口中所有的方法都是抽象的。而抽象類(lèi)則可以同時(shí)包含抽象和非抽象的方法。

2、類(lèi)可以實(shí)現(xiàn)所有的接口,但只能繼承一個(gè)抽象類(lèi)

3、類(lèi)實(shí)現(xiàn)接口,必須實(shí)現(xiàn)接口中所有的方法,但是繼承抽象類(lèi)不用,不過(guò)這個(gè)類(lèi)也成抽象類(lèi)

4、抽象類(lèi)可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。

5、Java 接口中聲明的變量默認(rèn)都是 final 的。抽象類(lèi)可以包含非 final 的變量。

7、接口是絕對(duì)抽象的,不可以被實(shí)例化(java 8 已支持在接口中實(shí)現(xiàn)默認(rèn)的方法)。抽象類(lèi)也不

可以被實(shí)例化,但是,如果它包含 main 方法的話(huà)是可以被調(diào)用的。

16、Java的基本類(lèi)型和字節(jié)大小

布爾型 boolean 8 位;字節(jié)型 byte 8 位; 字符型 char 16 位;

短整型 short 16 位;整形 int 32 位; 長(zhǎng)整形 long 64 位;

浮點(diǎn)型 float 32 位;雙精度 double 64 位;

17、訪問(wèn)修飾符的區(qū)別訪問(wèn)級(jí)別?

public:公共的,都可以訪問(wèn)

protected:受保護(hù)的,只要同類(lèi)中、同包下、子類(lèi)中可以訪問(wèn)

沒(méi)有訪問(wèn)修飾符:只能同類(lèi)中、同包下可以訪問(wèn)

private:私有的,只能同類(lèi)中可以訪問(wèn)

18、HashSet 的底層實(shí)現(xiàn)是什么?

底層是hashmap,hashset的值就是hashmap的key存在hashmap

19、為什么重寫(xiě) equals 時(shí)必須重寫(xiě) hashCode 方法?

如果兩個(gè)對(duì)象相等,則hashcode一定相等,但是hashcode默認(rèn)是對(duì)對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值,如果沒(méi)有重寫(xiě)hashcode,兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等

20、HashSet 和 TreeSet 有什么區(qū)別?

hashset是由一個(gè) hash 表來(lái)實(shí)現(xiàn)的,因此,它的元素是無(wú)序的。O(1)

TreeSet 是由一個(gè)樹(shù)形的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,它里面的元素是有序的O(logn)

21、Java 中的四大引用分別是什么?

1、強(qiáng)引用 String s = "abc",只要強(qiáng)引用存在,則垃圾回收器就不會(huì)回收這個(gè)對(duì)象。

2、軟引用 如果內(nèi)存足夠,不回收,如果內(nèi)存不足,則回收

3、弱引用 一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存

4、虛引用 在任何時(shí)候都可能被垃圾回收器回收

22、數(shù)組在內(nèi)存中如何分配

使用 new 關(guān)鍵字創(chuàng)建的時(shí)候,會(huì)在堆上分配內(nèi)存空間,每個(gè)數(shù)組成員是一個(gè)引用(指針)

引用到棧上的空間。

23、Java 中怎么創(chuàng)建一個(gè)不可變對(duì)象?

1.對(duì)象的狀態(tài)在構(gòu)造函數(shù)之后都不能被修改,任何修改應(yīng)該通過(guò)創(chuàng)建一個(gè)新對(duì)象來(lái)實(shí)現(xiàn).

2.所有的對(duì)象屬性應(yīng)該都設(shè)置為 final。

3.對(duì)象創(chuàng)建要正確,例如:對(duì)象的應(yīng)用不能在構(gòu)造函數(shù)中被泄露出去

4.對(duì)象要設(shè)置為 final,確保不要繼承的 Class 修改了 immutability 特性

24、Java 中++操作符是線程安全的嗎?

不是線程安全的操作,它涉及到多個(gè)指令,如讀取變量值,增加,然后存儲(chǔ)回內(nèi)存,這個(gè)過(guò)程可

能會(huì)出現(xiàn)多個(gè)線程交差。

25、==與equals()區(qū)別

一般用==比較基本類(lèi)型,是不是指向同一個(gè)內(nèi)存空間。

用equals比較對(duì)象,只有對(duì)象可以調(diào)用,默認(rèn)是比較對(duì)象地址是否相同,比如 String 的 equals 是比較的內(nèi)容。

26、final,finalize 和 finally 的不同之處?

final 用于聲明屬性,方法和類(lèi),

finally 是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行

finalize 是 Object 類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以

覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等

27、Java 的多態(tài)是什么,表現(xiàn)在哪里?**

允許不同類(lèi)的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式

1、有繼承 2、有重寫(xiě) 3、要有父類(lèi)引用指向子類(lèi)對(duì)象。

28、static類(lèi)型有什么特點(diǎn)

1、靜態(tài)的屬性:隨著類(lèi)的加載而加載,該屬性不在屬于某個(gè)對(duì)象,屬于整個(gè)類(lèi)

2、靜態(tài)的方法:直接用類(lèi)名調(diào)用,靜態(tài)方法里不能訪問(wèn)非靜態(tài)成員變量

3、靜態(tài)類(lèi):不能直接創(chuàng)建對(duì)象,不可被繼承

在 static 方法中不能使用 this 或者 super 關(guān)鍵字

29、Java 創(chuàng)建對(duì)象的幾種方式?

1.new 創(chuàng)建新對(duì)象;

2.通過(guò)反射機(jī)制;

3.采用 clone 機(jī)制;

4.通過(guò)序列化機(jī)制

30、&和&&的區(qū)別?

&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and)

31、在 java 源文件中可以有多個(gè)類(lèi)嗎內(nèi)部類(lèi)除外?

一個(gè).java 源文件中可以包括多個(gè)類(lèi)(不是內(nèi)部類(lèi)),但是單個(gè)文件中只能有一個(gè) public 類(lèi),

并且該 public 類(lèi)必須與文件名相同

32.如何正確的退出多層嵌套循環(huán)?

1、使用標(biāo)號(hào)和 break;

2、通過(guò)在外層循環(huán)中添加標(biāo)識(shí)符

3、return

33.內(nèi)部類(lèi)有什么作用?

1、內(nèi)部類(lèi)可以很好的實(shí)現(xiàn)隱藏,一般的非內(nèi)部類(lèi),是不允許有 private 與 protected 權(quán)限的,

但內(nèi)部類(lèi)可以

2、內(nèi)部類(lèi)擁有外圍類(lèi)的所有元素的訪問(wèn)權(quán)限

3、可是實(shí)現(xiàn)多重繼承

4、可以避免修改接口而實(shí)現(xiàn)同一個(gè)類(lèi)中兩種同名方法的調(diào)用

34、深拷貝和淺拷貝的區(qū)別

淺拷貝:被復(fù)制對(duì)象的所有變量都和原來(lái)對(duì)象相同,但是其他對(duì)象的引用還是指向原來(lái)對(duì)象

深拷貝:其他對(duì)象的引用指向被復(fù)制的新對(duì)象

35、值傳遞和引用傳遞

值傳遞是,傳遞了對(duì)象的一個(gè)副本,在上面做的改變,不會(huì)影響到原對(duì)象

引用傳遞,就是傳遞對(duì)象的引用,對(duì)引用對(duì)象做出的改變,會(huì)影響到原對(duì)象

36、成員變量和局部變量的區(qū)別有哪些?

成員變量是屬于類(lèi)的,在堆內(nèi)存,成員變量是對(duì)象的一部分,它隨著對(duì)象的創(chuàng)建而存在,默認(rèn)值而賦值

局部變量是在方法中定義的,存在于棧內(nèi)存,局部變量隨著方法的調(diào)用而自動(dòng)消失。不會(huì)自動(dòng)賦值

37、靜態(tài)方法和實(shí)例方法有何不同?

調(diào)用靜態(tài)方法可以無(wú)需創(chuàng)建對(duì)象

靜態(tài)方法在訪問(wèn)本類(lèi)的成員時(shí),只允許訪問(wèn)靜態(tài)成員(即靜態(tài)成員變量和靜態(tài)方法),實(shí)例方法則無(wú)此限制

38、多態(tài)的優(yōu)點(diǎn)?

可替換性(substitutability)。多態(tài)對(duì)已存在代碼具有可替換性

可擴(kuò)充性(extensibility)。多態(tài)對(duì)代碼具有可擴(kuò)充性。

39、Java 面向?qū)ο蟮奶卣饔心男┓矫妫?/p>

1、抽象

2、繼承

3、封裝

4、多態(tài)

40、什么是反射

反射就是動(dòng)態(tài)加載對(duì)象,并對(duì)對(duì)象進(jìn)行剖析。

在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法,這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能成為 Java 反射機(jī)制

41、反射的作用

1)在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)

2)在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象

3)在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法

4)在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法

42、break 和 continue 的區(qū)別?

break 用于完全結(jié)束一個(gè)循環(huán)

continue 用于跳過(guò)本次循環(huán),繼續(xù)下次循環(huán)。

43、Collection 和 Collections 的區(qū)別?

Collection 是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有 Set 和 List.

Collections 是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、

線程安全化等操作。

44、Error 和 Exception 有什么區(qū)別?

error表示問(wèn)題很?chē)?yán)重,比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況

Exception 運(yùn)行異?;蛘呔幾g異常

45、Comparable 和 Comparator 接口的區(qū)別?

Comparable 接口只包含一個(gè) compareTo()方法。它返回負(fù)數(shù),0,正數(shù)來(lái)表明輸入對(duì)象小于,等于,大于已經(jīng)存在的對(duì)象。

Comparator 接口包含compare()和 equals()兩個(gè)方法。

46、switch 能否作用在 byte,long,String 上?

switch 不可作用于 long、double、float、boolean,包括他們的包裝類(lèi)

switch 中可以是字符串類(lèi)型,String(Java1.7 以后才可以作用在 String 上)

switch 可以是枚舉類(lèi)型(JDK1.5 之后)

47、什么是迭代器(Iterator)?

Iterator 接口提供了很多對(duì)集合元素進(jìn)行迭代的方法。每一個(gè)集合類(lèi)都包含了可以返回迭代器

實(shí)例的迭代方法。迭代器可以在迭代的過(guò)程中刪除底層集合的元素。

克隆(cloning)或者是序列化(serialization)的語(yǔ)義和含義是跟具體的實(shí)現(xiàn)相關(guān)的。因此,應(yīng)該

由集合類(lèi)的具體實(shí)現(xiàn)來(lái)決定如何被克隆或者是序列化。

48、Iterator 和 ListIterator 的區(qū)別是什么?

Iterator 可用來(lái)遍歷 Set 和 List 集合,但是 ListIterator 只能用來(lái)遍歷 List。

Iterator 對(duì)集合只能是前向遍歷,ListIterator 既可以前向也可以后向。

ListIterator 實(shí)現(xiàn)了 Iterator 接口,并包含其他的功能,比如:增加元素,替換元素,獲取前

一個(gè)和后一個(gè)元素的索引,等等。

49、Enumeration 接口和 Iterator 接口的區(qū)別有哪些?

Enumeration 速度是 Iterator 的 2 倍,同時(shí)占用更少的內(nèi)存。但是,Iterator 遠(yuǎn)遠(yuǎn)比 Enumeration安全,因?yàn)槠渌€程不能夠修改正在被 iterator 遍歷的集合里面的對(duì)象

同時(shí),Iterator 允許調(diào)用者刪除底層集合里面的元素,而 Enumeration 不可以。

50、字符串常量池到底存在于內(nèi)存空間的哪里?

jdk 6.0 字符串常量池在方法區(qū),方法區(qū)的具體體現(xiàn)可以看做是堆中的永久區(qū)。

jdk 7.0 java 虛擬機(jī)規(guī)范中不再聲明方法區(qū),字符串常量池存放在堆空間中

jdk 8.0 java 虛擬機(jī)規(guī)范中又聲明了元空間,字符串常量池存放在元空間中

51、Java 中的編譯期常量是什么,使用它又什么風(fēng)險(xiǎn)?

公共靜態(tài)不可變(public static final )變量也就是我們所說(shuō)的編譯期常量,這里的 public 可

選的。實(shí)際上這些變量在編譯時(shí)會(huì)被替換掉,因?yàn)榫幾g器知道這些變量的值,并且知道這些變量

在運(yùn)行時(shí)不能改變。這種方式存在的一個(gè)問(wèn)題是你使用了一個(gè)內(nèi)部的或第三方庫(kù)中的公有編譯時(shí)

常量,但是這個(gè)值后面被其他人改變了,但是你的客戶(hù)端仍然在使用老的值,甚至你已經(jīng)部署了

一個(gè)新的 jar。為了避免這種情況, 當(dāng)你在更新依賴(lài) JAR 文件時(shí),確保重新編譯你的程序。

52、用哪兩種方式來(lái)實(shí)現(xiàn)集合的排序?

可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然后通

過(guò) Collections.sort() 來(lái)排序。

53、說(shuō)出一些 JDK1.8 的新特性?

Lambda 表達(dá)式,允許像對(duì)象一樣傳遞匿名函數(shù)

Stream API:充分利用現(xiàn)代多核 CPU,可以寫(xiě)出很簡(jiǎn)潔的代碼

Date 與 Time API,最終,有一個(gè)穩(wěn)定、簡(jiǎn)單的日期和時(shí)間庫(kù)可供你使用擴(kuò)展方法,現(xiàn)在,接口中可以有靜態(tài)、默認(rèn)方法

重復(fù)注解,現(xiàn)在你可以將相同的注解在同一類(lèi)型上使用多次。

多線程

1線程創(chuàng)建

繼承Thread

實(shí)現(xiàn)Runnable接口

Callable和FutureTask

線程池

2線程池的底層

線程池,底層其實(shí)就是集合隊(duì)列,里面存儲(chǔ)線程對(duì)象,用的時(shí)候去抽即可,就不要頻繁創(chuàng)建線程了

3創(chuàng)建線程池的方式

JDK提供了關(guān)于創(chuàng)建線程池的方式

- `Executors`: 通過(guò)該類(lèi)提供的靜態(tài)方法來(lái)獲得不同特點(diǎn)的線程池對(duì)象

- newFixedThreadPool

- newCachedThreadPool

- newScheduledThreadPool

- newSingleThreadExecutor

- ...

- `ThreadPoolExecutor`: 通過(guò)submit(Runnable task) 來(lái)提交任務(wù),執(zhí)行任務(wù)

線程池**執(zhí)行任務(wù)**時(shí),可以采用兩種方法:

> execute(): 沒(méi)有返回值,無(wú)法判斷任務(wù)是否執(zhí)行成功

>

> submit():會(huì)返回Future對(duì)象,通過(guò)該對(duì)象判斷任務(wù)是否執(zhí)行成功

線程池使用完要關(guān)閉時(shí):

> shutdown() 關(guān)閉線程池

4ThreadPoolExecutor[重要]

ThreadPoolExecutor 很重要,有7個(gè)參數(shù)

參數(shù)名解釋備注int corePoolSize指定線程池的線程數(shù)量(核心線程數(shù))不能小于0int maximumPoolSize指定線程池可支持的最大線程數(shù)最大數(shù)量>=核心線程數(shù)long keepAliveTime指定臨時(shí)線程的最大存活時(shí)間不能小于0TimeUnit unit指定存活時(shí)間的單位(秒,分,時(shí),天)時(shí)間單位BlockingQueue workQueue指定任務(wù)隊(duì)列ThreadFactory threadFactory指定哪個(gè)線程工廠創(chuàng)建線程RejectedExecutionHandler handler指定線程忙,任務(wù)隊(duì)列滿(mǎn)的時(shí)候新任務(wù)來(lái)了怎么辦?拒絕策略

這幾個(gè)參數(shù)解釋(某大型火鍋店會(huì)例子)

核心線程數(shù)5, 即店里面的固定員工5個(gè) 最大線程數(shù)15,即突然顧客太多,5個(gè)人忙不過(guò)來(lái),臨時(shí)招聘10個(gè)人來(lái)干活 最大存活時(shí)間,即顧客不多的時(shí)候,這些臨時(shí)工可以待多長(zhǎng)時(shí)間 時(shí)間單位 任務(wù)隊(duì)列10,即集合, 固定員工加上臨時(shí)工還處理不了顧客,在店門(mén)口放幾10張凳子 線程工廠, 如何創(chuàng)建出的線程? 即怎么找到的員工 拒絕策略. 當(dāng)固定員工,臨時(shí)工,以及門(mén)口的凳子都坐滿(mǎn)了,不讓吃了,不讓排隊(duì),直接拒絕

問(wèn): 什么時(shí)候創(chuàng)建臨時(shí)線程? 答: 新任務(wù)提交時(shí)發(fā)現(xiàn)核心線程都在忙,任務(wù)隊(duì)列也滿(mǎn)了,并且還可以創(chuàng)建臨時(shí)線程,此時(shí)才會(huì)創(chuàng)建線程

問(wèn):什么時(shí)候開(kāi)始拒絕任務(wù)? 答:核心線程和臨時(shí)線程都在忙,任務(wù)隊(duì)列也滿(mǎn)了,新的任務(wù)過(guò)來(lái)就會(huì)拒絕

5線程調(diào)用start()和run()的區(qū)別

啟動(dòng)線程start()方法,但不會(huì)立即執(zhí)行run()是可以產(chǎn)生必須退出的標(biāo)志來(lái)停止線程

6.線程 B 怎么知道線程 A 修改了變量?

volatile 修飾變量

synchronized 修飾修改變量的方法

wait/notify

while 輪詢(xún)

7.synchronized 和 Volatile,CAS 比較?

synchronized 是悲觀鎖,屬于搶占式,會(huì)引起其他線程阻塞。

volatile 提供多線程共享變量可見(jiàn)性和禁止指令重排序優(yōu)化。

CAS 是基于沖突檢測(cè)的樂(lè)觀鎖(非阻塞)

關(guān)于線程API

1) 創(chuàng)建線程構(gòu)造方法

2) 啟動(dòng)線程start,運(yùn)行線程任務(wù)run

3) 獲得線程對(duì)象Thread.currentThread()

4) 線程休眠sleep()

----------------------

關(guān)于線程同步:

1 什么是線程不安全: 線程數(shù)據(jù)被其他線程篡改?

為什么被篡改? 是因?yàn)楫?dāng)前線程執(zhí)行過(guò)程中,別的線程搶走資源也執(zhí)行

2 什么是線程安全: 當(dāng)前線程執(zhí)行時(shí),不要讓別的線程搶走資源,這樣就不會(huì)篡改數(shù)據(jù)

3 如何做到? 就是給方法加鎖

4 兩種方案: 同步方法,同步代碼塊

5 注意事項(xiàng): 保證鎖對(duì)象是同一個(gè)

----------------------

關(guān)于通信:

1) 什么叫線程通信?

2) 如何做到的? 調(diào)用哪些方法做到...

3) wait和notify使用時(shí)有注意事項(xiàng):

是不是必須要寫(xiě)在同步內(nèi)?

被誰(shuí)調(diào)用?

wait和sleep有什么異同?

--------------------

了解死鎖,了解其他線程安全的方式,了解jdk中線程安全的類(lèi)

線程的方法

線程創(chuàng)建

8、線程的?命周期?線程有?種狀態(tài)

線程通常有五種狀態(tài),創(chuàng)建,就緒,運(yùn)?、阻塞和死亡狀態(tài):

1. 新建狀態(tài)(New):新創(chuàng)建了?個(gè)線程對(duì)象。

2. 就緒狀態(tài)(Runnable):線程對(duì)象創(chuàng)建后,其他線程調(diào)?了該對(duì)象的start?法。該狀態(tài)的線程位于

可運(yùn)?線程池中,變得可運(yùn)?,等待獲取CPU的使?權(quán)。

3. 運(yùn)?狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)?程序代碼。

4. 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因?yàn)槟撤N原因放棄CPU使?權(quán),暫時(shí)停?運(yùn)?。直到線程

進(jìn)?就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)到運(yùn)?狀態(tài)。

5. 死亡狀態(tài)(Dead):線程執(zhí)?完了或者因異常退出了run?法,該線程結(jié)束?命周期。

阻塞的情況?分為三種:

1. 等待阻塞:運(yùn)?的線程執(zhí)?wait?法,該線程會(huì)釋放占?的所有資源,JVM會(huì)把該線程放?“等待

池”中。進(jìn)?這個(gè)狀態(tài)后,是不能?動(dòng)喚醒的,必須依靠其他線程調(diào)?notify或notifyAll?法才能被

喚醒,wait是object類(lèi)的?法

2. 同步阻塞:運(yùn)?的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占?,則JVM會(huì)把該線程放

?“鎖池”中。

3. 其他阻塞:運(yùn)?的線程執(zhí)?sleep或join?法,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀

態(tài)。當(dāng)sleep狀態(tài)超時(shí)、join等待線程終?或者超時(shí)、或者I/O處理完畢時(shí),線程重新轉(zhuǎn)?就緒狀

態(tài)。sleep是Thread類(lèi)的?法

9、sleep()、wait()、join()、yield()之間的的區(qū)別

1. sleep 是 Thread 類(lèi)的靜態(tài)本地?法,wait 則是 Object 類(lèi)的本地?法。

2. sleep?法不會(huì)釋放lock,但是wait會(huì)釋放,?且會(huì)加?到等待隊(duì)列中。

3. sleep?法不依賴(lài)于同步器synchronized,但是wait需要依賴(lài)synchronized關(guān)鍵字。

4. sleep不需要被喚醒(休眠之后推出阻塞),但是wait需要(不指定時(shí)間需要被別?中斷)。

5. sleep ?般?于當(dāng)前線程休眠,或者輪循暫停操作,wait 則多?于多線程之間的通信。

6. sleep 會(huì)讓出 CPU 執(zhí)?時(shí)間且強(qiáng)制上下?切換,? wait 則不?定,wait 后可能還是有機(jī)會(huì)重新競(jìng)

爭(zhēng)到鎖繼續(xù)執(zhí)?的。

7. yield()執(zhí)?后線程直接進(jìn)?就緒狀態(tài),?上釋放了cpu的執(zhí)?權(quán),但是依然保留了cpu的執(zhí)?資

格,所以有可能cpu下次進(jìn)?線程調(diào)度還會(huì)讓這個(gè)線程獲取到執(zhí)?權(quán)繼續(xù)執(zhí)?

8. join()執(zhí)?后線程進(jìn)?阻塞狀態(tài),例如在線程B中調(diào)?線程A的join(),那線程B會(huì)進(jìn)?到阻塞隊(duì)

列,直到線程A結(jié)束或中斷線程

10、對(duì)線程安全的理解

不是線程安全、應(yīng)該是內(nèi)存安全,堆是共享內(nèi)存,可以被所有線程訪問(wèn),當(dāng)多個(gè)線程訪問(wèn)?個(gè)對(duì)象時(shí),

如果不?進(jìn)?額外的同步控制或其他的協(xié)調(diào)操作,調(diào)?這個(gè)對(duì)象的?為都可以獲得正確的結(jié)果,我們就

說(shuō)這個(gè)對(duì)象是線程安全的。

堆是進(jìn)程和線程共有的空間,分全局堆和局部堆。全局堆就是所有沒(méi)有分配的空間,局部堆就是?戶(hù)分

配的空間。堆在操作系統(tǒng)對(duì)進(jìn)程初始化的時(shí)候分配,運(yùn)?過(guò)程中也可以向系統(tǒng)要額外的堆,但是?完了

要還給操作系統(tǒng),要不然就是內(nèi)存泄漏。在Java中,堆是Java虛擬機(jī)所管理的內(nèi)存中最?的?塊,是所

有線程共享的?塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。堆所存在的內(nèi)存區(qū)域的唯??的就是存放對(duì)象實(shí)

例,?乎所有的對(duì)象實(shí)例以及數(shù)組都在這?分配內(nèi)存

棧是每個(gè)線程獨(dú)有的,保存其運(yùn)?狀態(tài)和局部?動(dòng)變量的。棧在線程開(kāi)始的時(shí)候初始化,每個(gè)線程的棧

互相獨(dú)?,因此,棧是線程安全的。操作系統(tǒng)在切換線程的時(shí)候會(huì)?動(dòng)切換棧。棧空間不需要在?級(jí)語(yǔ)

???顯式的分配和釋放。

?前主流操作系統(tǒng)都是多任務(wù)的,即多個(gè)進(jìn)程同時(shí)運(yùn)?。為了保證安全,每個(gè)進(jìn)程只能訪問(wèn)分配給??

的內(nèi)存空間,?不能訪問(wèn)別的進(jìn)程的,這是由操作系統(tǒng)保障的。

在每個(gè)進(jìn)程的內(nèi)存空間中都會(huì)有?塊特殊的公共區(qū)域,通常稱(chēng)為堆(內(nèi)存)。進(jìn)程內(nèi)的所有線程都可以

訪問(wèn)到該區(qū)域,這就是造成問(wèn)題的潛在原因。

柚子快報(bào)邀請(qǐng)碼778899分享:jvm Java面試八股文

http://yzkb.51969.com/

推薦文章

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19467918.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄