最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java基礎(chǔ)面試題

2023-02-09 03:41 作者:茶曉i  | 我要投稿

一、面向?qū)ο蠛图蠈n}

1. 面向?qū)ο蠛兔嫦蜻^程的區(qū)別

面向過程:是分析解決問題的步驟,然后用函數(shù)把這些步驟一步一步地實現(xiàn),然后在使用的時候一一調(diào)用則可。性能較高,所以單片機(jī)、嵌入式開發(fā)等一般采用面向過程開發(fā)

面向?qū)ο?/strong>:是把構(gòu)成問題的事務(wù)分解成各個對象,而建立對象的目的也不是為了完成一個個步驟,而是為了描述某個事物在解決整個問題的過程中所發(fā)生的行為。面向?qū)ο笥蟹庋b、繼承、多態(tài)的特性,所以易維護(hù)、易復(fù)用、易擴(kuò)展??梢栽O(shè)計出低耦合的系統(tǒng)。 但是性能上來說,比面向過程要低。

OOP和AOP

2. 介紹下Java中的基本數(shù)據(jù)類型



boolean: int 4個字節(jié)

需要注意:

  1. int是基本數(shù)據(jù)類型,Integer是int的封裝類,是引用類型。int默認(rèn)值是0,而Integer默認(rèn)值是null,所以Integer能區(qū)分出0和null的情況。一旦java看到null,就知道這個引用還沒有指向某個對象,再任何引用使用前,必須為其指定一個對象,否則會報錯。

  2. 基本數(shù)據(jù)類型在聲明時系統(tǒng)會自動給它分配空間,而引用類型聲明時只是分配了引用空間,必須通過實例化開辟數(shù)據(jù)空間之后才可以賦值。數(shù)組對象也是一個引用對象,將一個數(shù)組賦值給另一個數(shù)組時只是復(fù)制了一個引用,所以通過某一個數(shù)組所做的修改在另一個數(shù)組中也看的見。雖然定義了boolean這種數(shù)據(jù)類型,但是只對它提供了非常有限的支持。在Java虛擬機(jī)中沒有任何供boolean值專用的字節(jié)碼指令,Java語言表達(dá)式所操作的boolean值,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來代替,而boolean數(shù)組將會被編碼成Java虛擬機(jī)的byte數(shù)組,每個元素boolean元素占8位。這樣我們可以得出boolean類型占了單獨使用是4個字節(jié),在數(shù)組中又是1個字節(jié)。使用int的原因是,對于當(dāng)下32位的處理器(CPU)來說,一次處理數(shù)是32位(這里不是指的是32/64位系統(tǒng),而是指CPU硬件層面),具有高效存取的特點。

3. 標(biāo)識符的命名規(guī)則

標(biāo)識符的含義: 是指在程序中,我們自己定義的內(nèi)容,譬如,類的名字,方法名稱以及變量名稱等等,都是標(biāo)識符。

命名規(guī)則:(硬性要求) 標(biāo)識符可以包含英文字母,0-9的數(shù)字,$以及_ 標(biāo)識符不能以數(shù)字開頭,標(biāo)識符不是關(guān)鍵字 命名規(guī)范:(非硬性要求) 類名規(guī)范:首字符大寫,后面每個單詞首字母大寫(大駝峰式)。 變量名規(guī)范:首字母小寫,后面每個單詞首字母大寫(小駝峰式)。 方法名規(guī)范:同變量名。

4. instanceof關(guān)鍵字的作用

instanceof 嚴(yán)格來說是Java中的一個雙目運算符,用來測試一個對象是否為一個類的實例,用法 為:

其中 obj 為一個對象,Class 表示一個類或者一個接口,當(dāng) obj 為 Class 的對象,或者是其直接或間接子類,或者是其接口的實現(xiàn)類,結(jié)果result 都返回 true,否則返回false。 注意:編譯器會檢查 obj 是否能轉(zhuǎn)換成右邊的class類型,如果不能轉(zhuǎn)換則直接報錯,如果不能確定類型,則通過編譯,具體看運行時定。

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

重寫(Override) ??從字面上看,重寫就是 重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類并不想原封不動的繼承父類中的某個方法,所以在方法名,參數(shù)列表,返回類型(除過子類中方法的返回值是父類中方法返回值的子類時)都相同的情況下, 對方法體進(jìn)行修改或重寫,這就是重寫。但要注意子類函數(shù)的訪問修飾權(quán)限不能少于父類的。

重寫 總結(jié):

  1. 發(fā)生在父類與子類之間

  2. 方法名,參數(shù)列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同

  3. 訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)

  4. 重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱臋z查型異常

重載(Overload)

??在一個類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個數(shù)不同甚至是參數(shù)順序不同)則視為重載。同時,重載對返回類型沒有要求,可以相同也可以不同,但不能通過返回類型是否相同來判斷重載。

