首頁  >  文章  >  Java  >  java常見面試題整理

java常見面試題整理

(*-*)浩
(*-*)浩原創
2019-11-29 13:55:112594瀏覽

java常見面試題整理

物件導向的特徵有哪些面向? 

所謂封裝,也就是把客觀事物封裝成抽象的類,並且類別可以把自己的資料和方法只讓可信的類別或物件操作,對不可信的進行資訊隱藏。封裝是物件導向的特徵之一,是物件和類別概念的主要特性。  (推薦學習:java常見面試題

繼承是指子類別獲得父類別的屬性和方法。如狗是動物的一種,也可以說夠繼承了動物的特性,或說狗是動物的子類。

多態是指一個方法只能有一個名稱,但可以有許多形態,也就是程式中可以定義多個同名的方法,用"一個介面,多個方法"來描述.可以透過方法的參數與型別引用

五大原則:單一職責原則SRP  開放式封閉原則OCP  取代原則LSP  依賴原則DIP  介面分離原則ISP

#成員變數與局部變數的差異

* A:在類別中的位置不同

 * 成員變數:在類別中方法外

 * 局部變量:在方法定義中或方法宣告上

* B:在記憶體中的位置不同

 * 成員變數:在堆記憶體(成員變數屬於物件,對象進堆記憶體)

 * 局部變數:在堆疊記憶體(局部變數屬於方法,方法進端記憶體)

* C:生命週期不同

 * 成員變數:隨著物件的創建而存在,隨著物件的消失而消失

 * 局部變數:隨著方法的呼叫而存在,隨著方法的調用完而消失

* D:初始化值不同

 * 成員變數:有預設初始化值

 * 局部變數:沒有預設初始化值,必須定義,賦值,然後才能使用。

靜態變數和成員變數的差異

* 靜態變數也叫類別變數  成員變數也叫物件變數

* A:所屬不同

 * 靜態變數屬於類,所以也稱為為類別變數

 * 成員變數屬於對象,所以也稱為實例變數(對象變數)

* B:記憶體中位置不同

 * 靜態變數儲存於方法區的靜態區

 * 成員變數儲存於堆疊記憶體

#* C:記憶體出現時間不同

 * 靜態變數隨著類別的載入而載入,隨著類別的消失而消失

 * 成員變數隨著物件的創建而存在,隨著物件的消失而消失

* D:調用不同

# * 靜態變數可以透過類別名稱調用,也可以透過物件呼叫

 * 成員變數只能透過物件名稱呼叫

this和super的差異和應用

##* A:this和super都代表什麼

 * this:代表目前物件的引用,誰來呼叫我,我就代表誰

 * super:代表目前物件父類別的引用

#* B:this和super的使用差異

 * a:呼叫成員變數

  * this.成員變數呼叫本類別的成員變數,也可以呼叫父類別的成員變數

  * super.成員變數呼叫父類別的成員變數

 * b:呼叫建構方法

  * this(...) 呼叫本類別的建構方法

  * super(...) 呼叫父類別的建構方法

 * c:呼叫成員方法

  * this.成員方法呼叫本類別的成員方法,也可以呼叫父類別的方法

  * super.成員方法呼叫父類別的成員方法

排序都有哪幾種方法?請列舉

排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)

快速排序的偽代碼。

String, StringBuffer StringBuilder的區別。

String的長度是不可變的;


StringBuffer的長度是可變的,如果你對字串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer, 如果最後需要String,那麼使用StringBuffer的toString()方法;線程安全;

StringBuilder是從JDK 5 開始,為StringBuffer該類別補充了一個單一執行緒使用的等價類別;通常應該優先使用StringBuilder 類別,因為它支援所有相同的操作,但由於它不執行同步,所以速度更快。

Overload 和 Override 的差別。 Overloaded 的方法是否可以改變傳回值的型別?

答案:方法的重寫 Overriding 和重載 Overloading 是 Java 多態性的不同表現。

