前沿拓展:長整形有多少位


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

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

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

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

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

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

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

Map

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

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

Set

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

List

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

Queue

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

Stack

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

用法

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

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

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

4.說出ArrayList,Vector, LinkedList的存儲性能和特性?

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

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

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

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

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

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

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

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

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

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

String 字符串常量 不可變 使用字符串拼接時是不同的2個空間

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

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

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

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

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

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

1、HashTable線程,HashMap非線程

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

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

10. 說幾個常見的編譯時異常?

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

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

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

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

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

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

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

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

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

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

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

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

throw:

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

throws:

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

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

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

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

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

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

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

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

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

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

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

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

短整型 short 16位;整形 int 32位; 長整形 long 64位;

浮點型 float 32位;雙精度 double 64位;

16. 四個訪問修飾符合訪問級別? Protected、 public、沒有訪問修飾符、private17. String和StringBuffer的區(qū)別?

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

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

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

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

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

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

19. 抽象類的意義?

抽象類的意義可以用三句話來概括:

1、為其他子類提供一個公共的類型

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

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

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

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

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

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

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

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

1、強(qiáng)引用

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

2、軟引用(SoftReference)

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

3、弱引用(WeakReference)

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

4、虛引用(PhantomReference)

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

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

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

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

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

24. Java 中怎么創(chuàng)建一個不可變對象?

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

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

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

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

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

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

26. new一個對象的過程和clone一個對象的過程?

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

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

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

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

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

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

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

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

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

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

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

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

多態(tài)要有動態(tài)綁定,否則就不是多態(tài),方法重載也不是多態(tài)(因為方法重載是編譯期決定好的,沒有后期也就是運行期的動態(tài)綁定)當(dāng)滿足這三個條件:1、有繼承2、有重寫3、要有父類引用指向子類對象

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

39. static的用法?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

要有繼承。

要有方法的重寫。

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

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

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

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

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

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

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

49.列出一些常見的運行時異常?

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

SecurityException (異常)

50.什么是反射?

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

51.反射的作用?

1)在運行時判斷任意一個對象所屬的類

2)在運行時構(gòu)造任意一個類的對象

3)在運行時判斷任意一個類所具有的成員變量和方法

4)在運行時調(diào)用任意一個對象的方法

52.獲取class的三種方式?

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

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

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

54.運行時異常與一般異常有何異同?

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

55.List、Map、Set三個接口存取元素時,各有什么特點?

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

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

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

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

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

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

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

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

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

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

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

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ò)展類無意間破壞原來方法的實現(xiàn)的類型都應(yīng)該是final的,在jdk中System,String,StringBuffer等都是基本類型。

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

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

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

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

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

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

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

65.Java支持多繼承么?

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

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

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

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

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

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

Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。

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

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

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

Enumeration速度是Iterator的2倍,同時占用更少的內(nèi)存。但是,Iterator遠(yuǎn)遠(yuǎn)比Enumeration,因為其他線程不能夠修改正在被iterator遍歷的集合里面的對象。同時,Iterator允許調(diào)用者刪除底層集合里面的元素,這對Enumeration來說是不可能的。

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)險?

公共靜態(tài)不可變(public static final )變量也就是我們所說的編譯期常量,這里的 public 可選的。實際上這些變量在編譯時會被替換掉,因為編譯器知道這些變量的值,并且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內(nèi)部的或第三方庫中的公有編譯時常量,但是這個值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經(jīng)部署了一個新的jar。為了避免這種情況, 當(dāng)你在更新依賴 JAR 文件時,重新編譯你的程序。

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

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

73.說出 JDK 1.7 中的三個新特性?

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

74.說出 5 個 JDK 1.8 引入的新特性?

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

75.ArrayList源碼分析?

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

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

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

(4)ArrayList 是非線程類,并發(fā)環(huán)境下,多個線程同時操作 ArrayList,會引發(fā)不可預(yù)知的異常或錯誤。

(5)順序添加很方便

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

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

76.HashMap源碼分析?

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

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

HashMap的擴(kuò)容因子

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

77. ConcurrentHashMap源碼分析?

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

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

|??M]?

拓展知識:長整形有多少位

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

  INT_MAX:int類型的大值

  INT_MIN:int類型的小值

  UINT_MAX:unsigned int類型的大值

  LONG_MAX:長整型的大值

  LONG_MIN:長整型的小值

  ULONG_MAX:長整型的小值

  示例如下:

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

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

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

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

編譯器 允許的 簡略寫法:
long -- 32 位有符號整型
short -- 16 位有符號整型

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

輸入語句,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語言中的長整型和整型的大值和小值,在標(biāo)準(zhǔn)庫頭文件limits.h中以宏的形式定義。用戶可以直接查看或者使用。
INT_MAX:int類型的大值
INT_MIN:int類型的小值
UINT_MAX:unsigned
int類型的大值
LONG_MAX:長整型的大值
LONG_MIN:

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