重載 總結(jié):

  1. 重載Overload是一個類中多態(tài)性的一種表現(xiàn)

  2. 重載要求同名方法的參數(shù)列表不同(參數(shù)類型,參數(shù)個數(shù)甚至是參數(shù)順序)

  3. 重載的時候,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)

6.介紹下內(nèi)部類

目的:提高安全性

在Java中,可以將一個類定義在另一個類里面或者一個方法里面,這樣的類稱為內(nèi)部類。廣泛意義上的內(nèi)部類一般來說包括這三種:成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類,如下圖所示:

image.png

7.介紹下Java中的四種引用

強(qiáng)引用 ??強(qiáng)引用是平常中使用最多的引用,強(qiáng)引用在程序內(nèi)存不足(OOM)的時候也不會被回收,使用 方式:

軟引用 ??軟引用在程序內(nèi)存不足時,會被回收,使用方式:

// 注意:wrf這個引用也是強(qiáng)引用,它是指向SoftReference這個對象的,
// 這里的軟引用指的是指向new String("str")的引用,也就是SoftReference類中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));

??可用場景: 創(chuàng)建緩存的時候,創(chuàng)建的對象放進(jìn)緩存中,當(dāng)內(nèi)存不足時,JVM就會回收早先創(chuàng)建的對象。 弱引用 ??弱引用就是只要JVM垃圾回收器發(fā)現(xiàn)了它,就會將之回收,使用方式:

??可用場景: Java源碼中的 java.util.WeakHashMap 中的 key 就是使用弱引用,我的理解就是,一旦我不需要某個引用,JVM會自動幫我處理它,這樣我就不需要做其它操作。 虛引用 ??虛引用的回收機(jī)制跟弱引用差不多,但是它被回收之前,會被放入 ReferenceQueue 中。注意哦,其它引用是被JVM回收后才被傳入 ReferenceQueue 中的。由于這個機(jī)制,所以虛引用大多被用于引用銷毀前的處理工作。還有就是,虛引用創(chuàng)建的時候,必須帶有 ReferenceQueue ,使用例子:

??可用場景: 對象銷毀前的一些操作,比如說資源釋放等。 Object.finalize() 雖然也可以做這類動作,但是這個方式即不安全又低效 ??上訴所說的幾類引用,都是指對象本身的引用,而不是指Reference的四個子類的引用(SoftReference等)。

8.HashCode的作用

??java的集合有兩類,一類是List,還有一類是Set。前者有序可重復(fù),后者無序不重復(fù)。當(dāng)我們在set中插入的時候怎么判斷是否已經(jīng)存在該元素呢,可以通過equals方法。但是如果元素太多,用這樣的方法就會比較滿。于是有人發(fā)明了哈希算法來提高集合中查找元素的效率。 這種方式將集合分成若干個存儲區(qū)域,每個對象可以計算出一個哈希碼,可以將哈希碼分組,每組分別對應(yīng)某個存儲區(qū)域,根據(jù)一個對象的哈希碼就可以確定該對象應(yīng)該存儲的那個區(qū)域。hashCode方法可以這樣理解:它返回的就是根據(jù)對象的內(nèi)存地址換算出的一個值。這樣一來,當(dāng)集合要添加新的元素時,先調(diào)用這個元素的hashCode方法,就一下子能定位到它應(yīng)該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進(jìn)行任何比較了;如果這個位置上已經(jīng)有元素了,就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存了,不相同就散列其它的地址。這樣一來實際調(diào)用equals方法的次數(shù)就大大降低了,幾乎只需要一兩次。

9.有沒有可能兩個不相等的對象有相同的hashcode

能.在產(chǎn)生hash沖突時,兩個不相等的對象就會有相同的 hashcode 值.當(dāng)hash沖突產(chǎn)生時,一般 有以下幾種方式來處理:

  • 拉鏈法:每個哈希表節(jié)點都有一個next指針,多個哈希表節(jié)點可以用next指針構(gòu)成一個單向鏈 表,被分配到同一個索引上的多個節(jié)點可以用這個單向鏈表進(jìn)行存儲.

  • 開放定址法:一旦發(fā)生了沖突,就去尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總 能找到,并將記錄存入

  • 再哈希:又叫雙哈希法,有多個不同的Hash函數(shù).當(dāng)發(fā)生沖突時,使用第二個,第三個….等哈希函數(shù) 計算地址,直到無沖突

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

原型模式:設(shè)計模式 --> Spring bean的Scope

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

image.png

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

image.png

11.static都有哪些用法?

