前沿拓展:長(zhǎng)整形有多少位


很多同學(xué)想知道企業(yè)在招聘Java工程師時(shí)會(huì)提問(wèn)哪些問(wèn)題,千鋒鄭州Java培訓(xùn)老師匯總歷屆學(xué)員求職經(jīng)驗(yàn)并與企業(yè)溝通之后總結(jié)出《Java面試寶典》,涵蓋Java基礎(chǔ)、設(shè)計(jì)模式以及Java框架等考察點(diǎn),一碼當(dāng)先,學(xué)員月薪過(guò)萬(wàn)不是夢(mèng)!

1.final關(guān)鍵字的作用?

被final修飾的類不可以被繼承,被final修飾的方法不可以被重寫,被final修飾的變量不可以被改變.如果修飾引用,那么表示引用不可變,引用指向的內(nèi)容可變.被final修飾的方法,JVM會(huì)嘗試將其內(nèi)聯(lián),以提高運(yùn)行率,被final修飾的常量,在編譯階段會(huì)存入常量池中.

2.abstract class和interface有什么區(qū)別?

聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類是否實(shí)現(xiàn)了接口。

3. Java集合類:list、set、queue、map、stack的特點(diǎn)與用法?

Map

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

TreeMap可以順序,HashMap不順序,即為無(wú)序的,Map中可以將Key和Value單獨(dú)抽取出來(lái),其中KeySet()方法可以將所有的keys抽取成一個(gè)Set,而Values()方法可以將map中所有的values抽取成一個(gè)集合。

Set

不包含重復(fù)元素的集合,set中多包含一個(gè)null元素,只能用Iterator實(shí)現(xiàn)單項(xiàng)遍歷,Set中沒(méi)有同步方法。

List

有序的可重復(fù)集合,可以在任意位置增加刪除元素,用Iterator實(shí)現(xiàn)單向遍歷,也可用ListIterator實(shí)現(xiàn)雙向遍歷。

Queue

Queue遵從先進(jìn)先出原則,使用時(shí)盡量避免add()和remove()方法,而是使用offer()來(lái)添加元素,使用poll()來(lái)移除元素,它的優(yōu)點(diǎn)是可以通過(guò)返回值來(lái)判斷是否成功,LinkedList實(shí)現(xiàn)了Queue接口,Queue通常不允許插入null元素。

Stack

Stack遵從后進(jìn)先出原則,Stack繼承自Vector,它通過(guò)五個(gè)操作對(duì)類Vector進(jìn)行擴(kuò)展,允許將向量視為堆棧,它提供了通常的push和pop操作,以及取堆棧頂點(diǎn)的peek()方法、測(cè)試堆棧是否為空的empty方法等。

用法

如果涉及堆棧,隊(duì)列等操作,建議使用List。

對(duì)于快速插入和刪除元素的,建議使用LinkedList。

如果需要快速隨機(jī)訪問(wèn)元素的,建議使用ArrayList。

4.說(shuō)出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性?

ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。

5.內(nèi)存泄漏和內(nèi)存溢出?

內(nèi)存泄漏(memoryleak),是指應(yīng)用程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已經(jīng)申請(qǐng)的內(nèi)存空間,一次內(nèi)存泄漏危害可以忽略,但如果任其發(fā)展終會(huì)導(dǎo)致內(nèi)存溢出(outofmemory)。如讀取文件后流要進(jìn)行及時(shí)的關(guān)閉以及對(duì)數(shù)據(jù)庫(kù)連接的釋放。

內(nèi)存溢出(outofmemory)是指應(yīng)用程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用。如我們?cè)陧?xiàng)目中對(duì)于大批量數(shù)據(jù)的導(dǎo)入,采用分批量提交的方式。

6. 反射中,Class.forName()和ClassLoader.loadClass()的區(qū)別?

Class.forName(className)方法,內(nèi)部實(shí)際調(diào)用的方法是 Class.forName(className,true,classloader);

第2個(gè)boolean參數(shù)表示類是否需要初始化, Class.forName(className)默認(rèn)是需要初始化,一旦初始化,就會(huì)觸發(fā)目標(biāo)對(duì)象的 static塊代碼執(zhí)行,static參數(shù)也也會(huì)被再次初始化,ClassLoader.loadClass(className)方法,內(nèi)部實(shí)際調(diào)用的方法是 ClassLoader.loadClass(className,false);第2個(gè) boolean參數(shù),表示目標(biāo)對(duì)象是否進(jìn)行鏈接,false表示不進(jìn)行鏈接,由上面介紹可以,不進(jìn)行鏈接意味著不進(jìn)行包括初始化等一些列步驟,那么靜態(tài)塊和靜態(tài)對(duì)象就不會(huì)得到執(zhí)行

