天天看點

JAVA面試中常見的面試題(三)——異常、對象拷貝和MYSQL資料庫

異常

1、throw和throws的差別?

1)throws出現在方法函數頭;而throw出現在函數體。

2)throws表示出現異常的一種可能性,并不一定會發生這些異常;throw則是抛出了異常,執行throw則一定抛出了某種異常。

3)throws是将異常聲明但是不處理,調用方法必須捕獲該異常或者異常往上傳,誰調用我就交給誰處理如果最上層調用不處理就抛給JVM處理,而throw抛出的異常後,調用者可以不去捕獲和處理該異常,throws一般處理可檢測異常,throw一般處理運作時異常。

2、final、finally和finalize的差別?

1)final可以用來修飾類,方法和變量(成員變量或局部變量),辨別修飾類不被繼承,方法不被重寫,變量表示常量,隻能被指派一次,指派後其值不再改變。

(誤解:String被設計成final類可以被改變如String a="A"; a="B",而是當a=“B”執行時,并不是原本String對象("A")發生改變,而是建立一個新的對象("B"),令a引用它)

2)finally作為異常處理的一部分,它隻能用在try/catch語句中,并且附帶一個語句塊,表示這段語句最終一定會被執行(不管有沒有抛出異常),經常被用在需要釋放資源的情況下。

3)finalize()是在java.lang.Object裡定義的,也就是說每一個對象都有這麼個方法。這個方法在gc啟動,該對象被回收的時候被調用。

3、try-cacth-finally中的那個部分可以省略?

catch和finally其中可有任意一個可以省略,但try是不能省略的。

當catch檢查型異常時不可省略。

4、try-catch-finally中如果catch中return了finally中的代碼會執行嗎?

finally的代碼依然會執行,是以無論異常是否發生都會執行finally代碼塊。

5、常見的異常類型有哪些?

Exception 有三大類分别是ERROR、RuntimeException和No_RuntimeException。

  • 第一類ERROR

是程式無法處理的錯誤,表示運作應用程式中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運作時 JVM(Java 虛拟機)出現的問題。如JVM記憶體洩漏 OutOfMemoryError和方法棧超過JVM允許的棧的深度StackOverflowError等都是內建的ava虛拟機運作錯誤(VirtualMachineError)。

常見的系統ERROR:

VirtualMachineError 虛拟機錯誤

OutOfMemoryError JVM記憶體洩漏

StackOverflowError 放發棧越界

NoClassDefFoundError 類定義錯誤

InstantiationError 執行個體化錯誤

InternalError 虛拟機内部錯誤

UnknownError 未知錯誤

  • 第二類是RuntimeException是運作時異常

就是在程式運作過程中有可能都發生的異常。

運作時異常:

ArithmeticException 算術異常

NullPointerException 空指針異常

ArrayIndexOutOfBoundsException  數組下标越界異常

SecturityException 違背安全原則異常

NumberFormatException 字元串轉換為數字異常

ClassCastException 類造型異常

UnsupportedOperationException 不支援的方法異常

  • 第三類為非運作時異常

又稱為可檢查類異常,編譯器利用分析方法或構造方法中可能産生的結果來檢測Java程式中是否含有檢測異常的處理程式,對于每個可能的可檢測異常,方法或構造方法的throws子句必須列出該異常對應的類。

可檢查異常:

IOException 輸入輸出異常

SQLException 操作資料庫異常

FileNotFoundException 檔案未找到異常

EOFException 檔案已結束異常

ClassNotFoundException 找不到類異常

NoSuchFieldException 屬性不存在異常

InterruptedException 被中止異常

InstantiationException 執行個體化異常

對象克隆

1、為什麼要使用對象克隆?

從一個對象執行個體複制一個對象時,需要讓原對象實作JAVA的cloneable接口,重寫Clone方法,clone方法是在複制一個對象,指派的對象是單獨獨立的,有獨自的記憶體空間,而不是newObj=oldObj,因為如果用對象指派擷取的新對象其實時舊對象的引用,他們指向的其實時一塊記憶體,是以對象對資料的操作就不是安全的操作。

2、如何實作對象克隆?

必須要在被克隆類上實作Cloneable接口,并重寫clone方法且clone方法的權限修飾符為public。

3、深拷貝和淺拷貝的差別?

淺克隆,在clone對象時,隻會把基本資料類型的資料進行複制過去;如果是引用類型,隻會把引用複制過去,也就是被克隆對象和原始對象資訊,共同引用一個引用類型的屬性。

深克隆:在克隆時,會把基本資料類型的資料和引用類型的資料,同時複制。克隆對象和原始對象不共同引用一個引用類型

MYSQL

1、資料庫三範式是什麼?

第一範式:當關系模式R的所有屬性都不能在分解為更基本的資料機關時,稱R是滿足第一範式的,簡記為1NF。滿足第一範式是關系模式規範化的最低要

第二範式:如果關系模式R滿足第一範式,并且R得所有非主屬性都完全依賴于R的每一個候選關鍵屬性,稱R滿足第二範式,簡記為2NF。

第三範式:設R是一個滿足第一範式條件的關系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個候選關鍵字,稱R滿足第三範式,簡記為3NF.

2、mysql自增主鍵,mysql重新開機後對主鍵id的影響?

如果表引擎為 MyISAM,重新開機mysql服務,對之間id沒有影響。

如果是引擎為InnoDB,id會從現有的資料的最大id開始,因為InnoDB 表隻會把自增主鍵的最大 id 記錄在記憶體中,是以重新開機之後會導緻最大 id 丢失。

3、如何擷取目前資料庫據版本?

 select version() 擷取目前 MySQL 資料庫版本。