??所有的人都知道static關(guān)鍵字這兩個基本的用法:靜態(tài)變量和靜態(tài)方法.也就是被static所修飾的變量/ 方法都屬于類的靜態(tài)資源,類實例所共享. ??除了靜態(tài)變量和靜態(tài)方法之外,static也用于靜態(tài)塊,多用于初始化操作:

??此外static也多用于修飾內(nèi)部類,此時稱之為靜態(tài)內(nèi)部類. ??最后一種用法就是靜態(tài)導(dǎo)包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用 來指定導(dǎo)入某個類中的靜態(tài)資源,并且不需要使用類名,可以直接使用資源名,比如:

12. 介紹下Object中的常用方法

image.png

clone 方法 ??保護(hù)方法,實現(xiàn)對象的淺復(fù)制,只有實現(xiàn)了 Cloneable 接口才可以調(diào)用該方法,否則拋出 CloneNotSupportedException 異常,深拷貝也需要實現(xiàn) Cloneable,同時其成員變量為引用類型 的也需要實現(xiàn) Cloneable,然后重寫 clone 方法。

finalize 方法

??該方法和垃圾收集器有關(guān)系,判斷一個對象是否可以被回收的最后一步就是判斷是否重寫了此方 法。

equals 方法 ??該方法使用頻率非常高。一般 equals 和 == 是不一樣的,但是在 Object 中兩者是一樣的。子類一 般都要重寫這個方法。

hashCode 方法 ??該方法用于哈希查找,重寫了 equals 方法一般都要重寫 hashCode 方法,這個方法在一些具有哈 希功能的 Collection 中用到。 ??一般必須滿足 obj1.equals(obj2)==true ??梢酝瞥?obj1.hashCode()==obj2.hashCode() ,但是 hashCode 相等不一定就滿足 equals。不過為了提高效率,應(yīng)該盡量使上面兩個條件接近等價。

  • JDK 1.6、1.7 默認(rèn)是返回隨機(jī)數(shù);

  • JDK 1.8 默認(rèn)是通過和當(dāng)前線程有關(guān)的一個隨機(jī)數(shù) + 三個確定值,運用 Marsaglia’s xorshift scheme 隨機(jī)數(shù)算法得到的一個隨機(jī)數(shù)。

wait 方法

??配合 synchronized 使用,wait 方法就是使當(dāng)前線程等待該對象的鎖,當(dāng)前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait() 方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設(shè)定一個超時間隔,如果在規(guī)定時間內(nèi)沒有獲得鎖就返回。 調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生。

  1. 其他線程調(diào)用了該對象的 notify 方法;

  2. 其他線程調(diào)用了該對象的 notifyAll 方法;

  3. 其他線程調(diào)用了 interrupt 中斷該線程;

  4. 時間間隔到了。 此時該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個 InterruptedException 異常。

notify 方法 ??配合 synchronized 使用,該方法喚醒在該對象上等待隊列中的某個線程(同步隊列中的線程是給搶占 CPU 的線程,等待隊列中的線程指的是等待喚醒的線程)。 notifyAll 方法 ??配合 synchronized 使用,該方法喚醒在該對象上等待隊列中的所有線程。 總結(jié) ??只要把上面幾個方法熟悉就可以了,toString 和 getClass 方法可以不用去討論它們。該題目考察的是對 Object 的熟悉程度,平時用的很多方法并沒看其定義但是也在用,比如說:wait() 方法,equals() 方法等。

大致意思:Object 是所有類的根,是所有類的父類,所有對象包括數(shù)組都實現(xiàn)了 Object 的方法。

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

new 關(guān)鍵字

??平時使用的最多的創(chuàng)建對象方式

反射方式

??使用 newInstance(),但是得處理兩個異常 InstantiationException、IllegalAccessException:

clone方法

??Object對象中的clone方法來完成這個操作

反序列化操作

??調(diào)用 ObjectInputStream 類的 readObject() 方法。我們反序列化一個對象,JVM 會給我們創(chuàng)建一個單獨的對象。JVM 創(chuàng)建對象并不會調(diào)用任何構(gòu)造函數(shù)。一個對象實現(xiàn)了 Serializable 接口,就可以把對象寫入到文中,并通過讀取文件來創(chuàng)建對象。

總結(jié) ??創(chuàng)建對象的方式關(guān)鍵字:new、反射、clone 拷貝、反序列化。

14.有了數(shù)組為什么還要再搞一個ArrayList呢?

??通常我們在使用的時候,如果在不明確要插入多少數(shù)據(jù)的情況下,普通數(shù)組就很尷尬了,因為你不知道需要初始化數(shù)組大小為多少,而 ArrayList 可以使用默認(rèn)的大小,當(dāng)元素個數(shù)到達(dá)一定程度后,會自動擴(kuò)容。 ??可以這么來理解:我們常說的數(shù)組是定死的數(shù)組,ArrayList 卻是動態(tài)數(shù)組。