7. Int和Integer的區(qū)別?

Integer是int的包裝類型,在拆箱和裝箱中,二者自動(dòng)轉(zhuǎn)換.int是基本類型,直接存數(shù)值;而integer是對(duì)象;用一個(gè)引用指向這個(gè)對(duì)象.由于Integer是一個(gè)對(duì)象,在JVM中對(duì)象需要一定的數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述,相比int而言,其占用的內(nèi)存更大一些.

8. String、StringBuilder、StringBuffer區(qū)別?

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

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

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

1.StringBuilder執(zhí)行率高于StringBuffer高于String.

2.String是一個(gè)常量,是不可變的,所以對(duì)于每一次+=賦值都會(huì)創(chuàng)建一個(gè)新的對(duì)象, StringBuffer和StringBuilder都是可變的,當(dāng)進(jìn)行字符串拼接時(shí)采用append方 法,在原來(lái)的基礎(chǔ)上進(jìn)行追加,所以性能比String要高,又因?yàn)镾tringBuffer 是 線程的而StringBuilder是線程非的,所以StringBuilder的率高于 StringBuffer.

3.對(duì)于大數(shù)據(jù)量的字符串的拼接,采用StringBuffer,StringBuilder.

9. Hashtable和Hashmap的區(qū)別?

1、HashTable線程,HashMap非線程

2、Hashtable不允許 null 值(key 和 value 都不可以),HashMap允許 null 值(key和value都可以)。

3、兩者的遍歷方式大同小異,Hashtable僅僅比HashMap多一個(gè)elements方法。

10. 說(shuō)幾個(gè)常見(jiàn)的編譯時(shí)異常?

SQLException 提供有關(guān)數(shù)據(jù)庫(kù)訪問(wèn)錯(cuò)誤或其他錯(cuò)誤的信息的異常。

IOexception 表示發(fā)生了某種I / O異常的信號(hào)。此類是由失敗或中斷的I / O操作產(chǎn)生的 一般異常類

FileNotFoundException 當(dāng)試圖打開(kāi)指定路徑名表示的文件失敗時(shí),拋出此異常。

ClassNotFoundException 找不到具有指定名稱的類的定義。

EOFException 當(dāng)輸入過(guò)程中意外到達(dá)文件或流的末尾時(shí),拋出此異常。

11. 方法重載的規(guī)則?

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

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

可以拋出不同的異常,可以有不同修飾符。

12. 方法重寫的規(guī)則?

參數(shù)列表、方法名、返回值類型必須完全一致,構(gòu)造方法不能被重寫;聲明為final的方法不能被重寫;聲明為static的方法不存在重寫(重寫和多態(tài)聯(lián)合才有意義);訪問(wèn)權(quán)限不能比父類更低;重寫之后的方法不能拋出更寬泛的異常

13. throw和throws的區(qū)別?

throw:

throw 語(yǔ)句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語(yǔ)句處理。throw是具體向外拋出異常的動(dòng)作,所以它拋出的是一個(gè)異常實(shí)例,執(zhí)行throw一定是拋出了某種異常。

throws:

throws語(yǔ)句是用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來(lái)進(jìn)行異常的處理。throws主要是聲明這個(gè)方法會(huì)拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。throws表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這種異常。

14. 抽象類和接口的區(qū)別?

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

2、類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類

3、類如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類可以不實(shí)現(xiàn)

抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。

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

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

6、Java接口中的成員函數(shù)默認(rèn)是 public 的。抽象類的成員函數(shù)可以是 private,protecte或者是 public 。

7、接口是抽象的,不可以被實(shí)例化(java 8已支持在接口中實(shí)現(xiàn)默認(rèn)的方法)。抽象類也不可以被實(shí)例化,但是,如果它包含 main 方法的話是可以被調(diào)用的。

15. Java的基礎(chǔ)類型和字節(jié)大小?

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

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

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

16. 四個(gè)訪問(wèn)修飾符合訪問(wèn)級(jí)別? Protected、 public、沒(méi)有訪問(wèn)修飾符、private17. String和StringBuffer的區(qū)別?

String和StringBuffer主要區(qū)別是性能:String是不可變對(duì)象,每次對(duì)String類型進(jìn)行操作都等同于產(chǎn)生了一個(gè)新的String對(duì)象,然后指向新的String對(duì)象.所以盡量不要對(duì)String進(jìn)行大量的拼接操作,否則會(huì)產(chǎn)生很多臨時(shí)對(duì)象,導(dǎo)致GC開(kāi)始工作,影響系統(tǒng)性能.

StringBuffer是對(duì)象本身操作,而不是產(chǎn)生新的對(duì)象,因此在有大量拼接的情況下,我們建議使用StringBuffer(線程).

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

