Java面試題基礎篇(一)

LNhome發表於2018-03-28

基本功

1、物件導向的特徵

抽象:
忽略一個主題中與當前目標無關的東西,專注與當前目標有關的方面。把現實中的某一類東西提取出來,用程式程式碼表示,抽象出來的一般叫做類或者介面。
    資料抽象--->表示一類事物的特徵,就是物件的屬性。
過程抽象--->表示一類事物的行為,就是物件的行為。
封裝:
就是將事物的過程和資料包圍起來,對於資料的訪問只能通過特定的方法,如私有變數,用set,get方法獲取。
繼承:
物件的新類可以從現有類中派生,這個過程叫做繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),原始類稱為新類的基類(父類)。派生類可以從它的父類中繼承方法和變數,並且可以修改或增加新的方法使之適合更特殊的需要,因此可以說,繼承是為了重用父類的程式碼,同時為實現多型性做準備。
多型:
多型是指允許不同類的物件對同一訊息做出響應,多型性包括引數化多型性和包含多型性,總的來說方法的重寫和過載與動態連結構成多型性。

動態連結--->對於父類中定義的方法,如果子類重寫該方法,那麼父類型別中的引用將呼叫子類中的這個方法,這就是動態連結。

2、final、finally、finalize的區別

final修飾符:
被final修飾的類,就意味著不能派生出子類,不能作為父類被子類所繼承。因此一個類不能既被abstract宣告,又被final宣告。被final修飾的變數或者方法可以保證他們在使用的過程中不被修改,被final宣告的變數必須在宣告時就給出變數的初始值,在以後的使用中只能被讀取。被final宣告的方法不能被過載。
finally:
finally是在異常處理時提供finally塊來執行必要的操作,不管有沒有異常被丟擲,捕獲,finally塊都會被執行。try塊中的內容是在無異常時執行到結束,catch塊中的內容是在發生catch所宣告的異常時,跳轉到catch塊中執行,finally塊則是無論異常是否發生,都會執行。所以在程式碼邏輯中有無論發生什麼都需要執行的程式碼,都可以放在finally中
finalize:

finalize是方法名,java允許使用finalize()方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在object類中定義的,所有類都會繼承它。子類中覆蓋finalize()方法以整理系統資源或者被執行其他清理工作。finalize()方法是在垃圾收集器刪除物件之前對這個物件呼叫的。

3、int和Integer有什麼區別(==做比較)

Integer和new Integer不會相等,因為new出的物件放在堆記憶體中,而非new出來的Integer常量則存放在常量池中,它們的記憶體地址不一樣。
兩個都是非new出來的Integer,如果數在-128到127之間,則為true,否則為false。因為java在編譯Integer i = 128的時候會被翻譯成,Integet i = Integer.valueOf(128),而valueOf()方法會對-128到127之間的數進行快取。
兩個都為new出來的,都為false,因為記憶體地址不一樣。

int和Integer(無論new與否),都為true,因為Integer會自動拆箱為int再去比較

4、過載和重寫的區別

過載(overloading):
方法過載是讓類以統一的方式處理不同型別資料的一種手段,多個同名函式同時存在,具有不同的引數個數/型別,過載是類的多型性的一種表現。需要注意一點的是,不以返回值型別是否相同做為過載函式的區分標準。
重寫(overriding):

重寫體現的是父類與子類之間的多型性,子類對父類中的方法進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們稱之為方法被重寫,在子類中需要呼叫父類中原有的方法,可以使用super關鍵字,該關鍵字啊引用類當前類的父類。重寫時需要注意子類函式的訪問修飾許可權不能少於父類的,子類方法不能丟擲比父類方法更多的異常(但子類方法可以不丟擲異常),方法被定義為final不能被重寫。

5、介面和抽象類有什麼區別/異同

