2018java面試(2)- 基礎篇 - java基礎

面向對象的特徵

        面向對象的三個基本特徵是:封裝,繼承,多態

        封裝:是對象和類概念的主要特徵,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對 象操作,對不可信的進行信息隱藏

         繼承:面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展

          多態:多態性(polymorphisn)是允許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。實現多態,有二種方式,覆蓋,重載

final, finally, finalize 的區別

final: 用於聲明屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承.

finally: 是異常處理語句結構的一部分,表示總是執行.

finalize:是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收, 例如關閉文件等. JVM不保證此方法總被調用

int 和 Integer 有什麼區別

int 是 Java 提供的 8 種原始數據類型之一。Java 爲每個原始類型提供了封裝類,Integer 是 Java 爲 int 提供的封裝類。
int 的默認值爲 0,而 Integer 的默認值爲 null,是引用類型,即 Integer 可以區分出未賦值和值爲 0 的區別,int 則無法表達出未賦值的情況。

Java 中 int 和 Integer 關係是比較微妙的。關係如下

1.int是基本的數據類型;

2.Integer是int的封裝類;

3.int 和 integer都可以表示某一數值;

4.int 和 integer 不能夠互用,因爲他們是兩種不同的數據類型

重寫和重載的區別

Override和Overload他們其實沒什麼關係,只是名字看着相似一樣

重寫Override:表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因爲子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法

重載Overload:表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)


接口和抽象類的區別

相同點:1)都位於繼承的頂端,用於實現或者繼承  2)都不可實例化  3)都可以定義抽象方法,其子類或者實現類必須實現這些方法

不同點:1)接口沒有構造方法,抽象類有2)抽象類可以包含普通方法和抽象方法,而接口只能包含抽象方法3)一個類只能繼承一個父類,接口是多實現的4)成員變量:接口裏默認是public static final,抽象類默認的是包權限5)方法:接口裏默認是public abstract,抽象類默認是包訪問權限6)內部類:接口裏默認的是public static,抽象類默認的是包權限

反射的用途及實現

反射的用途:Java 反射機制是一個非常強大的功能,在很多的項目比如 Spring,MyBatis 都都可以看到反射的身影。通過反射機制,我們可以在運行期間獲取對象的類型信息。利用這一點我們可以實現工廠模式和代理模式等設計模式,同時也可以解決 Java 泛型擦除等令人苦惱的問題

反射的實現:獲取一個對象對應的反射類,在 Java 中有下列方法可以獲取一個對象的反射類

通過 getClass() 方法

通過 Class.forName() 方法

使用 類.class

通過類加載器實現,getClassLoader()

自定義註解的場景及實現

       登陸、權限攔截、日誌處理,以及各種 Java 框架,如 Spring,Hibernate,JUnit 提到註解就不能不說反射,Java 自定義註解是通過運行時靠反射獲取註解。實際開發中,例如我們要獲取某個方法的調用日誌,可以通過 AOP(動態代理機制)給方法添加切面,通過反射來獲取方法包含的註解,如果包含日誌註解,就進行日誌記錄。反射的實現在 Java 應用層面上講,是通過對 Class 對象的操作實現的,Class 對象爲我們提供了一系列方法對類進行操作。在 JVM 這個角度來說,Class 文件是一組以 8 位字節爲基礎單位的二進制流,各個數據項目按嚴格的順序緊湊的排列在 Class 文件中,裏面包含了類、方法、字段等等相關數據。通過對 Class 數據流的處理我們即可得到字段、方法等數據。

HTTP請求的get和post方式的區別

1:根據 HTTP 規範,GET 用於信息獲取,而且應該是安全的和冪等的。

2:根據 HTTP 規範,POST 表示可能修改變服務器上的資源的請求。

3:首先是 “GET 方式提交的數據最多隻能是 1024 字節”,因爲 GET 是通過 URL 提交數據,那麼 GET 可提交的數據量就跟 URL 的長度有直接關係了。而實際上,URL 不存在參數上限的問題,HTTP 協議規範沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE 對 URL 長度的限制是 2083 字節(2K+35)。對於其他瀏覽器,如 Netscape、FireFox 等,理論上沒有長度限制,其限制取決於操作系統的支持。注意這是限制是整個 URL 長度,而不僅僅是你的參數值數據長度。

4:POST 是沒有大小限制的,HTTP 協議規範也沒有進行大小限制

session 與 cookie 區別

1:cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上。