HashSet的實(shí)現(xiàn)是依賴于HashMap的,HashSet的值都是存儲(chǔ)在HashMap中的。

在HashSet的構(gòu)造法中會(huì)初始化一個(gè)HashMap對(duì)象,HashSet不允許值重復(fù)。

因此,HashSet的值是作為HashMap的key存儲(chǔ)在HashMap中的,當(dāng)存儲(chǔ)的值已經(jīng)存在時(shí)返回false。

19. 抽象類的意義?

抽象類的意義可以用三句話來(lái)概括:

1、為其他子類提供一個(gè)公共的類型

2、封裝子類中重復(fù)定義的內(nèi)容

3、定義抽象方法,子類雖然有不同的實(shí)現(xiàn),但是定義時(shí)一致的

20. 你為什么重寫equals時(shí)必須重寫hashCode方法?

hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對(duì)象在哈希表中的索引位置。如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的如果兩個(gè)對(duì)象相等,對(duì)兩個(gè)對(duì)象分別調(diào)用equals方法都返回true如果兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的因此,equals方法被覆蓋過(guò),則hashCode方法也必須被覆蓋。

hashCode()的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫hashCode(),則該class的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù)).

21. HashSet和TreeSet有什么區(qū)別?

HashSet是由一個(gè)hash表來(lái)實(shí)現(xiàn)的,因此,它的元素是無(wú)序的。add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(1)。TreeSet是由一個(gè)樹形的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,它里面的元素是有序的。因此,add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(logn)。

22. 強(qiáng)引用和軟引用和弱引用以及虛引用?

1、強(qiáng)引用

普遍的一種引用方式,如String s = "abc",變量s就是字符串“abc”的強(qiáng)引用,只要強(qiáng)引用存在,則垃圾回收器就不會(huì)回收這個(gè)對(duì)象。

2、軟引用(SoftReference)

用于描述還有用但非必須的對(duì)象,如果內(nèi)存足夠,不回收,如果內(nèi)存不足,則回收。一般用于實(shí)現(xiàn)內(nèi)存敏感的高速緩存,軟引用可以和引用隊(duì)列ReferenceQueue聯(lián)合使用,如果軟引用的對(duì)象被垃圾回收,JVM就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。

3、弱引用(WeakReference)

弱引用和軟引用大致相同,弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。

4、虛引用(PhantomReference)

就是形同虛設(shè),與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期。如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。 虛引用主要用來(lái)跟蹤對(duì)象被垃圾回收器回收的活動(dòng)。

虛引用與軟引用和弱引用的一個(gè)區(qū)別在于:

虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。

23. 數(shù)組在內(nèi)存中如何分配?

當(dāng)一個(gè)對(duì)象使用new關(guān)鍵字創(chuàng)建的時(shí)候,會(huì)在堆上分配內(nèi)存空間,然后才返回到對(duì)象的引用。這對(duì)數(shù)組來(lái)說(shuō)也是一樣的,因?yàn)閿?shù)組也是一個(gè)對(duì)象,簡(jiǎn)單的值類型的數(shù)組,每個(gè)數(shù)組成員是一個(gè)引用(指針)引用到棧上的空間。

24. 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特性

25. Java 中 ++ 操作符是線程的嗎?

不是線程的操作。它涉及到多個(gè)指令,如讀取變量值,增加,然后存儲(chǔ)回內(nèi)存,這個(gè)過(guò)程可能會(huì)出現(xiàn)多個(gè)線程交差。

26. new一個(gè)對(duì)象的過(guò)程和clone一個(gè)對(duì)象的過(guò)程?

new 操作符的本意是分配內(nèi)存。程序執(zhí)行到 new 操作符時(shí),首先去看 new 操作符后面的類型,因?yàn)橹懒祟愋?,才能知道要分配多大的?nèi)存空間。分配完內(nèi)存之后,再調(diào)用構(gòu)造函數(shù),填充對(duì)象的各個(gè)域,這一步叫做對(duì)象的初始化,構(gòu)造方法返回后,一個(gè)對(duì)象創(chuàng)建完畢,可以把他的引用(地址)發(fā)布到外部,在外部就可以使用這個(gè)引用操縱這個(gè)對(duì)象。

clone 在第一步是和 new 相似的,都是分配內(nèi)存,調(diào)用 clone 方法時(shí),分配的內(nèi)存和原對(duì)象(即調(diào)用 clone 方法的對(duì)象)相同,然后再使用原對(duì)象中對(duì)應(yīng)的各個(gè)域,填充新對(duì)象的域,填充完成之后,clone方法返回,一個(gè)新的相同的對(duì)象被創(chuàng)建,同樣可以把這個(gè)新對(duì)象的引用發(fā)布到外部。