介面和抽象類的概念不一樣,介面是對動作的抽象,抽象類是對事物根源的抽象。介面表示的是這個物件能做什麼,抽象類表示的是這個物件是什麼。總結來說就是:
抽象類和介面都不能直接例項化,如果要例項化,抽象類必須由實現所有抽象方法的子類進行例項化,介面必須由實現所有介面方法的類物件例項化。
抽象類要被子類所繼承,介面要被類實現。
介面只能做方法宣告,抽象類中可以做方法宣告,也可以做方法實現(java8中已可以在介面中做方法的實現)。
介面中定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
抽象類中的抽象方法必須全部被子類所實現,如果子類不能實現父類全部的抽象方法,那麼該子類只能是抽象類。同樣如果不能實現介面的全部方法,那麼該類也只能是抽象類。
抽象方法只能宣告,不能實現,介面是設計的介面,抽象類是重構的介面。
抽象類裡可以沒有抽象方法,但是一個類中存在抽象方法,這個類只能是抽象類。
抽象方法要被實現,所以不能是靜態的,也不能是私有的。

介面可以繼承介面,並且可以多繼承介面,但是類只能單繼承。

6、說說反射的用途及實現

反射用途:
反射是指在執行中載入、探知、使用編譯期間完全未知的class。java程式可以載入一個在執行期間才知道名稱的class,獲取其完整的構造並生成物件例項或者對其欄位進行賦值或呼叫例項的方法。
反射的使用:
第一步:獲取想操作類的Class物件,在執行中的java程式中,用java.lang.Class類描述類和介面等。Class c = Class.forName(className);
第二步:呼叫諸如getDeclaredMethods 的方法,獲取該類中定義的方法列表等。

第三步:使用reflection API 來操作這些資訊。

7、說說自定義註解的場景及實現

登陸、許可權攔截:
在web專案中,登陸攔截和許可權攔截是一個老生常談的功能。通過自定義登陸註解或許可權註解,在自定義攔截器中解析註解,實現登陸和許可權的攔截功能。
定時任務管理:
在系統構建過程中,會有各種定時任務的需求,而定時任務的集中管理,可以更高效維護系統的執行。
多資料來源路由的資料來源指定:

Spring提供的AbstractRoutingDataSource實現多資料來源的動態路由,可應用在主從分離的架構下。通過對不同的方法指定不同的資料來源,實現資料來源的動態路由(例如:讀方法走從庫資料來源,寫方法走主庫資料來源)。而如何標識不同的方法對應的資料來源型別,則可使用自定義註解實現。通過解析方法上宣告的自定義註解對應的資料來源型別,實現資料來源的路由功能。

8、HTTP 請求的 GET 與 POST 方式的區別

GET請求能夠被快取,POST請求不能被快取下來
GET請求會儲存在瀏覽器的瀏覽記錄中,POST請求不會儲存在瀏覽器瀏覽記錄中
GET請求有長度限制,POST請求沒有長度限制
POST對比GET相對安全

在RESTful風格中,GET用於從伺服器獲獲取資料,而POST用於建立資料

9、session 與 cookie 區別以及session的實現原理

session儲存在伺服器,客戶端不知道其中的資訊,cookie儲存在客戶端,服務端可以知道其中的資訊。
session中儲存的是物件,cookie儲存的是字串。
session不能區分路徑,同一個使用者在訪問同一個網站期間,所有的session在任意一個地方都能訪問到,而cookie中如果設定了路徑引數,那麼在同一個網站中不同路徑下的cookie不能互相訪問。
session實現原理:

伺服器建立session出來後,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的瀏覽器不關,再去訪問伺服器時,都會帶著session的id號去,伺服器發現客戶機瀏覽器帶session id過來了,就會使用記憶體中與之對應的session為之服務。若瀏覽器禁用cookie,可以使用URL重寫的方式來實現session(response. encodeRedirectURL(java.lang.String url)和response. encodeURL(java.lang.String url)是兩個非常智慧的方法,當檢測到瀏覽器沒有禁用cookie時,那麼就不進行URL重寫了)。

