天天看點

面試知識整理-Java基礎

三大特征:封裝,繼承,多态多态:簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。

抽象:抽象是将一類對象的共同特征總結出來構造類的過程

包裝,可以講基本類型當做對象來使用,抽象隻關心對象有那些屬性和行為,而不關心這些行為的細節是什麼。

Integer:當數值在-128-127之間的時候,不會new一個新對象

<code>Integer c3 = new Integer(100); Integer d1 = new Integer(100);</code> // false 兩個對象不相等

<code>Integer c = 100; Integer c4 = 100;</code> // 如果數值在-128-127之間相同(取常量池中的對象),範圍外面不同

<code>int b2 = 200; Integer b5 = new Integer(200);</code> // 相同

&amp;&amp; : 短路運算符,即如果第一個條件判斷不成立則不會判斷第二個條件(||)也是

round : 四舍五入,将數字+0.5然後下取整

switch : 可以判斷的類型, byte short char int String (Long不能判斷)

2 &lt;&lt; 3 : 右移/2的n次方, 左移*2的n次方

數組有length屬性,String有length方法

構造器不能被繼承,是以也就不能被重寫,但是可以被重載

equals 相同兩個對象的hashcode相同,hashcode相同,兩個對象不一定相同

String 為 final類,不可以被繼承

String和StringBuilder、StringBuffer的差別

String是隻讀字元串,也就意味着String引用的字元串内容是不能被改變的

StringBuffer/StringBuilder類表示的字元串對象可以直接進行修改。 差別為StringBuffer為線程安全

重載和重寫的差別

重載發生在一個類中,而重寫發生在子類和父類中

重寫要求傳回值和參數類型相同,修飾符可以和父父類中的相同或者更廣泛,不能聲明比父類更多的異常

重載要求參數個數或者類型或者順序不同,傳回值沒有要求.

描述一下JVM加載class檔案的 首先将.class檔案加入到記憶體,然後進入連接配接階段,這個階段主要驗證,準備(靜态變量初始化和指派),解析(符号引用解析為直接引用) 最後初始化,當這個類有父類的時候先去初始化父類,然後初始化這個類.

抽象類和接口有什麼異同

接口和抽象類都不能被執行個體化,但可以定義引用.

接口中所有的方法必須都是抽象方法,而抽象類中可以有普通方法,

接口中的修飾符全是public,而抽象類都可以

有抽象類的方法必須聲明為抽象類,而抽象類中不一定有抽象方法

Java有記憶體洩露嗎, 理論上沒有,因為有垃圾回收機制,但實際中可能存在無用但可達的對象,這些對象不能被GC回收, 例如Hibernate一級緩存中的對象.

靜态變量和執行個體變量

靜态變量static修飾,他屬于類的,不屬于任何一個方法,是以一個靜态變量隻會有一個拷貝.靜态變量可以實作讓多個對象共享記憶體。

執行個體變量必須依存于某一執行個體,需要先建立對象然後通過對象才能通路到它。

對象克隆的實作方式

實作Cloneable接口并重寫Object類中的clone()方法;

實作Serializable接口,通過對象的序列化和反序列化實作克隆,可以實作真正的深度克隆(ObjectOutputStream)。

垃圾回收(GC)

垃圾回收機制,記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導緻程式或系統的不穩定甚至崩潰

分代式垃圾收集 (伊甸園,幸存者樂園,終身頤養園)

一個java檔案中可以包含多個類,但是隻能有一個公開類,且名字和Java檔案相同

一個内部類可以通路他的外部類,包括私有成員

final : 類: 不能被繼承 方法: 不能被重寫 屬性: 指派一次過後不可以再次指派

先初始化靜态成員,然後調用父類構造器,再初始化非靜态成員,最後調用自身構造器。

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1"); GB2312編碼的字元串轉換為ISO-8859-1

try{}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的代碼會不會被執行, 會執行 , 如果finally還有return 語句, 則會傳回finally内的語句

異常處理: 異常都是Throwable子類

throws 聲明一個方法可能抛出的異常

throw 在方法内抛出異常

常見的異常:

ArithmeticException(算術異常)

IllegalArgumentException (非法參數異常)

IndexOutOfBoundsException (下标越界異常)

NullPointerException (空指針異常)

ClassCastException

final、finally、finalize的差別。

final : 修飾符

finally : 不管是否發生異常都會執行

finalize : GC再銷毀對象的時候調用

