標籤:java 面試 基礎知識
面試總結(一)——Java基礎相關知識
最近在面試,所以總結下面試容易問到的知識點,用來備份查看用。
若需轉載,請註明出處。
1.物件導向的特點;
1.將複雜的事情簡單化
2.物件導向將以前過程中的執行者,變成了指揮者
3.物件導向思想是符合人們思考習慣的思想
2.物件導向特徵;
1.封裝:隱藏對象的屬性和實現的細節,僅對外提供公用訪問方式
好處:將變化隔離,便於使用,提高複用和安全性。
原則:將不需要對外提供的內容隱藏起來,隱藏屬性,提供公用方法對其訪問。
2.繼承:提高代碼複用性,繼承是多態的前提。子類中所有的建構函式都會預設訪問父類中空參的建構函式,預設第一行有super(),若無空參數建構函式,子類中需指定。另外,子類的建構函式可以用this訪問自身的其他建構函式。
3.多態:是父類或介面定義的引用變數,可以指向子類或具體實作類別的執行個體對象。
好處:提高程式的擴充性
弊端:當父類引用指向子類對象時,雖然提高了擴充性,但只能訪問父類中具有的方法,不可以訪問子類中專屬的方法,即訪問的局限性。
前提:實現或繼承關係,複寫父類方法。
3.抽象類別
1.特點:由abstract修飾,描述類和方法,作為方法的聲明,不具體實現。抽象類別裡可以有非抽象方法,但不可被執行個體化。子類單繼承抽象類別,必須實現所有抽象方法才能執行個體化,否則子類仍為抽象類別。
2.相關知識點:
a.抽象類別可以有建構函式,用於對子類對象的初始化,即使不定義建構函式,也會預設一個空參的建構函式。
b.可定義非抽象方法,屬性和行為。
c.抽象類別中可以沒有抽象方法,抽象的目的是不讓該類被執行個體化。
d.abstract不可以和final,private,static,native共存。
4.內部類
1.內部類被定義在局部時,定義在方法中的內部類是局部內部類。
不可以被成員修飾符修飾:public,static,private等。可以直接存取外部類成員,因為有外部類的引用。只能訪問它所佔局部中的那些被final修飾的局部變數,如BaseAdapter裡new OnClickListener時如果需要用到position,需要改成final類型。
2.匿名內部類,內部類的一種簡寫方式,該內部類必須繼承一個類或實現一個介面。
5.final關鍵字
1.可以修飾類,方法和變數
2.被修飾的類不可被繼承
3.被修飾的方法不可被複寫
4.被修飾的變數:a.基礎資料型別 (Elementary Data Type)->值不可變;b.引用型變數->不能被賦值,但是指向的對象可以被改變。
6.繼承和實現的區別
表面區別:單繼承,多實現。
繼承:如果多個類某個部分功能相同,那麼可以抽象出一個類,把它們相同部分都放在父類裡,讓它們都繼承這個類。提供代碼複用性,多態前提。
實現:如果多個類處理的目標是一樣的,但是處理的方式方法不同,那麼就定義一個介面,也就是一個標準,讓它們實現這個介面,各自實現自己的具體方法來處理目標。
7.抽象類別和介面的區別
抽象類別只可以被單繼承,介面可以被多實現。
抽象類別中可以定義非抽象方法,子類可以直接繼承使用,介面全部為抽象方法,需要被子類實現。
抽象類別是is a關係,介面是like a 關係。
抽象類別的成員修飾符可以自訂,介面全部為public
抽象類別可以有構造方法,靜態方法,介面不可以。
8.重載overload和重寫override的區別
重載:在同一個類允許存在一個以上的相同函數名,但參數個數或類型不同的方法。
特點:與傳回型別無關,只看參數列表
重寫:當子類出現和父類一樣的函數時,子類對象調用時,會運行子類該方法中的功能,如同父類函數被覆蓋一樣。
重載只看同名函數的參數列表,是針對一個類中的兩個函數說的。重寫是子類與父類的同名函數,是兩個類。
9.StringBuilder和StringBuffer的區別
StringBuffer是線程同步的,通常用於多線程。StringBuilder是線程不同步的,通常用於單線程。
10.異常Exception
1.異常處理原則:可以處理的進行捕獲,拋出幾個異常就捕獲幾個,catch異常要具體,處理不了的轉為新異常拋出。
2.含有多個catch塊時,父類異常要放在子類異常之下,因為子類更詳細。
3.throws,throw,try,catch,finally意義:
a.throws:定義在函數上,用於拋出異常。可以拋出多個,需要逗號隔開,拋出的異常越具體越好,可以有針對性的解決。
b.throw:定義在函數內,用於拋出異常對象,throw單獨存在時,下面不可以定義語句,因為執行不到,編譯失敗。
c.try:可以理解為檢測異常,裡面放可能產生異常的代碼
d.catch:捕獲異常或異常對象,當有異常拋出時,需要進行捕捉,並進行處理,在這裡可以拋異常,拋給可以解決的調用者處理。
e.finally:最終一定會執行的代碼塊,即使有return也會執行。
11.多線程
線程的建立方式:Thread,Runnable,線程池(Pool)。
1.為什麼要複寫run方法?
因為run方法中存放線程啟動並執行代碼
2.Thread和Runnable建立的區別?
繼承方式:線程代碼放在Thread子類run方法中。
實現方式:線程代碼放在介面子類的run方法中,避免了單繼承的局限性,建議使用。
3.線程狀態:
建立:start
臨時狀態:具備cpu的執行資格,無執行權
運行狀態:具備cpu的執行權,可執行
凍結狀態:通過sleep或者wait(還有其他方法,後面會有面試專題——多線程專門介紹)使線程不具備執行資格,需要notify喚醒,喚醒後處於臨時狀態
消亡狀態:run方法之行結束或中斷線程,使線程死亡。
4.安全執行緒:
多個線程共用資料,當某個線程執行多條語句時,其他線程也執行進來,導致資料在某條語句上被修改多次,執行後續代碼時,產生錯誤資料。
因素:多個線程操作共用資料
解決:
原理:某一時間內,只讓一個線程執行完所有關於共用資料的操作。
方法:鎖機制->synchronized或lock對象
5.線程同步
當兩個或兩個以上的線程需要共用資源,他們需要某種方法來確定資源在某一刻僅被一個線程佔用,達到此目的的過程叫做同步。
同步代碼塊:synchronized(Object){};將需要同步的打嗎放在大括弧中,括弧中的對象即為鎖。
同步函數:synchronized放在函數上,修飾符之後,傳回型別之前。同步函數的鎖是this,靜態同步函數的鎖是class對象,如懶漢式的同步鎖為Single.class。
6.wait和sleep的區別
wait:可指定等待時間,如果不指定,需要由notify/notifyAll喚醒。等待期間線程釋放執行權,釋放鎖。
sleep:必須指定等待時間,時間到了會自動處於臨時(阻塞)狀態,睡眠期間仍持有鎖,不釋放執行權。
wait只能在同步中使用,sleep可以在任意地方(Object的方法)。
12.集合
Collection
| |–ArrayList
|—-List -|
| |–LinkedList
|
| |-TreeSet
|—-Set-|
|-HashSet
Map
|
|—-HashMap
|
|—-TreeMap
1.Collection :
List:有序的,元素可重複,有索引。
ArrayList:底層是數組結構,尋找快,增刪慢,不同步。
LinkedList:底層是鏈表結構,增刪快,尋找慢,不同步。
Vector:底層是數組結構,線程同步,被ArrayList取代。
Set:無序,無索引,元素不可重複
HashSet:底層是雜湊表,線程不同步,無序,搞笑。
TreeSet:底層是二叉樹,可以對元素進行排序,預設是自然順序。
2.Map:
HashTable:底層是雜湊表,線程同步,不可以存入null鍵和null值。
HashMap:底層是雜湊表,允許使用null鍵和null值,不同步,效率高
TreeMap:底層是二叉樹,不同步,可排序,與set很像。Set底層使用了map集合。
3.Collection和Map的區別
Collection:單列集合,一次存一個元素。
Map:雙列集合,一次存一對元素,兩個元素之間存在映射關係。
13.Regex
概述:Regex是用來操作字串的一些規範,它是使用一些符號代表指定一些代碼,從而可簡化字串的基本操作。
匹配:String類中的matches(String Regex)
切割:String split
替換:String replaceAll
擷取:
封裝Regex成對象:Pattern p = Pattern.compile(regex);
關聯字串擷取匹配器:Matcher m = p.mathcer(str);
使用matcher的方法擷取:find();group();
14.XML解析
dom和sax解析都是全部讀入記憶體之後在解析,dom適合增刪改,sax適合尋找。如果XML檔案很大,容易造成記憶體溢出
pull解析是邊度邊解析。
15.Java中變數的儲存
執行個體變數和靜態變數在堆上,局部變數在棧上
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
面試總結(一)——Java基礎相關知識