27. Java中==和equals()的區(qū)別?

使用==比較原生類型如:boolean、int、char等等,使用equals()比較對(duì)象。

1、==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間。equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同。

2、==是指對(duì)內(nèi)存地址進(jìn)行比較。equals()是對(duì)字符串的內(nèi)容進(jìn)行比較。

3、==指引用是否相同,equals()指的是值是否相同。

28. final、finalize 和 finally 的不同之處?

final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

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

finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。

29.Java的多態(tài)表現(xiàn)在哪里?

多態(tài)要有動(dòng)態(tài)綁定,否則就不是多態(tài),方法重載也不是多態(tài)(因?yàn)榉椒ㄖ剌d是編譯期決定好的,沒(méi)有后期也就是運(yùn)行期的動(dòng)態(tài)綁定)當(dāng)滿足這三個(gè)條件:1、有繼承2、有重寫3、要有父類引用指向子類對(duì)象

30.靜態(tài)類型有什么特點(diǎn)?

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

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

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

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

new創(chuàng)建新對(duì)象;通過(guò)反射機(jī)制;采用clone機(jī)制;通過(guò)序列化機(jī)制

32.Object中有哪些公共方法?

Object是所有類的父類,任何類都默認(rèn)繼承Object clone保護(hù)方法,實(shí)現(xiàn)對(duì)象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出CloneNotSupportedException異常。equals在Object中與==是一樣的,子類一般需要重寫該方法。hashCode該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode方法。這個(gè)方法在一些具有哈希功能的Collection中用到。getClass final方法,獲得運(yùn)行時(shí)類型wait使當(dāng)前線程等待該對(duì)象的鎖,當(dāng)前線程必須是該對(duì)象的擁有者,也就是具有該對(duì)象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回。

33.&和&&的區(qū)別?

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

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

一個(gè).java源文件中可以包括多個(gè)類(不是內(nèi)部類),但是單個(gè)文件中只能有一個(gè)public類,并且該public類必須與文件名相同

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

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

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

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

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

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

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

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

37.深拷貝和淺拷貝的區(qū)別是什么?

淺拷貝:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象.換言之,淺拷貝僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象.

深拷貝:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值.而那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象.而不再是原有的那些被引用的對(duì)象.換言之.深拷貝把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍.

38.String是基本數(shù)據(jù)類型嗎?

基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。

java.lang.String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。為了提高率節(jié)省空間,我們應(yīng)該用StringBuffer類

39. static的用法?

Static可以修飾內(nèi)部類、方法、變量、代碼塊;Static修飾的類是靜態(tài)內(nèi)部類;Static修飾的方法是靜態(tài)方法,表示該方法屬于當(dāng)前類的,而不屬于某個(gè)對(duì)象的,靜態(tài)方法也不能被重寫,可以直接使用類名來(lái)調(diào)用。在static方法中不能使用this或者super關(guān)鍵字。

Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實(shí)例所共享,不會(huì)依賴于對(duì)象。靜態(tài)變量在內(nèi)存中只有一份拷貝,在JVM加載類的時(shí)候,只為靜態(tài)分配一次內(nèi)存。

Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來(lái)做程序優(yōu)化的。靜態(tài)代碼塊中的代碼在整個(gè)類加載的時(shí)候只會(huì)執(zhí)行一次。靜態(tài)代碼塊可以有多個(gè),如果有多個(gè),按照先后順序依次執(zhí)行。

40. 什么是值傳遞和引用傳遞?

對(duì)象被值傳遞,意味著傳遞了對(duì)象的一個(gè)副本。因此,就算是改變了對(duì)象副本,也不會(huì)影響源對(duì)象的值,對(duì)象被引用傳遞,意味著傳遞的并不是實(shí)際的對(duì)象,而是對(duì)象的引用。因此,外部對(duì)引用對(duì)象所做的改變會(huì)反映到所有的對(duì)象上。

41. 重載和重寫的區(qū)別?

方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說(shuō)該方法被重寫 (Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。

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

1、從語(yǔ)法形式上,看成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);成員變量可以被public,private,static等修飾符所修飾,而局部變量不能被訪問(wèn)控制修飾符及static所修飾;成員變量和局部變量都能被final所修飾;

2、從變量在內(nèi)存中的存儲(chǔ)方式來(lái)看,成員變量是對(duì)象的一部分,而對(duì)象存在于堆內(nèi)存,局部變量存在于棧內(nèi)存

3、從變量在內(nèi)存中的生存時(shí)間上看,成員變量是對(duì)象的一部分,它隨著對(duì)象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動(dòng)消失。