10、session 分散式處理

粘性session:
負載均衡器設定粘性session,以後使用者的每次請求都會轉發到固定的伺服器上。優點:不需要對session做任何處理,缺點:缺乏容錯性,如果當前伺服器發生故障,使用者被轉移到第二臺伺服器上,它的session資訊將失效。適用場景:發生故障對客戶產生影響較小,伺服器發生故障概率較小。
伺服器session複製:
任何一個伺服器上的session發生改變,該節點會把這個session的所有內容序列化,然後廣播給所有的其他節點,不管其他伺服器需不需要session,以此保證session同步。優點:可容錯,各個伺服器間session能夠實時響應,缺點:對網路負荷造成壓力,如果session量大的話可能造成網路堵塞,拖慢伺服器效能。
session共享機制:
使用分散式快取方案比如memcached、redis,但是要求Memcached或Redis必須是叢集。使用Session共享也分兩種機制,兩種情況如下:
①粘性session處理方式,原理:不同的web容器指定訪問不同的主redis,多個redis服務之間資訊是同步的,能主從備份和高可用。使用者訪問時首先在web服務中建立session,然後將session複製一份到它對應的redis上,redis僅起到備份作用,讀寫都在web服務中。當一個web服務掛掉之後,叢集將使用者訪問定位到備份web服務上,然後根據cookie中儲存的sessionId找session,找不到時再去相應的redis獲取session,找到之後將session複製到備份web服務中。
②非粘性session處理方式,redis做主從複製,寫入session都往redis服務上寫,讀取都從redis服務上讀取,web服務本身不儲存session。優點:可容錯,session實時響應。
session持久化到資料庫:
將session資訊儲存到資料庫中,保證session的持久化。優點:伺服器出現問題,session不會丟失。缺點:如果訪問量很大,會對資料庫造成壓力,還需要增加額外的開銷維護資料庫。
terracotta實現session複製:

terracotta的基本原理是對於叢集間共享的資料,當一個節點發生變化時,terracotta只把變化的部分傳送給terracotta伺服器,然後由伺服器把它轉發給真正需要這個資料的節點,這個可以看作是對第二種方案(session複製方案)的優化。優點:對於網路的壓力非常小,各個節點也不需要浪費CPU和記憶體進行大量的序列化操作,把這種叢集間資料共享的機制應用在session同步上,既避免了對資料庫的依賴,又能達到負載均衡和災難恢復的效果。

11、JDBC 流程

註冊驅動,Class.forName("oracle.jdbc.OracleDriver");
建立連結,Connection conn = DriverManager.getConnection(url,name,password);
建立語句,Statement statement = conn.createStatement();
執行語句,ResultSet resultSet = statement.executeQuery(sql);

處理結果,resultSet.next()方法移動行,可以使用各種get方法獲取當前行的值。

12、MVC 設計思想

模型:
業務層,業務邏輯層。包含業務資料處理加工及相應的事務,安全,許可權,日誌等功能模組。
檢視層:
展現模型處理的結果,另外還需要提供相應的操作介面。
控制層:
檢視傳送請求給控制器,由控制器選擇相應的模型來處理,模型返回的結果給控制器,由控制器選擇合適的檢視。
MVC設計模式的優點:實現分層開發,每個層均有各自的作用。降低層與層之間的依賴,有利於程式碼的標準化開發。高重用性和可適用性。測試友好性。缺點:實現複雜,增加程式碼量,增加軟體開發成本,設計難度也會增加。


13、equals 與 == 的區別

==:
==比較的是記憶體中存放物件的記憶體地址,用來判斷兩個物件的地址是否相同,即是否指向的是同一個物件。
equals:
equals比較的是兩個物件內容是否相等,由於所有的類都是繼承Object類,所以適用所有的物件,如果沒有對該方法進行覆蓋,呼叫的仍是Obejct類中的方法,Object類中equals方法返回的是==判斷。

相關文章