2:cookie 不是很安全,別人可以分析存放在本地的 cookie 並進行 cookie 欺騙,考慮到安全應當使用session。

3:session 會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用 cookie。

4:單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存 20 個 cookie

session的分佈式處理

session複製:

在支持 Session 複製的 Web 服務器上,通過修改 Web 服務器的配置,可以實現將 Session 同步到其它 Web 服務器上,達到每個 Web 服務器上都保存一致的 Session。

優點:代碼上不需要做支持和修改。
缺點:需要依賴支持的 Web 服務器,一旦更換成不支持的 Web 服務器就不能使用了,在數據量很大的情況下不僅佔用網絡資源,而且會導致延遲。
適用場景:只適用於Web服務器比較少且 Session 數據量少的情況。

可用方案:開源方案 tomcat-redis-session-manager,暫不支持 Tomcat8。

session粘滯

將用戶的每次請求都通過某種方法強制分發到某一個 Web 服務器上,只要這個 Web 服務器上存儲了對應 Session 數據,就可以實現會話跟蹤。

優點:使用簡單,沒有額外開銷。
缺點:一旦某個 Web 服務器重啓或宕機,相對應的 Session 數據將會丟失,而且需要依賴負載均衡機制。

適用場景:對穩定性要求不是很高的業務情景。

session集中管理

在單獨的服務器或服務器集羣上使用緩存技術,如 Redis 存儲 Session 數據,集中管理所有的 Session,所有的Web服務器都從這個存儲介質中存取對應的 Session,實現 Session 共享。

優點:可靠性高,減少 Web 服務器的資源開銷。
缺點:實現上有些複雜,配置較多。
適用場景:Web服務器較多、要求高可用性的情況。

可用方案:開源方案 Spring Session,也可以自己實現,主要是重寫 HttpServletRequestWrapper 中的 getSession 方法。

基於 Cookie 管理

這種方式每次發起請求的時候都需要將 Session 數據放到 Cookie 中傳遞給服務端。

優點:不需要依賴額外外部存儲,不需要額外配置。
缺點:不安全,易被盜取或篡改;Cookie 數量和長度有限制,需要消耗更多網絡帶寬。

適用場景:數據不重要、不敏感且數據量小的情況。

總結

這四種方式,相對來說,Session 集中管理 更加可靠,使用也是最多的。

JDBC 流程

1:向 DriverManager 類註冊驅動數據庫驅動程序
2:調用 DriverManager.getConnection 方法, 通過JDBC URL,用戶名,密碼取得數據庫連接的 Connection 對象。
3:獲取 Connection 後, 便可以通過 createStatement 創建 Statement 用以執行 SQL 語句。
4:有時候會得到查詢結果,比如 select,得到查詢結果,查詢(SELECT)的結果存放於結果集(ResultSet)中。

5:關閉數據庫語句,關閉數據庫連接。

MVC 設計思想

MVC 是三個單詞的首字母縮寫,它們是 Model(模型)、View(視圖)和 Controller(控制)。
這個模式認爲,程序不論簡單或複雜,從結構上看,都可以分成三層:

1:最上面的一層,是直接面向最終用戶的”視圖層”(View)。它是提供給用戶的操作界面,是程序的外殼。
2:最底下的一層,是核心的”數據層”(Model),也就是程序需要操作的數據或信息。

3:中間的一層,就是”控制層”(Controller),它負責根據用戶從”視圖層”輸入的指令,選取”數據層”中的數據,然後對其進行相應的操作,產生最終結果。

Hashcode方法的作用

     判斷兩個key是否重複會調用hashcode方法和equals方法,這裏說的不重複是說hashCode和equals只要有一個不等就可以了.所以簡單來說,hashCode相當於一個對象的編碼,就好像文件中的md5,他和equals不同就在於他返回的是int型的,比較起來不直觀,我們一般重寫equals的同時也重寫hashCode,讓他們邏輯一致。

另外一些小問題

1:equals 與 == 的區別
2:Hashcode方法的作用:我們一般重寫equals的同時也重寫hashCode,讓他們邏輯一致。
3:static:修飾變量、修飾方法,靜態塊,靜態內部類
4:Jdk中哪些類是不能被繼承的:被final修飾的類不能繼承。八大基本數據類型及其包裝類和String類

5:for和foreach:foreach是for循環的一種簡便寫法,但是隻有實現了iterator的對象才能使用foreach循環。 


只是簡單陳述知識點,不清楚的地方再找資料看一下,未完待續....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章