重寫 Overriding 是父類別與子類別之間多態性的表現,而重載 Overloading 是一個類別中多態性的一種表現。如果在子類別中定義某方法與其父類別有相同的名稱和參數,我們說該方法被重寫 (Overriding)。

子類別的物件使用這個方法時,將呼叫子類別中的定義,對它而言,父類別中的定義如同被「屏蔽」了。如果在一個類別中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。 Overloaded 的方法是可以改變傳回值的型別。

final, finally的差異?

答案:final:修飾符(關鍵字);如果一個類別被宣告為final,表示它不能再派生出新的子類,不能作為父類被繼承,因此一個類別不能既被宣告為abstract的,又被宣告為final 的;將變數或方法宣告為final,可以保證它們在使用中不被改變;被宣告為final 的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改;被宣告為final 的方法也同樣只能使用,不能重載。

finally:再異常處理時提供finally 區塊來執行任何清除操作;如果拋出一個異常,那麼相匹配的catch 子句就會執行,然後控制就會進入finally 區塊(如果有的話)。

常見的幾個運行異常。

java.lang.nullpointerexception(空指標異常)

java.lang.classnotfoundexception(指定的類別不存在)

java.lang.arithmeticexception(數學運算異常)

java.lang.arrayindexoutofboundsexception(數組下標越界異常)

IOException(輸入輸出異常)

數組操作的兩個常見小問題越界和空指標

* A:案例示範

* a:ArrayIndexOutOfBoundsException:陣列索引越界異常

* 原因:你存取了不存在的索引。

* b:NullPointerException:空指標例外

* 原因:陣列已經不在指向堆記憶體了。而你還用陣列名去存取元素。

  * int[] arr = {1,2,3};
  * arr = null;
  * System.out.println(arr[0]);

JAVA語言如何進行例外處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try區塊中可以拋出異常嗎?

答案:Java透過物件導向的方法進行例外處理,把各種不同的例外分類,並提供了良好的介面。

在Java中,每個異常都是一個對象,它是Throwable類別或其它子類別的實例。當一個方法出現異常後便拋出一個異常對象,該對像中包含有異常訊息,調用這個對象的方法可以捕獲到這個異常並進行處理。

Java的例外處理是透過5個關鍵字來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。

用try來指定一塊預防所有"異常"的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的"異常"的類型。

throw語句用來明確地拋出一個"例外"。

throws用來標示一個成員函數可能拋出的各種"例外"。

Finally為確保一段程式碼不管發生什麼事"異常"都被執行一段程式碼。

可以在一個成員函數呼叫的外面寫一個try語句,在這個成員函數內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,"異常"的框架就會放到堆疊上面,直到所有的try語句都完成。

如果下一級的try語句沒有對某種"異常"進行處理,堆疊就會展開,直到遇到有處理這種"異常"的try語句。

伺服器收到用戶提交的表單數據,到底是呼叫Servlet的doGet()還是doPost()方法?

答案:HTML的ff9c23ada1bcecdd1a0fb5d5a0f18437元素有一個method屬性,用來指定提交表單的方式,其值可以是get或post。

我們自訂的Servlet一般情況下會重寫doGet()或doPost()兩個方法之一或全部,如果是GET請求就呼叫doGet()方法,如果是POST請求就呼叫doPost ()方法,那為什麼為什麼會這樣呢?

我們自訂的Servlet通常繼承自HttpServlet,HttpServlet繼承自GenericServlet並重寫了其中的service()方法,這個方法是Servlet介面中定義的。

HttpServlet重寫的service()方法會先取得使用者請求的方法,然後根據請求方法呼叫doGet()、doPost()、doPut()、doDelete()等方法,如果在自訂Servlet中重寫了這些方法,那麼顯然會呼叫重寫的(自訂的)方法,這顯然是對模板方法模式的應用(如果不理解,請參考《Java與模式》一書的第37章) 。

當然,自訂Servlet中也可以直接重寫service()方法,那麼不管是哪一種方式的請求,都可以透過自己的程式碼進行處理,這對於不區分請求方法的場景比較合適。