4、資料庫ACID是什麼?

Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被恢複(Rollback)到事務開始前的狀态,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。

Consistency(一緻性):在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設限制、觸發器、級聯復原等。

Isolation(隔離性):資料庫允許多個并發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導緻資料的不一緻。事務隔離分為不同級别,包括讀未送出(Read uncommitted)、讀送出(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

Durability(持久性):事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丢失。

5、char和varchar的差別?

char的長度是不可變的,char[10]存入'csdn',則char的長度是10,其中後六位存儲的六個空格字元。

varchar是可變長度的,varchar[10]存入'csdn',則varchar的長度變為4。

char的存儲方式是,對英文字元(ASCII)占用1個位元組,對一個漢字占用兩個位元組;而varchar的存儲方式是,對每個英文字元占用2個位元組,漢字也占用2個位元組。

6、mysql的内連結、左連接配接和右連接配接有什麼差別?

内連接配接關鍵字inner join:内連接配接是把比對的關聯資料顯示出來。

左連接配接left join:左連接配接是左邊的表全部顯示出來。

右連接配接right join:右邊的表顯示出符合條件的資料。

7、mysql怎麼驗證索引是否滿足需求?

使用 explain 檢視 SQL 是如何執行查詢語句的,檢視type和key列查詢結果。

type列:顯示sql執行的類型,從最好到最差的類型為system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般來說,type至少要達到range級别,最好達到ref級别,低于range級别的sql必須進行優化

key列:顯示sql執行過程中實際使用的鍵或索引,如果為null則表示未使用任何索引,必須進行優化。

Extra列:表示附加資訊,詳情點選 https://blog.csdn.net/poxiaonie/article/details/77757471

8、說一下事務的隔離級别?

事務的四種隔離級别:讀未送出(read-uncommitted)、讀已送出(read-committed)、可重複度(repeatable-read)、串行化(serializable)。

髒讀:A讀取了B更新未送出的資料,當B復原更新後,A讀到的資料就是髒資料。

不可重複度:A多次讀取資料不一樣,在多次讀取過程中讀取了B送出修改資料的事務。

幻讀:A删除不及格的資料後,查詢存在一條不及格資料,A再删除不及格的過程中,B插入了不及格的資料,A産生了幻讀。

讀未送出會産生髒讀、不可重複度和幻讀。

讀已送出解決了髒讀,會産生不可重複度和幻讀。

可重複度解決了髒讀和不可重複讀,會産生幻讀。

串行化解決了髒讀、不可重複度和幻讀。

9、說一下事務的傳播屬性?

PROPAGATION_REQUIRED--支援目前事務,如果目前沒有事務,就建立一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS--支援目前事務,如果目前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY--支援目前事務,如果目前沒有事務,就抛出異常。

PROPAGATION_REQUIRES_NEW--建立事務,如果目前存在事務,把目前事務挂起。

PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果目前存在事務,就把目前事務挂起。

PROPAGATION_NEVER--以非事務方式執行,如果目前存在事務,則抛出異常。

PROPAGATION_NESTED--新起一個事務并關聯父事務。

10、說一下mysql資料庫常用的引擎?

InnoDB 引擎:InnoDB 引擎提供了對資料庫 acid 事務的支援,并且還提供了行級鎖和外鍵的限制,它的設計的目标就是處理大資料容量的資料庫系統。MySQL 運作的時候,InnoDB 會在記憶體中建立緩沖池,用于緩沖資料和索引。但是該引擎是不支援全文搜尋,同時啟動也比較的慢,它是不會儲存表的行數的,是以當進行 select count(*) from table 指令的時候,需要進行掃描全表。由于鎖的粒度小,寫操作是不會鎖定全表的,是以在并發度較高的場景下使用會提升效率的。

MyIASM 引擎:MySQL 的預設引擎,但不提供事務的支援,也不支援行級鎖和外鍵。是以當執行插入和更新語句時,即執行寫操作的時候需要鎖定這個表,是以會導緻效率會降低。不過和 InnoDB 不同的是,MyIASM 引擎是儲存了表的行數,于是當進行 select count(*) from table 語句時,可以直接的讀取已經儲存的值而不需要進行掃描全表。是以,如果表的讀操作遠遠多于寫操作時,并且不需要事務的支援的,可以将 MyIASM 作為資料庫引擎的首選。

11、說一下mysql的行鎖和表鎖?

表鎖:偏向MyISAM存儲引擎,開銷小,加鎖快;無死鎖;鎖定粒度大,發生鎖沖突的機率最高,并發度最低。

行鎖:偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的機率最低,并發度也最高。

12、說一下悲觀鎖和樂觀鎖?

悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為别人會修改,是以每次在拿資料的時候都會上鎖,這樣别人想拿這個資料就會阻塞直到它拿到鎖(共享資源每次隻給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關系型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨占鎖就是悲觀鎖思想的實作。

樂觀鎖:總是假設最好的情況,每次去拿資料的時候都認為别人不會修改,是以不會上鎖,但是在更新的時候會判斷一下在此期間别人有沒有去更新這個資料,可以使用版本号機制和CAS算法實作。樂觀鎖适用于多讀的應用類型,這樣可以提高吞吐量,像資料庫提供的類似于write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實作方式CAS實作的。

13、怎麼做mysql的性能優化?

從幾個方面:

1)存儲引擎優

2)優化表索引

3)EXPLAIN指令優化查詢(優化SQL)

4)垂直分割分表

作者相關文章:

JAVA面試中常見的面試題(一)JAVA基礎&&集合容器

JAVA面試中常見的面試題(二)多線程&&反射

繼續閱讀