4、成員變量如果沒(méi)有被賦初值,則會(huì)自動(dòng)以類型的默認(rèn)值而賦值(一種情況例外被final修飾但沒(méi)有被static修飾的成員變量必須顯示地賦值);而局部變量則不會(huì)自動(dòng)賦值。

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

靜態(tài)方法和實(shí)例方法的區(qū)別主要體現(xiàn)在兩個(gè)方面:

在外部調(diào)用靜態(tài)方法時(shí),可以使用"類名.方法名"的方式,也可以使用"對(duì)象名.方法名"的方式。而實(shí)例方法只有后面這種方式。也就是說(shuō),調(diào)用靜態(tài)方法可以無(wú)需創(chuàng)建對(duì)象。

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

44.什么是多態(tài)?

允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)

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

可替換性(substitutability)。多態(tài)對(duì)已存在代碼具有可替換性。例如,多態(tài)對(duì)圓Circle類工作,對(duì)其他任何圓形幾何體,如圓環(huán),也同樣工作。

可擴(kuò)充性(extensibility)。多態(tài)對(duì)代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能。

46. 多態(tài)存在的三個(gè)必要條件?

要有繼承。

要有方法的重寫。

父類引用指向子類對(duì)象(對(duì)于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會(huì)調(diào)用子類中的這個(gè)方法,這就是動(dòng)態(tài)連接)

47. TreeMap、HashMap、LindedHashMap的區(qū)別?

LinkedHashMap可以HashMap集合有序。存入的順序和取出的順序一致。TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過(guò)序的。HashMap不順序,即為無(wú)序的,具有很快的訪問(wèn)速度。HashMap多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步。

48.Java(OOP)面向?qū)ο蟮奶卣饔心男┓矫妫?p>1)抽象:抽象是將一類對(duì)象的共同特征總結(jié)出來(lái)構(gòu)造類的過(guò)程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關(guān)注對(duì)象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么。

2)繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過(guò)程。提供繼承信息的類被稱為父類(超類、基類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時(shí)繼承也是封裝程序中可變因素的重要手段

3)封裝:通常認(rèn)為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的接口。面向?qū)ο蟮谋举|(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自治、封閉的對(duì)象。我們?cè)陬愔芯帉懙姆椒ň褪菍?duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝;我們編寫一個(gè)類就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝??梢哉f(shuō),封裝就是隱藏一切可隱藏的東西,只向外界提供簡(jiǎn)單的編程接口。

4)多態(tài)性:多態(tài)性是指允許不同子類型的對(duì)象對(duì)同一消息作出不同的響應(yīng)。簡(jiǎn)單的說(shuō)就是用同樣的對(duì)象引用調(diào)用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。如果將對(duì)象的方法視為對(duì)象向外界提供的服務(wù),那么運(yùn)行時(shí)的多態(tài)性可以解釋為:當(dāng)A系統(tǒng)訪問(wèn)B系統(tǒng)提供的服務(wù)時(shí),B系統(tǒng)有多種提供服務(wù)的方式,但一切對(duì)A系統(tǒng)來(lái)說(shuō)都是透明的。方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定),而方法重寫(override)實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)。運(yùn)行時(shí)的多態(tài)是面向?qū)ο缶璧臇|西,要實(shí)現(xiàn)多態(tài)需要做兩件事:1. 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);2. 對(duì)象造型(用父類型引用引用子類型對(duì)象,這樣同樣的引用調(diào)用同樣的方法就會(huì)根據(jù)子類對(duì)象的不同而表現(xiàn)出不同的行為)。

49.列出一些常見(jiàn)的運(yùn)行時(shí)異常?

ArithmeticException(算術(shù)異常)ClassCastException (類轉(zhuǎn)換異常)IllegalArgumentException (非法參數(shù)異常)IndexOutOfBoundsException (下標(biāo)越界異常)NullPointerException (空指針異常)

SecurityException (異常)

50.什么是反射?

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

51.反射的作用?

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

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

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

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

52.獲取class的三種方式?

對(duì)象調(diào)用 getClass() 方法來(lái)獲??;類名.class 的方式得到;通過(guò) Class 對(duì)象的 forName() 靜態(tài)方法來(lái)獲取

53.break和continue的區(qū)別?

break和continue 都是用來(lái)控制循環(huán)的語(yǔ)句。break 用于完全結(jié)束一個(gè)循環(huán),跳出循環(huán)體執(zhí)行循環(huán)后面的語(yǔ)句。continue 用于跳過(guò)本次循環(huán),繼續(xù)下次循環(huán)。

54.運(yùn)行時(shí)異常與一般異常有何異同?

異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見(jiàn)運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。

55.List、Map、Set三個(gè)接口存取元素時(shí),各有什么特點(diǎn)?

List以特定索引來(lái)存取元素,可以有重復(fù)元素。Set不能存放重復(fù)元素(用對(duì)象的equals()方法來(lái)區(qū)分元素是否重復(fù))。Map保存鍵值對(duì)(key-value pair)映射,映射關(guān)系可以是一對(duì)一或多對(duì)一

56.Collection和Collections的區(qū)別?

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

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

57.Error和Exception有什么區(qū)別?

error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

58.EJB的生命周期,以及如何管理事務(wù)?

SessionBean:Stateless Session Bean 的生命周期是由容器決定的,當(dāng)客戶機(jī)發(fā)出請(qǐng)求要建立一個(gè)Bean的實(shí)例時(shí),EJB容器不一定要?jiǎng)?chuàng)建一個(gè)新的Bean的實(shí)例供客戶機(jī)調(diào)用,而是隨便找一個(gè)現(xiàn)有的實(shí)例提供給客戶機(jī)。當(dāng)客戶機(jī)第一次調(diào)用一個(gè)Stateful Session Bean 時(shí),容器必須立即在服務(wù)器中創(chuàng)建一個(gè)新的Bean實(shí)例,并關(guān)聯(lián)到客戶機(jī)上,以后此客戶機(jī)調(diào)用Stateful Session Bean 的方法時(shí)容器會(huì)把調(diào)用分派到與此客戶機(jī)相關(guān)聯(lián)的Bean實(shí)例。

EntityBean:Entity Beans能存活相對(duì)較長(zhǎng)的時(shí)間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫(kù)中的數(shù)據(jù)存在,Entity beans就一直存活。而不是按照應(yīng)用程序或者服務(wù)進(jìn)程來(lái)說(shuō)的。即使EJB容器崩潰了,Entity beans也是存活的。Entity Beans生命周期能夠被容器或者 Beans自己管理。EJB通過(guò)以下技術(shù)管理實(shí)務(wù):對(duì)象管理組織(OMG)的對(duì)象實(shí)務(wù)服務(wù)(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),開(kāi)發(fā)組(X/Open)的XA接口。

59.Comparable和Comparator接口的區(qū)別?

Comparable接口只包含一個(gè)compareTo()方法。這個(gè)方法可以個(gè)給兩個(gè)對(duì)象排序。具體來(lái)說(shuō),它返回負(fù)數(shù),0,正數(shù)來(lái)表明輸入對(duì)象小于,等于,大于已經(jīng)存在的對(duì)象。Comparator接口包含compare()和equals()兩個(gè)方法。

60.switch能否作用在byte、long、string上?

switch可作用在char、byte、short、int

switch可作用于char、byte、short、int的包裝類上

switch不可作用于long、double、float、boolean,包括他們的包裝類

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

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

61.jdk中哪些類是不能繼承的?

不能繼承的是類是那些用final關(guān)鍵字修飾的類。一般比較基本的類型或防止擴(kuò)展類無(wú)意間破壞原來(lái)方法的實(shí)現(xiàn)的類型都應(yīng)該是final的,在jdk中System,String,StringBuffer等都是基本類型。

62.Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢?

Set里的元素是不能重復(fù)的,元素重復(fù)與否是使用equals()方法進(jìn)行判斷的。

equals()和==方法決定引用值是否指向同一對(duì)象equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話,返回真值。

63.JDK和JRE的區(qū)別是什么?

Java運(yùn)行時(shí)環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機(jī)。它同時(shí)也包含了執(zhí)行applet需要的瀏覽器插件。Java開(kāi)發(fā)工具包(JDK)是完整的Java軟件開(kāi)發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器),可以讓開(kāi)發(fā)者開(kāi)發(fā)、編譯、執(zhí)行Java應(yīng)用程序。

64.是否可以在static環(huán)境中訪問(wèn)非static變量?

static變量在Java中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被Java虛擬機(jī)載入的時(shí)候,會(huì)對(duì)static變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來(lái)訪問(wèn)非static的變量,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些變量還沒(méi)有被創(chuàng)建出來(lái),還沒(méi)有跟任何實(shí)例關(guān)聯(lián)上。

65.Java支持多繼承么?

不支持,Java不支持多繼承。每個(gè)類都只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。

66.什么是迭代器(Iterator)?

Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法。每一個(gè)集合類都包含了可以返回迭代器實(shí)例的迭代方法。迭代器可以在迭代的過(guò)程中刪除底層集合的元素。

克隆(cloning)或者是序列化(serialization)的語(yǔ)義和含義是跟具體的實(shí)現(xiàn)相關(guān)的。因此,應(yīng)該由集合類的具體實(shí)現(xiàn)來(lái)決定如何被克隆或者是序列化。