抽象類別和介面的差別?

介面是抽象類別的變體,介面中所有的方法都是抽象的。而抽象類別是聲明方法的存在而不去實作它的類別。

介面可以多繼承,抽象類別不行

介面定義方法,不能實現,而抽象類別可以實作部分方法。

介面中基本資料型態為static 而抽類像不是的。

記憶體洩漏和記憶體溢出?

記憶體外洩:是指應用程式在申請記憶體後,無法釋放已經申請的記憶體空間,一次記憶體外洩危害可以忽略,但如果任其發展會導致記憶體溢位。

如:讀取檔案後,流要進行及時關閉以及資料庫連線的釋放。

記憶體溢出:是指應用程式在申請記憶體時,沒有最後的記憶體空間,供其使用。

如:我們在專案中對於大批量資料導入,採用分段批次提交的方式。

什麼是執行緒同步?

1、執行緒同步的目的是為了保護多個執行緒反問一個資源時對資源的破壞。

2、線程同步方法是透過鎖來實現,每個物件都有切僅有一個鎖,這個鎖與一個特定的物件關聯,線程一旦獲取了物件鎖,其他訪問該物件的線程就無法再存取該物件的其他非同步方法。

3、對於靜態同步方法,鎖定是針對這個類別的,鎖定物件是該類別的Class物件。靜態和非靜態方法的鎖互不干預。一個執行緒獲得鎖,當在一個同步方法中存取另外物件上的同步方法時,會取得這兩個物件鎖。

4、對於同步,要時時清醒在哪個物件上同步,這是關鍵。

5、編寫線程安全的類,需要時刻注意對多個線程競爭訪問資源的邏輯和安全做出正確的判斷,對“原子”操作做出分析,並保證原子操作期間別的執行緒無法存取競爭資源。

6、當多個執行緒等待一個物件鎖定時,沒有取得到鎖的執行緒將會發生阻塞。

7、死鎖是線程間互相等待鎖鎖造成的,在實際中發生的機率非常的小。真讓你寫死鎖程序,不一定好使,呵呵。但是,一旦程式發生死鎖,程式就會死掉。

對多執行緒的理解?

同一件事,不同的人在做就是多執行緒。

食堂吃飯,一個人一個人打就是單線程,開N個窗口N個人同時打就是多線程

線程的基本概念、線程的基本狀態以及狀態之間的關係:

線程指在程式執行過程中,能夠執行程式碼的一個執行單位,每個程式至少都有一個線程,也就是程式本身。 Java中的執行緒有四種狀態分別是:運行、就緒、掛起、結束。

有那些集合?

List特點:元素有放入順序,元素可重複

Map特點:元素按鍵值對存儲,不放入順序

Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)

List接口有三個實作類別:LinkedList,ArrayList,Vector

LinkedList:底層基於鍊錶實現,鍊錶記憶體是散亂的,每一個元素儲存本身記憶體位址的同時也儲存下一個元素的位址。鍊錶增刪快,查找慢

ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低

Set介面有兩個實作類別: HashSet(底層由HashMap實作),LinkedHashSet

SortedSet介面有實作類別:TreeSet(底層由平衡二元樹實作)

Query介面有實作類別:LinkList

# Map介面有三個實作類別:HashMap,HashTable,LinkeHashMap

HashMap非執行緒安全,高效,支援null;HashTable執行緒安全,低效,不支援null

#SortedMap有實作類別: TreeMap

其實最主要的是,list是用來處理序列的,而set是用來處理集合的。 Map是儲存的是鍵值對

檔案讀寫的基本類別:

File Reader 類別和FileWriter類別分別繼承自Reader類別和Writer類別。 FileReader類別用於讀取文件,File Writer類別用於將資料寫入文件,這兩各類別在使用前,都必須呼叫其建構方法建立對應的對象,然後呼叫對應的read()或write()方法。

以上是java常見面試題整理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn