1. 程式人生 > 實用技巧 >Java基礎知識總結

Java基礎知識總結

1.說說&和&&的區別。

&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都 為 true 時,整個運算結果才為 true,否則,只要有一方為 false,則結果為 false。

&&還具有短路的功能,即如果第一個表示式為 false,則不再計算第二個表示式

&還可以用作位運算子,當&操作符兩邊的表示式不是 boolean 型別時,&表示按位與操作

2."=="和 equals 方法究竟有什麼區別?

對於基本型別和引用型別 == 的作用效果是不同的,如下所示:

  • 基本型別:比較的是值是否相同;
  • 引用型別:比較的是引用是否相同;

equals 本質上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。

總結 :== 對於基本型別來說是值比較,對於引用型別來說是比較的是引用;而 equals 預設情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

3.Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值 的型別?

Overload 是過載的意思,Override 是覆蓋的意思,也就是重寫。

方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。

過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;

重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。

過載對返回型別沒有特殊的要求。

4.String和StringBuilder、StringBuffer的區別?

Java平臺提供了兩種型別的字串:String和StringBuffer/StringBuilder,它們可以儲存和操作字串。

其中String是隻讀字串,也就意味著String引用的字串內容是不能被改變的。

而StringBuffer/StringBuilder類表示的字串物件可以直接進行修改。

StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單執行緒環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

5.描述一下JVM載入class檔案的原理機制?

JVM中類的裝載是由類載入器(ClassLoader)和它的子類來實現的,Java中的類載入器是一個重要的Java執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。類的載入是指把類的.class檔案中的資料讀入到記憶體中,通常是建立一個位元組陣列讀入.class檔案

6.抽象類(abstract class)和介面(interface)有什麼異同?

抽象類和介面都不能夠例項化,但可以定義抽象類和介面型別的引用。

一個類如果繼承了某個抽象類或者實現了某個介面都需要對其中的抽象方法全部進行實現,否則該類仍然需要被宣告為抽象類。

介面比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而介面中不能定義構造器而且其中的方法全部都是抽象方法。

抽象類中的成員可以是private、預設、protected、public的,而介面中的成員全都是public的。

抽象類中可以定義成員變數,而介面中定義的成員變數實際上都是常量。有抽象方法的類必須被宣告為抽象類,而抽象類未必要有抽象方法。

7.Java 中會存在記憶體洩漏嗎,請簡單描述。

理論上Java因為有垃圾回收機制(GC)不會存在記憶體洩露問題(這也是Java被廣泛使用於伺服器端程式設計的一個重要原因);

然而在實際開發中,可能會存在無用但可達的物件,這些物件不能被GC回收,因此也會導致記憶體洩露的發生。

例如hibernate的Session(一級快取)中的物件屬於持久態,垃圾回收器是不會回收這些物件的,然而這些物件中可能存在無用的垃圾物件,如果不及時關閉(close)或清空(flush)一級快取就可能導致記憶體洩露

8.Java 中的final關鍵字有哪些用法?

(1)修飾類:表示該類不能被繼承;(2)修飾方法:表示方法不能被重寫;(3)修飾變數:表示變數只能一次賦值以後值不能被修改(常量)。

9.List、Set、Map是否繼承自Collection介面?

List、Set 是,Map 不是。

Map是鍵值對對映容器,與List和Set有明顯的區別,而Set儲存的零散的元素且不允許有重複元素(數學中的集合也是如此),List是線性結構的容器,適用於按數值索引訪問元素的情形。

10.Collection和Collections的區別?

Collection是一個介面,它是Set、List等容器的父介面;Collections是個一個工具類,提供了一系列的靜態方法來輔助容器操作,這些方法包括對容器的搜尋、排序、執行緒安全化等等。

11.List、Map、Set三個介面存取元素時,各有什麼特點?

List以特定索引來存取元素,可以有重複元素。Set不能存放重複元素(用物件的equals()方法來區分元素是否重複)。Map儲存鍵值對(key-value pair)對映,對映關係可以是一對一或多對一

12.****獲得一個類的類物件有哪些方式?****

- 方法1:型別.class,例如:String.class
- 方法2:物件.getClass(),例如:”hello”.getClass()

- 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)

13.****簡述一下你瞭解的設計模式。****

**工廠模式:**工廠類可以根據條件生成不同的子類例項,這些子類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的資料進行了不同的操作(多型方法)。當得到子類的例項後,開發人員可以呼叫基類中的方法而不必考慮到底返回的是哪一個子類的例項。

**單例模式:**一個類只有一個例項,即一個類只有一個物件例項。

懶漢式單例模式,執行緒不安全,致命的是在多執行緒不能正常工作

餓漢式單例模式,避免了多執行緒的同步問題

14.List、Set、Map 之間的區別是什麼?

img

15.ArrayList 和 LinkedList 的區別是什麼?

最明顯的區別是 ArrrayList底層的資料結構是陣列,支援隨機訪問,

而 LinkedList 的底層資料結構是雙向迴圈連結串列,不支援隨機訪問。

使用下標訪問一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。

16.並行和併發有什麼區別?
  • 並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔發生。
  • 並行是在不同實體上的多個事件,併發是在同一實體上的多個事件。
  • 在一臺處理器上“同時”處理多個任務,在多臺處理器上同時處理多個任務。如hadoop分散式叢集。
17.執行緒和程序的區別?

簡而言之,程序是程式執行和資源分配的基本單位,一個程式至少有一個程序,一個程序至少有一個執行緒。

程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體資源,減少切換次數,從而效率更高。

執行緒是程序的一個實體,是cpu排程和分派的基本單位,是比程式更小的能獨立執行的基本單位。

同一程序中的多個執行緒之間可以併發執行。

18.建立執行緒有哪幾種方式?

(1)繼承Thread類建立執行緒類

  • 定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。
  • 建立Thread子類的例項,即建立了執行緒物件。
  • 呼叫執行緒物件的start()方法來啟動該執行緒。

(2)通過Runnable介面建立執行緒類

  • 定義runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
  • 建立 Runnable實現類的例項,並依此例項作為Thread的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
  • 呼叫執行緒物件的start()方法來啟動該執行緒。
19.什麼是反射?

反射主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力

Java反射:

在Java執行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個物件,能否呼叫它的任意一個方法

Java反射機制主要提供了以下功能:

  • 在執行時判斷任意一個物件所屬的類。
  • 在執行時構造任意一個類的物件。
  • 在執行時判斷任意一個類所具有的成員變數和方法。
  • 在執行時呼叫任意一個物件的方法。
20.動態代理的應用:
  • Spring的AOP
  • 加事務
  • 加許可權
  • 加日誌
21.throw 和 throws 的區別?

throws是用來宣告一個方法可能丟擲的所有異常資訊,throws是將異常宣告但是不處理,而是將異常往上傳,誰呼叫我就交給誰處理。而throw則是指丟擲的一個具體的異常型別。

22.OSI 的七層模型都有哪些?
  1. 應用層:網路服務與終端使用者的一個介面。
  2. 表示層:資料的表示、安全、壓縮。
  3. 會話層:建立、管理、終止會話。
  4. 傳輸層:定義傳輸資料的協議埠號,以及流控和差錯校驗。
  5. 網路層:進行邏輯地址定址,實現不同網路之間的路徑選擇。
  6. 資料鏈路層:建立邏輯連線、進行硬體地址定址、差錯校驗等功能。
  7. 物理層:建立、維護、斷開物理連線。
23.spring 常用的注入方式有哪些?

Spring通過DI(依賴注入)實現IOC(控制反轉),常用的注入方式主要有三種:

  1. 構造方法注入
  2. setter注入
  3. 基於註解的注入
24.spring中bean裝配有兩種方式
  • 隱式的bean發現機制和自動裝配
  • 在java程式碼或者XML中進行顯示配置
25.spring 事務實現方式有哪些?
  1. 程式設計式事務管理對基於 POJO 的應用來說是唯一選擇。我們需要在程式碼中呼叫beginTransaction()、commit()、rollback()等事務管理相關的方法,這就是程式設計式事務管理。
  2. 基於 TransactionProxyFactoryBean 的宣告式事務管理
  3. 基於 @Transactional 的宣告式事務管理
  4. 基於 Aspectj AOP 配置事務
26.spring mvc 有哪些元件?

Spring MVC的核心元件:

  1. DispatcherServlet:中央控制器,把請求給轉發到具體的控制類
  2. Controller:具體處理請求的控制器
  3. HandlerMapping:對映處理器,負責對映中央處理器轉發給controller時的對映策略
  4. ModelAndView:服務層返回的資料和檢視層的封裝類
  5. ViewResolver:檢視解析器,解析具體的檢視
  6. Interceptors :攔截器,負責攔截我們定義的請求然後做處理工作