67.Iterator和ListIterator的區(qū)別是什么?

下面列出了他們的區(qū)別:

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

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

ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個(gè)和后一個(gè)元素的索引,等等。

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

Enumeration速度是Iterator的2倍,同時(shí)占用更少的內(nèi)存。但是,Iterator遠(yuǎn)遠(yuǎn)比Enumeration,因?yàn)槠渌€程不能夠修改正在被iterator遍歷的集合里面的對(duì)象。同時(shí),Iterator允許調(diào)用者刪除底層集合里面的元素,這對(duì)Enumeration來(lái)說(shuō)是不可能的。

69.List, Set, Map是否繼承自Collection接口?

只有List和Set接口繼承于Collection接口,Map是與Collection并列的接口概念

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

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

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

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

71.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è)值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經(jīng)部署了一個(gè)新的jar。為了避免這種情況, 當(dāng)你在更新依賴 JAR 文件時(shí),重新編譯你的程序。

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

你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然后通過(guò) Collections.sort() 來(lái)排序。

73.說(shuō)出 JDK 1.7 中的三個(gè)新特性?

雖然 JDK 1.7 不像 JDK 5 和 8 一樣的大版本,但是,還是有很多新的特性,如 try-with-resource 語(yǔ)句,這樣你在使用流或者資源的時(shí)候,就不需要手動(dòng)關(guān)閉,Java 會(huì)自動(dòng)關(guān)閉。Fork-Join 池某種程度上實(shí)現(xiàn) Java 版的 Map-reduce。允許 Switch 中有 String 變量和文本。菱形操作符(<>)用于類型推斷,不再需要在變量聲明的右邊申明泛型,因此可以寫出可讀寫更強(qiáng)、更簡(jiǎn)潔的代碼。另一個(gè)值得一提的特性是改良異常處理,如允許在同一個(gè) catch 塊中捕獲多個(gè)異常。

74.說(shuō)出 5 個(gè) JDK 1.8 引入的新特性?

Java 8 在 Java 歷史上是一個(gè)開(kāi)創(chuàng)新的版本,下面 JDK 8 中 5 個(gè)主要的特性: Lambda 表達(dá)式,允許像對(duì)象一樣傳遞匿名函數(shù) Stream API,充分利用現(xiàn)代多核 CPU,可以寫出很簡(jiǎn)潔的代碼 Date 與 Time API,終,有一個(gè)穩(wěn)定、簡(jiǎn)單的日期和時(shí)間庫(kù)可供你使用 擴(kuò)展方法,現(xiàn)在,接口中可以有靜態(tài)、默認(rèn)方法。 重復(fù)注解,現(xiàn)在你可以將相同的注解在同一類型上使用多次。

75.ArrayList源碼分析?

(1)ArrayList 是一種變長(zhǎng)的集合類,基于定長(zhǎng)數(shù)組實(shí)現(xiàn),使用默認(rèn)構(gòu)造方法初始化出來(lái)的容量是10(1.7之后都是延遲初始化,即第一次調(diào)用add方法添加元素的時(shí)候才將elementData容量初始化為10)。

(2)ArrayList 允許空值和重復(fù)元素,當(dāng)往 ArrayList 中添加的元素?cái)?shù)量大于其底層數(shù)組容量時(shí),其會(huì)通過(guò)擴(kuò)容機(jī)制重新生成一個(gè)更大的數(shù)組。ArrayList擴(kuò)容的長(zhǎng)度是原長(zhǎng)度的1.5倍

(3)由于 ArrayList 底層基于數(shù)組實(shí)現(xiàn),所以其可以在 O(1) 復(fù)雜度下完成隨機(jī)查找操作。

(4)ArrayList 是非線程類,并發(fā)環(huán)境下,多個(gè)線程同時(shí)操作 ArrayList,會(huì)引發(fā)不可預(yù)知的異?;蝈e(cuò)誤。

(5)順序添加很方便

(6)刪除和插入需要復(fù)制數(shù)組,性能差(可以使用LinkindList)

(7)Integer.MAX_VALUE - 8 :主要是考慮到不同的JVM,有的JVM會(huì)在加入一些數(shù)據(jù)頭,當(dāng)擴(kuò)容后的容量大于MAX_ARRAY_SIZE,我們會(huì)去比較小需要容量和MAX_ARRAY_SIZE做比較,如果比它大, 只能取Integer.MAX_VALUE,否則是Integer.MAX_VALUE -8。 這個(gè)是從jdk1.7開(kāi)始才有的

76.HashMap源碼分析?

jdk1.8之前l(fā)ist + 鏈表

jdk1.8之后list + 鏈表(當(dāng)鏈表長(zhǎng)度到8時(shí),轉(zhuǎn)化為紅黑樹)

HashMap的擴(kuò)容因子

默認(rèn)0.75,也就是會(huì)浪費(fèi)1/4的空間,達(dá)到擴(kuò)容因子時(shí),會(huì)將list擴(kuò)容一倍,0.75 是時(shí)間與空間一個(gè)平衡值;

77. ConcurrentHashMap源碼分析?

ConcurrentHashMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ),然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問(wèn)其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問(wèn)。有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個(gè)表而而不僅僅是某個(gè)段,這需要按順序鎖定所有段,操作完畢后,又按順序釋放所有段的鎖。這里“按順序”是很重要的,否則極有可能出現(xiàn)死鎖,在ConcurrentHashMap內(nèi)部,段數(shù)組是final的,并且其成員變量實(shí)際上也是final的,但是,僅僅是將數(shù)組聲明為final的并不數(shù)組成員也是final的,這需要實(shí)現(xiàn)上的。這可以不會(huì)出現(xiàn)死鎖,因?yàn)楂@得鎖的順序是固定的。

ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色,HashEntry則用于存儲(chǔ)鍵值對(duì)數(shù)據(jù)。一個(gè)ConcurrentHashMap里包含一個(gè)Segment數(shù)組,Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu), 一個(gè)Segment里包含一個(gè)HashEntry數(shù)組,每個(gè)HashEntry是一個(gè)鏈表結(jié)構(gòu)的元素, 每個(gè)Segment守護(hù)者一個(gè)HashEntry數(shù)組里的元素,當(dāng)對(duì)HashEntry數(shù)組的數(shù)據(jù)進(jìn)行修改時(shí),必須首先獲得它對(duì)應(yīng)的Segment鎖。

|??M]?

拓展知識(shí):長(zhǎng)整形有多少位

  C語(yǔ)言中的長(zhǎng)整型和整型的大值和小值,在標(biāo)準(zhǔn)庫(kù)頭文件limits.h中以宏的形式定義。用戶可以直接查看或者使用。

  INT_MAX:int類型的大值

  INT_MIN:int類型的小值

  UINT_MAX:unsigned int類型的大值

  LONG_MAX:長(zhǎng)整型的大值

  LONG_MIN:長(zhǎng)整型的小值

  ULONG_MAX:長(zhǎng)整型的小值

  示例如下:

   #include <stdio.h>
  #include <limits.h>
  int main()
  {
  printf("INT_MAX:%d\nUINT_MAX:%u\nLONG_MAX:%d\nULONG_MAX:%u\n", INT_MAX, UINT_MAX, LONG_MAX,ULONG_MAX);
  printf("INT_MIN:%d\nLONG_MIN:%d\n",INT_MIN, LONG_MIN);
  return 0;
  }

     


C語(yǔ)言中,只是能夠明確sizeof(short)<sizeof(long),sizeof(short)≤sizeof(int)≤sizeof(long)而已,至于的int具體是16位還是32位的,取決于平臺(tái)和語(yǔ)言實(shí)現(xiàn)(編譯器)。
在VC++(x86)等32位環(huán)境中,int和long都表示32位有符號(hào)整數(shù),范圍是一樣的。
====
[原創(chuàng)回答團(tuán)]

參考資料: 原創(chuàng)

本回答被提問(wèn)者和網(wǎng)友采納
int 和long int 語(yǔ)法上 有區(qū)別

正規(guī)寫法:
long int -- 32 位有符號(hào)整型
short int -- 16 位有符號(hào)整型

編譯器 允許的 簡(jiǎn)略寫法:
long -- 32 位有符號(hào)整型
short -- 16 位有符號(hào)整型

如果寫成 int, 那么是不確定 寫法,長(zhǎng)度由編譯器自行規(guī)定
TC int -- 16 位有符號(hào)整型, 即 short int
VC++ int -- 32 位有符號(hào)整型, 即 long int

輸入語(yǔ)句,long int 用 %ld ,short int 用 %d
編譯器 也許通融 %d 既可讀 long 也可讀 short。

附加MSDN解釋:
int
32-bit integer. On 16-bit platforms, cannot appear in remote functions without a size qualifier such as short, small, long or hyper.

long
32-bit integer.
C語(yǔ)言中的長(zhǎng)整型和整型的大值和小值,在標(biāo)準(zhǔn)庫(kù)頭文件limits.h中以宏的形式定義。用戶可以直接查看或者使用。
INT_MAX:int類型的大值
INT_MIN:int類型的小值
UINT_MAX:unsigned
int類型的大值
LONG_MAX:長(zhǎng)整型的大值
LONG_MIN:

還有其他疑惑?想了解更多?可以點(diǎn)擊 【在線咨詢】