Java基礎總結

一、Spring Boot

Spring Boot常用註解
@SpringBootApplication
需要啓動的主類中加入此註解,告訴 Spring Boot,這個類是程序的入口。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
可以用這三個註解代替 SpringBootApplication

@Configuration
加入了這個註解的類被認爲是 Spring Boot 的配置類,我們知道可以在 application.yml 設置一些配置,也可以通過代碼設置配置。
如果我們要通過代碼設置配置,就必須在這個類上標註 Configuration 註解,不過 Spring Boot 官方推薦 Spring Boot 項目用 SpringBootConfiguration 來代替 Configuration。

@Bean
這個註解是方法級別上的註解,主要添加在 @Configuration 或 @SpringBootConfiguration 註解的類,有時也可以添加在 @Component 註解的類。它的作用是定義一個Bean。

@Value
通常情況下,我們需要定義一些全局變量,都會想到的方法是定義一個 public static 變量,在需要時調用。


二、堆棧的概念
1. 堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。
2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享。

三、Spring基本原理
內部最核心的就是IOC了,動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java裏的反射,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,根據Spring的配置文件來動態的創建對象和調用對象裏的方法的。Spring還有一個核心就是AOP這個就是面向切面編程,可以爲某一類對象進行監督和控制(也就是在調用這類對象的具體方法的前後去調用你指定的模塊)從而達到對一個模塊擴充的功能。這些都是通過配置類達到的。 
Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)


四、Callable 和 Future接口的區別
1. Callable規定的方法是call(),而Runnable規定的方法是run(). 
2. Callable的任務執行後可返回值,而Runnable的任務是不能返回值的。  
3. call()方法可拋出異常,而run()方法是不能拋出異常的。 
4. 運行Callable任務可拿到一個Future對象, Future表示異步計算的結果。 
5. 它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。 
6. 通過Future對象可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。 
7. Callable是類似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。


五、反射:運行時類信息
如果不知道某個對象的確切類型,RTTI可以告訴你,但是有一個前提:這個類型在編譯時必須已知,這樣才能使用RTTI來識別它。Class類與java.lang.reflect類庫一起對反射進行了支持,該類庫包含Field、Method和Constructor類,這些類的對象由JVM在啓動時創建,用以表示未知類裏對應的成員。這樣的話就可以使用Contructor創建新的對象,用get()和set()方法獲取和修改類中與Field對象關聯的字段,用invoke()方法調用與Method對象關聯的方法。另外,還可以調用getFields()、getMethods()和getConstructors()等許多便利的方法,以返回表示字段、方法、以及構造器對象的數組,這樣,對象信息可以在運行時被完全確定下來,而在編譯時不需要知道關於類的任何事情。
反射機制並沒有什麼神奇之處,當通過反射與一個未知類型的對象打交道時,JVM只是簡單地檢查這個對象,看它屬於哪個特定的類。因此,那個類的.class對於JVM來說必須是可獲取的,要麼在本地機器上,要麼從網絡獲取。所以對於RTTI和反射之間的真正區別只在於:
RTTI,編譯器在編譯時打開和檢查.class文件
反射,運行時打開和檢查.class文件

六、Java對象的序列化和反序列化
一、序列化和反序列化的概念
  把對象轉換爲字節序列的過程稱爲對象的序列化。
  把字節序列恢復爲對象的過程稱爲對象的反序列化。
  對象的序列化主要有兩種用途:
  1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
  2) 在網絡上傳送對象的字節序列。

對象序列化包括如下步驟:
  1) 創建一個對象輸出流,它可以包裝一個其他類型的目標輸出流,如文件輸出流;
  2) 通過對象輸出流的writeObject()方法寫對象。

  對象反序列化的步驟如下:
  1) 創建一個對象輸入流,它可以包裝一個其他類型的源輸入流,如文件輸入流;
  2) 通過對象輸入流的readObject()方法讀取對象。
顯式地定義serialVersionUID有兩種用途:
    1、 在某些場合,希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;
    2、 在某些場合,不希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。

七、JVM相關
JVM的組成、垃圾回收機制
JVM主要包括:解釋器、指令系統、寄存器、棧、存儲區和碎片回收區
JVM解釋器:即這個虛擬機處理字段碼的CPU。
JVM指令系統:該系統與計算機很相似,一條指令由操作碼和操作數兩部分組成。
寄存器:JVM有自己的虛擬寄存器,這樣就可以快速地與JVM的解釋器進行數據交換。
JVM棧:指令執行時數據和信息存儲的場所和控制中心,它提供給JVM解釋器運算所需要的信息。

減少GC開銷措施:
1. 不要顯式調用System.gc()
2. 儘量減少臨時對象的使用
3. 儘量使用StringBuffer,而不用String來累加字符串。
4. 儘量少用靜態對象變量。靜態變量屬於全局變量,不會被GC回收,它們會一直佔用內存。

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