ArrayList使用的數組方式來進行存儲,是以查找元素快 ,LinkedList雙向連結清單,插入和删除快,都不是線程安全,可以通過Collections中的synchronizedList方法

Collection是一個接口,它是Set、List等容器的父接口;Collections是個一個工具類,

sleep 和 wait

sleep()方法(休眠)是線程類(Thread)的靜态方法,調用此方法會讓目前線程暫停執行指定的時間,将執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,是以休眠時間結束後會自動恢複(線程回到就緒狀态)

wait()是Object類的方法,調用對象的wait()方法導緻目前線程放棄對象的鎖(線程暫停執行),進入對象的等待池(wait pool),隻有調用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程

線程的sleep()方法和yield()方法有什麼差別?

sleep()方法給其他線程運作機會時不考慮線程的優先級,是以會給低優先級的線程以運作的機會;yield()方法隻會給相同優先級或更高優先級的線程以運作的機會;

線程執行sleep()方法後轉入阻塞(blocked)狀态,而執行yield()方法後轉入就緒(ready)狀态;

sleep()方法聲明抛出InterruptedException,而yield()方法沒有聲明任何異常;

sleep()方法比yield()方法(跟作業系統CPU排程相關)具有更好的可移植性

請說出與線程同步以及線程排程相關的方法。

wait():使一個線程處于等待(阻塞)狀态,并且釋放所持有的對象的鎖;

sleep():使一個正在運作的線程處于睡眠狀态,是一個靜态方法,調用此方法要處理InterruptedException異常;

notify():喚醒一個處于等待狀态的線程,當然在調用此方法的時候,并不能确切的喚醒某一個等待狀态的線程,而是由JVM确定喚醒哪個線程,而且與優先級無關;

notityAll():喚醒所有處于等待狀态的線程,該方法并不是将對象的鎖給所有線程,而是讓它們競争,隻有獲得鎖的線程才能進入就緒狀态;

線程同步的方式

lock()

synchronized (同步代碼塊和同步方法)

信号量機制

多線程三種實作多線程的方式

繼承Thread

實作Runable

Callable(可以抛出異常 ,可以有傳回值)

線程池:需要的時候從池中擷取線程不用自行建立,使用完畢不需要銷毀線程而是放回池中,進而減少建立和銷毀線程對象的開銷。

newSingleThreadExecutor: 單線程的線程池

newFixedThreadPool: 固定大小的線程池

newCachedThreadPool:建立一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那麼就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于作業系統(或者說JVM)能夠建立的最大線程大小。

newScheduledThreadPool:建立一個大小無限的線程池。此線程池支援定時以及周期性執行任務的需求。

newSingleThreadScheduledExecutor :建立一個單線程化的支援定時的線程池,

synchronized 和Lock的異同

都是實作線程同步功能

Lock性能更好, 需要自己手動釋放鎖

實作序列化: Serializable

XML文檔定義有幾種形式?解析XML文檔有哪幾種方式

XML文檔定義分為DTD和Schema兩種形式,二者都是對XML文法的限制,其本質差別在于Schema本身也是一個XML檔案,可以被XML解析器解析,而且可以為XML承載的資料定義類型,限制能力較之DTD更強大。

DOM,SAX DOM會将整個檔案裝入記憶體,當檔案較大的時候會占用記憶體較多, saxAX是事件驅動型的XML解析方式,它順序讀取XML檔案,不需要一次全部裝載整個檔案。當遇到像檔案開頭,文檔結束,或者标簽開頭與标簽結束時,它會觸發一個事件,使用者通過事件回調代碼來處理XML檔案

你在項目中哪些地方用到了XML

資料交換和資訊配置 (Web Service )

XML配置資訊, Spring, Web

JDBC連結資料庫的步驟

加載驅動

建立連接配接

建立語句

執行語句

處理結果

關閉資源(關閉資源要和打開資源的順序相反)

Statement和PreparedStatement有什麼差別?哪個性能更好?

PreparedStatement接口代表預編譯的語句,它主要的優勢在于可以減少SQL的編譯錯誤并增加SQL的安全性(減少SQL注射攻擊的可能性)

PreparedStatement中的SQL語句是可以帶參數的,避免了用字元串連接配接拼接SQL語句的麻煩和不安全

當批量處理SQL或頻繁執行相同的查詢時,PreparedStatement有明顯的性能上的優勢,

使用JDBC操作資料庫時,如何提升讀取資料的性能?如何提升更新資料的性能?

要提升讀取資料的性能,可以指定通過結果集(ResultSet)對象的setFetchSize()方法指定每次抓取的記錄數(典型的空間換時間政策)