15. 說說什么是 fail-fast?

??fail-fast 機(jī)制是 Java 集合(Collection)中的一種錯誤機(jī)制。當(dāng)多個線程對同一個集合的內(nèi)容進(jìn)行操作時,就可能會產(chǎn)生 fail-fast 事件。 ??例如:當(dāng)某一個線程 A 通過 iterator 去遍歷某集合的過程中,若該集合的內(nèi)容被其他線程所改變了,那么線程 A 訪問集合時,就會拋出 ConcurrentModificationException 異常,產(chǎn)生 fail-fast 事件。這里的操作主要是指 add、remove 和 clear,對集合元素個數(shù)進(jìn)行修改。 ??解決辦法:建議使用“java.util.concurrent 包下的類”去取代“java.util 包下的類”。可以這么理解:在遍歷之前,把 modCount 記下來 expectModCount,后面 expectModCount 去和 modCount 進(jìn)行比較,如果不相等了,證明已并發(fā)了,被修改了,于是拋出ConcurrentModificationException 異常。

16.介紹下你對Java集合的理解

??集合是我們在工作中使用頻率非常高的組件了。下面的兩張圖是集合框架的類圖結(jié)構(gòu)。

image.png
image.png

TreeSet的本質(zhì)是TreeMap

HashSet的本質(zhì)是HashMap

17.介紹下你對紅黑樹的理解

紅黑樹的特點:

image.png

紅黑色的本質(zhì):2-3-4樹

紅黑樹保證黑節(jié)點平衡的方式:左旋/右旋+變色 來保證

18. try-finally中的return關(guān)鍵字

return語句的本質(zhì):

  1. return語句獲取到變量的地址

  2. return將獲取的地址返回,也就是return本質(zhì)是傳地址

測試案例代碼:

輸出結(jié)果:

19.異常處理影響性能嗎

??異常處理的性能成本非常高,每個 Java 程序員在開發(fā)時都應(yīng)牢記這句話。創(chuàng)建一個異常非常慢,拋出一個異常又會消耗1~5ms,當(dāng)一個異常在應(yīng)用的多個層級之間傳遞時,會拖累整個應(yīng)用的性能。 ??僅在異常情況下使用異常;在可恢復(fù)的異常情況下使用異常;盡管使用異常有利于 Java 開發(fā),但是在應(yīng)用中最好不要捕獲太多的調(diào)用棧,因為在很多情況下都不需要打印調(diào)用棧就知道哪里出錯了。因此,異常消息應(yīng)該提供恰到好處的信息。

20.介紹下try-with-resource語法

??try-with-resources 是 JDK 7 中一個新的異常處理機(jī)制,它能夠很容易地關(guān)閉在 try-catch 語句塊中使用的資源。所謂的資源(resource)是指在程序完成后,必須關(guān)閉的對象。try-with-resources 語句確保了每個資源在語句結(jié)束時關(guān)閉。所有實現(xiàn)了 java.lang.AutoCloseable 接口(其中,它包括實現(xiàn)了 java.io.Closeable 的所有對象),可以使用作為資源。

關(guān)閉單個資源

查看編譯后的代碼

image.png

關(guān)閉多個資源

編譯后的代碼

image.png

處理規(guī)則

  1. 凡是實現(xiàn)了AutoCloseable接口的類,在try()里聲明該類實例的時候,在try結(jié)束后,close方法都會被調(diào)用

  2. try結(jié)束后自動調(diào)用的close方法,這個動作會早于finally里調(diào)用的方法。

  3. 不管是否出現(xiàn)異常(int i=1/0會拋出異常),try()里的實例都會被調(diào)用close方法

  4. 越晚聲明的對象,會越早被close掉。

JDK9中的改進(jìn)

??在 JDK 9 已得到改進(jìn)。如果你已經(jīng)有一個資源是 final 或等效于 final 變量,您可以在 try-with-resources 語句中直接使用該變量,而無需在 try-with-resources 語句中聲明一個新變量。




Java基礎(chǔ)面試題的評論 (共 條)

分享到微博請遵守國家法律
原平市| 灵寿县| 方山县| 堆龙德庆县| 清远市| 泗水县| 普格县| 渝中区| 雷州市| 云梦县| 通辽市| 襄樊市| 密云县| 五大连池市| 大丰市| 滕州市| 佛教| 浮山县| 晋宁县| 肥乡县| 罗田县| 德令哈市| 桃源县| 吴忠市| 阆中市| 蒙山县| 安远县| 绵竹市| 灵石县| 明水县| 伊宁市| 从化市| 梅河口市| 凤山市| 东光县| 马关县| 广饶县| 吉安县| 全椒县| 富蕴县| 如东县|