要提升更新資料的性能可以使用PreparedStatement語句建構批處理,将若幹SQL語句置于一個批進行中執行。

連接配接池有什麼作用

為了提升系統通路資料庫的性能,可以事先建立若幹連接配接置于連接配接池中,需要時直接從連接配接池擷取,使用結束時歸還連接配接池而不必關閉連接配接,進而避免頻繁建立和釋放連接配接所造成的開銷,

C3P0、Proxool、DBCP、BoneCP、Druid等。

事務的屬性

原子性:事務中各項操作,要麼全做要麼全不做,任何一項操作的失敗都會導緻整個事務的失敗;

一緻性:事務結束後系統狀态是一緻的;

隔離性:并發執行的事務彼此無法看到對方的中間狀态;

持久性:事務完成後所做的改動都會被持久化,

事務可能發生的錯誤狀态

髒讀: A事務讀取B事務尚未送出的資料并在此基礎上操作,而B事務執行復原(A事務讀取時還沒有發生復原,在讀取完成時出現錯誤,B事務復原)

不可重複讀:事務A重新讀取前面讀取過的資料,發現該資料已經被另一個已送出的事務B修改過了。

幻讀:事務A重新執行一個查詢,傳回一系列符合查詢條件的行,發現其中插入了被事務B送出的行。

第一類丢失更新:事務A撤銷時,把已經送出的事務B的更新資料覆寫了。

第二類丢失更新:事務A覆寫事務B已經送出的資料,造成事務B所做的操作丢失。

四個隔離級别

面試知識整理-Java基礎

JDBC如何進行事務處理 通過調用setAutoCommit(false)可以設定手動送出事務;當事務完成後用commit()顯式送出事務;如果在事務處理過程中發生異常則通過rollback()進行事務復原。還有Savepoint(儲存點)的概念,允許通過代碼設定儲存點并讓事務復原到指定的儲存點

擷取一個類的類對象(class)

類型.class, <code>String.class</code>

對象.getClass() <code>"hello".getClass()</code>

Class.forName() <code>Class.forName("String")</code>

反射建立對象

通過類對象調用newInstance()

通過類對象的getConstructor()或getDeclaredConstructor()方法獲得構造器(Constructor)對象并調用其newInstance()方法建立對象,例如:<code>String.class.getConstructor(String.class).newInstance("Hello");</code>

如何通過反射擷取和設定對象私有字段的值 可以通過類對象的<code>getDeclaredField()</code>方法字段(Field)對象,然後再通過字段對象的<code>setAccessible(true)</code>将其設定為可以通路

通過反射擷取對象方法

直接通過getMethod("name")擷取到方法對象,然後通過invoke方法調用

<code>Method m = str.getClass().getMethod("toUpperCase");</code> <code>m.invoke(str)</code>

簡述一下面向對象的"六原則一法則"。

單一職責原則:一個類隻做它該做的事情,

開閉原則:軟體實體應當對擴充開放,對修改關閉。(抽象類或者接口)

依賴倒轉原則:面向接口變成, 聲明方法的參數類型、方法的傳回類型、變量的引用類型時,盡可能使用抽象類型而不用具體類型,

裡氏替換原則:任何時候都可以用子類型替換掉父類型(子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題)。

接口隔離原則:接口要小而專,絕不能大而全。

合成聚合複用原則:優先使用聚合或合成關系複用代碼。

迪米特法則:一個對象應當對其他對象有盡可能少的了解(盡量用簡單的方式把業務呈現給使用者,而不讓使用者看到業務細節)

設計模式:

工廠模式:工廠類可以根據條件生成不同的子類執行個體,這些子類有一個公共的抽象父類并且實作了相同的方法,但是這些方法針對不同的資料進行了不同的操作(多态方法)。

代理模式:給一個對象提供一個代理對象,并由代理對象控制原對象的引用。

擴充卡模式:把一個類的接口變換成用戶端所期待的另一種接口,進而使原本因接口不比對而無法在一起使用的類能夠一起工作。

UML簡介 UML是統一模組化語言,為軟體開發的所有階段提供模型化和可視化支援。使用UML可以幫助溝通與交流,輔助應用設計和文檔的生成,還能夠闡釋系統的結構和行為。

UML中常用的圖

用例圖(捕獲需求,用來描述系統的功能)

類圖(描述類和類之間的關系)

時序圖(描述特定任務的執行順序以及互動關系)

冒泡排序

折半查找