
小編之前寫過一期Java學習路線總結??搬磚工逆襲Java架構師??(全網最強,建議收藏)
廣受大家喜愛,有的粉絲問我,能不能出一期入門級別的博客,好吧,是我考慮不周了,今天我就將它補上,
為感謝大家對我的支持,在此做一個送書活動!
🍅 粉絲專屬福利:包郵送書3本,原價128元的《億級流量Java高并發與網路編程實戰》
🍅 獲取方式:
1、評論區評論:獲取點贊最多者,獲取一本;
2、微信群抽獎:采取微信群發紅包的形式,手氣最佳者獲取一本;
3、2021年9月28日 20:00進行抽獎,并在第一時間公布中獎結果;
【注意】想加入微信群聊,可以掃描主頁左側二維碼、私信與我、加本人微信guo_rui_
目錄
一、Java成名史
二、JDK 與 JRE
三、語言的五大特性
四、物件間的四種關系
1、依賴
2、關聯
3、聚合
4、組合
五、封裝、繼承、多型
1、封裝
2、繼承
3、多型
六、我的第一個Java程式
1、先配置環境變數
2、hello world
七、八種基本資料型別
八、Java的重要概念
1、類
2、普通類和抽象類
3、介面和抽象類
4、成員變數和區域變數
5、物件的創建和宣告周期
6、final 和 static
7、final、finally、finalize
8、Java運算子
9、回圈結構
10、條件運算式
11、super與this
12、方法的重寫
13、在 Java 中,什么時候用多載,什么時候用重寫?
14、抽象類和介面
15、克隆
16、javac
九、Java Character 類
十、String
十一、陣列
1、概念
2、格式
3、初始化
4、遍歷
5、常見例外
十二、資料保存在哪里
1、暫存器
2、堆與堆疊
3、常量存盤
4、非RAM存盤
十三、java例外
十四、序列化與反序列化
十五、Java IO流
十六、泛型
十七、列舉
十八、注解
十九、動態代理
二十、反射機制
二十一、Java注意事項
粉絲專屬福利
送書啦!!!
《億級流量Java高并發與網路編程實戰》簡介
【圖書簡介】
【內容簡介】
【作者簡介】
一、Java成名史
想要學好一門語言,一定要了解它的歷史,了解它存在的價值和意義,
1991年成立了一個稱為Green的專案小組,帕特里克、詹姆斯·高斯林、麥克·舍林丹和其他幾個工程師一起組成的作業小組在加利福尼亞州門洛帕克市沙丘路的一個小作業室里面研究開發新技術,專攻計算機在家電產品上的嵌入式應用,
由于C++所具有的優勢,該專案組的研究人員首先考慮采用C++來撰寫程式,但對于硬體資源極其匱乏的單片式系統來說,C++程式過于復雜和龐大,
為了解決困難,他們首先著眼于語言的開發, 對于新語言的設計,Sun公司研發人員并沒有開發一種全新的語言,而是根據嵌入式軟體的要求,對C++進行了改造,去除了留在C++的一些不太實用及影響安全的成分,并結合嵌入式系統的實時性要求,開發了一種稱為Oak的面向物件語言,
1994年將Oak語言更名為Java,
1996年1月,Sun公司發布了Java的第一個開發工具包(JDK 1.0),這是Java發展歷程中的重要里程碑,標志著Java成為一種獨立的開發工具,
1998年12月8日,第二代Java平臺的企業版J2EE發布,
1999年4月27日,HotSpot虛擬機發布,
2005年6月,在Java One大會上,Sun公司發布了Java SE 6,此時,Java的各種版本已經更名,已取消其中的數字2,如J2EE更名為JavaEE,J2SE更名為JavaSE,J2ME更名為JavaME,
2009年,甲骨文公司宣布收購Sun,
2014年3月Oracle發布正式版JDK8,JDK8改進比較多,最大的改進是Lambda運算式(以及因之帶來的函式式介面,很多原有類都做了變更,但能夠與以往版本兼容,堪稱奇功!),還有Stream API流式處理,joda-time等等一些新特性,
二、JDK 與 JRE
JDK:java development kit (java開發工具)
JRE:java runtime environment (java運行時環境)
JVM:java virtuak machine (java虛擬機)
1、jdk--開發環境(核心)
Java development kit的縮寫,意思是Java開發工具,我們寫檔案做PPT需要office 辦公軟體,開發當然需要開發工具了,說到開發工具大家肯定會想到Eclipse,但是如果直接安裝Eclipse你會發現它是運行不起來 是會報錯的,只有安裝了JDK,配置好了環境變數和path才可以運行成功,這點相信很多人都深有體會,
jdk主要包含三個部分:
第一部分是Java運行時環境,JVM
第二部分是Java的基礎類別庫,這個類別庫的數量還是相當可觀的
第三部分是Java的開發工具,它們都是輔助你更好地使用Java的利器jre--運行環境
2、jre--運行環境
① jdk中的jre
如下圖:jdk中包含的jre,在jre的bin目錄里有個jvm.dll,既然JRE是運行時環境,那么運行在哪?肯定是JVM虛擬機上了,另,jre的lib目錄中放的是一些JAVA類別庫的class檔案,已經打包成jar檔案,
② 第二個JRE(獨立出來的運行時環境)
如下圖,不管是JDK中的JRE還是JRE既然是運行時環境必須有JVM,所以JVM也是有兩個的,
3、JVM——轉換環境
java virtuak machine (java虛擬機)的縮寫,
大家一提到JAVA的優點就會想到:一次編譯,隨處運行,說白了就是跨平臺性好,這點JVM功不可沒,
Java的程式也就是我們編譯的代碼都會編譯為class檔案,class檔案就是在jvm上運行的檔案,只有JVM還不能完全支持class的執行,因為在解釋class的時候JVM需要呼叫解釋所需要的類別庫lib,而jre包含lib類別庫,
JVM屏蔽了與具體作業系統平臺相關的資訊,使得Java程式只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平臺上不加修改的運行,
JVM也是一門很深的學問,感興趣的同學可以深入研究,只有好處,沒有壞處,
其實有時候面試官問JDK和JRE的區別的目的不是想讓你解釋什么名詞的,而是想看看你的基礎和研究Java的深淺,還有另一方面就是你是不是經常喜歡問為什么,

三、語言的五大特性
- 萬物皆物件
- 程式就是多個物件彼此呼叫方法的程序
- 從記憶體角度而言,每個物件都是由其它更基礎的物件組成的
- 每一個物件都有型別,都可以進行實體化
- 同一型別的物件可以接收相同的訊息
面向物件編程的最大挑戰就是如何在問題空間的元素和解決方案空間的物件之間建立一對一的關聯,
四、物件間的四種關系
1、依賴
依賴關系表示一個類依賴于另一個類的定義,例如,一個人(Person)可以買車(car)和房子(House),Person類依賴于Car類和House類的定義,因為Person類參考了Car和House,與關聯不同的是,Person類里并沒有Car和House型別的屬性,Car和House的實體是以參量的方式傳入到buy()方法中去的,一般而言,依賴關系在Java語言中體現為局域變數、方法的形參,或者對靜態方法的呼叫,
2、關聯
關聯(Association)關系是類與類之間的聯接,它使一個類知道另一個類的屬性和方法,關聯可以是雙向的,也可以是單向的,在Java語言中,關聯關系一般使用成員變數來實作,
3、聚合
聚合(Aggregation) 關系是關聯關系的一種,是強的關聯關系,聚合是整體和個體之間的關系,例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關系便整體和個體的關系,與關聯關系一樣,聚合關系也是通過實體變數實作的,但是關聯關系所涉及的兩個類是處在同一層次上的,而在聚合關系中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分,
4、組合
組合(Composition) 關系是關聯關系的一種,是比聚合關系強的關系,它要求普通的聚合關系中代表整體的物件負責代表部分物件的生命周期,組合關系是不能共享的,代表整體的物件需要負責保持部分物件和存活,在一些情況下將負責代表部分的物件湮滅掉,代表整體的物件可以將代表部分的物件傳遞給另一個物件,由后者負責此物件的生命周期,換言之,代表部分的物件在每一個時刻只能與一個物件發生組合關系,由后者排他地負責生命周期,部分和整體的生命周期一樣,
五、封裝、繼承、多型
1、封裝
封裝就是把物件的屬性和行為結合為一個獨立的整體,并盡可能多的隱藏物件的內部實作細節,
2、繼承
物件用來封裝資料和功能,但我們要創建一個新類,然而它又與已存在的類具有部分相同的屬性或功能,此時,為了代碼復用原則,可以使用繼承來實作,
繼承通過基類和子類的概念來表達,基類的所有特征和行為都可以與子類共享,也就是說,你可以通過基類呈現核心思想,從基類繼承的子類則為核心思想提供不同的實作方式,
有時基類和子類的方法都是一樣的,這時你就可以直接用子類的物件代替基類的物件,這種純替代關系通常叫做替換原則,
有時,子類會添加一些新的方法,此時就是不完美替換,
3、多型
通過將子類物件參考賦給父類物件參考來實作動態方法呼叫,
List<String> list = new ArrayList<String>();
六、我的第一個Java程式
1、先配置環境變數
【Java基礎知識 3】為何要配置環境變數?

2、hello world
package com.guor;
public class Test{
public static void main(String[] args) {
System.out.println("hello world!");
}
}

七、八種基本資料型別
| 資料型別 | 記憶體 |
| byte | 8位 |
| short | 16位 |
| int | 32位 |
| long | 64位 |
| float | 32位 |
| double | 64位 |
| char | 16位 |
| boolean | 1個位元組或4個位元組 |
【Java基礎知識 5】裝箱和拆箱
java中的方法可以傳遞引數,引數的傳遞方法就是值傳遞,
引數有形參和實參,定義方法時寫的引數叫形參,真正呼叫方法時,傳遞的引數叫實參,
呼叫方法時,會把實參傳遞給形參,方法內部其實是在使用形參,
所謂值傳遞就是當引數是基本型別時,傳遞引數的值,比如傳遞i=10,真實傳參時,把10賦值給了形參,
當引數是物件時,傳遞的是物件的值,也就是物件的首地址,就是把物件的地址賦值給形參,
八、Java的重要概念
1、類
類的創建者負責在創建新的類時,只暴露必要的介面給客戶程式員,同時隱藏其它所有不必要的資訊,
為什么這么做呢?
(1)因為如果這些資訊對于客戶程式員而言是不可見的,那么類的創建者就可以任意修改隱藏資訊,而無需擔心對其它任何人造成影響,隱藏的代碼通常代表著一個物件內部脆弱的部分,如果輕易暴露給粗心或經驗不足的客戶程式員,就可能在頃刻之間被破壞殆盡,所以,隱藏代碼的具體實作可以有效減少程式bug,
(2)讓類別庫的設計者在改變類的內部作業機制時,不用擔心影響到使用該類的客戶程式員,
Java提供了三個顯示關鍵字來控制訪問權限,
2、普通類和抽象類
- 抽象類不能被實體化;
- 抽象類可以有抽象方法,只需申明,無須實作;
- 有抽象方法的類一定是抽象類;
- 抽象類的子類必須實作抽象類中的所有抽象方法,否則子類仍然是抽象類;
- 抽象方法不能宣告為靜態、不能被static、final修飾,
3、介面和抽象類
(1)介面
- 介面使用interface修飾;
- 介面不能實體化;
- 類可以實作多個介面;
- java8之前,介面中的方法都是抽象方法,省略了public abstract,②java8之后;介面中可以定義靜態方法,靜態方法必須有方法體,普通方法沒有方法體,需要被實作;
(2)抽象類
- 抽象類使用abstract修飾;
- 抽象類不能被實體化;
- 抽象類只能單繼承;
- 抽象類中可以包含抽象方法和非抽象方法,非抽象方法需要有方法體;
- 如果一個類繼承了抽象類,①如果實作了所有的抽象方法,子類可以不是抽象類;②如果沒有實作所有的抽象方法,子類仍然是抽象類,
4、成員變數和區域變數
(1)在類中的位置不同
成員變數:類中方法外;
區域變數:方法定義中或者方法宣告上;
(2)在記憶體中的位置不同
成員變數:在堆中
區域變數:在堆疊中
(3)生命周期不同
成員變數:隨著物件的創建而存在,隨著物件的消失而消失
區域變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
(4)初始化值不同
成員變數:有默認值
區域變數:沒有默認值,必須定義,賦值,然后才能使用
5、物件的創建和宣告周期
物件的創建需要消耗一些資源,尤其是記憶體資源,
當我們不再需要一個物件時,就要及時清理它,這樣占用的資源才能被釋放并重復使用,
如果要最大化運行時效率,可以通過堆疊區(區域變數)來保存物件,或者將物件保存在靜態區里,這樣在撰寫程式時就可以明確的知道物件的記憶體分配和生命周期,這種做法會優先考慮分配和釋放記憶體的速度,但是代價就是犧牲了靈活性,因為你必須在撰寫代碼時就明確物件的數量、生命周期以及型別,但是這種寫法的限制性很大,
還有一種方案是在記憶體池中動態創建物件,這個記憶體池也就堆,如果使用這個方案,直到運行時你才能知道需要多少物件,以及它們的生命周期和確切的型別是什么,如果需要創建一個新物件,可以直接通過堆來創建,因為堆是在運行時動態管理記憶體的,所以堆分配記憶體所花費的時間通常會比堆疊多一些,堆疊通常利用匯編指令向下或向上移動堆疊指標來管理記憶體,而堆何時分配記憶體則取決于記憶體機制的實作方式,
Java只允許動態分配記憶體,每當要創建一個物件時,都需要使用new來創建一個物件的動態實體,
如果在堆疊中創建物件,編譯器會判斷物件存在時間以及負責自動銷毀該物件,
如果在堆中創建物件,編譯器就無法得知物件的生命周期,
Java支持垃圾回識訓制,它會自動找到沒用的物件將其銷毀,
6、final 和 static
都可以修飾類、方法、成員變數
static可以修飾類的代碼塊,final不可以
static不可以修飾方法內區域變數,final可以
static修飾表示靜態或全域
static修飾的代碼塊表示靜態代碼塊,當JVM加載類時,只會被創建一次
static修飾的變數可以重新賦值
static方法中不能用this和super關鍵字
因為this代表的是呼叫這個函式的物件的參考,而靜態方法是屬于類的,不屬于物件,靜態方法成功加載后, 物件還不一定存在, this代表對本類物件的參考,指向本類已創建的物件, super代表對父類物件的參考,指向父類物件, 靜態優先于物件存在,方法被static修飾之后,方法先存在,所需的父類參考物件晚于該方法的出 現,也就是super所指向的物件還沒出現,當然就會報錯,
static方法必須被實作,而不能是抽象的abstract
static方法只能被static方法覆寫
final修飾表示常量、一旦創建不可被修改
final標記的成員變數必須在宣告的同時賦值,或在該類的構造方法中賦值,不可重新賦值
final方法不能被子類重寫
final類不能被繼承,沒有子類,final類中的方法默認是final的
final不能用于修飾構造方法
private型別的方法默認是final型別的
7、final、finally、finalize
final可以修飾類,變數,方法,修飾的類不能被繼承,修飾的變數不能重新賦值,修飾的方法不能被重寫
finally用于拋例外,finally代碼塊內陳述句無論是否發生例外,都會在執行finally,常用于一些流的關閉,
finalize方法用于垃圾回收,
一般情況下不需要我們實作finalize,當物件被回收的時候需要釋放一些資源,比如socket鏈接,在物件初始化時創建,整個生命周期內有效,那么需要實作finalize方法,關閉這個鏈接,
但是當呼叫finalize方法后,并不意味著gc會立即回收該物件,所以有可能真正呼叫的時候,物件又不需要回收了,然后到了真正要回收的時候,因為之前呼叫過一次,這次又不會呼叫了,產生問題,所以,不推薦使用finalize方法,
8、Java運算子
- 算術運算子
- 關系運算子
- 位運算子
- 邏輯運算子
- 賦值運算子
- 其他運算子
9、回圈結構
- for
- while
- do...while
10、條件運算式
- if...else...
- switch case
11、super與this
- super關鍵字可以在子類的構造方法中顯示地呼叫父類的構造方法,super()必須為子類建構式中的第一行,
- super可以用來訪問父類的成員方法或變數,當子類成員變數或方法與父類有相同的名字時也會覆寫父類的成員變數或方法,這個時候要想訪問父類的成員變數或方法只能通過super關鍵字來訪問,子類方法中的super.方法名()不需要位于第一行,
- this關鍵字指向的是當前物件的參考,用來區分成員變數和區域變數(重名問題)
- this() 不能使用在普通方法中 只能寫在構造方法中,
- 必須是構造方法中的第一條陳述句,
12、方法的重寫
父類的功能無法滿足子類的需求時,則需要用到重寫;
重寫的好處在于子類可以根據需要,定義特定于自己的行為, 也就是說子類能夠根據需要實作父類的方法,
重寫的注意事項:
- 引數串列必須完全與被重寫方法的相同;
- 回傳型別必須完全與被重寫方法的回傳型別相同;
- 訪問權限不能比父類中被重寫的方法的訪問權限更低;
- 宣告為final的方法不能被重寫;
- 宣告為static的方法不能被重寫,但是能夠被再次宣告;
- 構造方法不能被重寫;
- 子類和父類在同一個包中,那么子類可以重寫父類所有除了宣告為private和final 的方法;
- 如果不能繼承一個方法,則不能重寫這個方;
- 子類和父類不在同一個包中,那么子類只能夠重寫父類的宣告為public和 protected的非final方法;
- 重寫的方法能夠拋出任何非強制例外,無論被重寫的方法是否拋出例外,但是, 重寫的方法不能拋出新的強制性例外,或者比被重寫方法宣告的更廣泛的強制性 例外,反之則可以,
13、在 Java 中,什么時候用多載,什么時候用重寫?
(1)多載是多型的集中體現,在類中,要以統一的方式處理不同型別資料的時候,可以用多載,
(2)重寫的使用是建立在繼承關系上的,子類在繼承父類的基礎上,增加新的功能,可以用重寫,
(3)簡單總結:
- 多載是多樣性,重寫是增強劑;
- 目的是提高程式的多樣性和健壯性,以適配不同場景使用時,使用多載進行擴展;
- 目的是在不修改原方法及源代碼的基礎上對方法進行擴展或增強時,使用重寫;
14、抽象類和介面
介面和抽象類都遵循”面向介面而不是實作編碼”設計原則,它可以增加代碼的靈活性,可以適應不斷變化的需求,下面有幾個點可以幫助你回答這個問題:在 Java 中,你只能繼承一個類,但可以實作多個介面,所以一旦你繼承了一個類,你就失去了繼承其他類的機會了,
介面通常被用來表示附屬描述或行為如: Runnable 、 Clonable 、 Serializable 等等,因此當你使用抽象類來表示行為時,你的類就不能同時是 Runnable 和 Clonable( 注:這里的意思是指如果把 Runnable 等實作為抽象類的情況 ) ,因為在 Java 中你不能繼承兩個類,但當你使用介面時,你的類就可以同時擁有多個不同的行為,
在一些對時間要求比較高的應用中,傾向于使用抽象類,它會比介面稍快一點,如果希望把一系列行為都規范在類繼承層次內,并且可以更好地在同一個地方進行編碼,那么抽象類是一個更好的選擇,有時,介面和抽象類可以一起使用,介面中定義函式,而在抽象類中定義默認的實作,
15、克隆
(1)什么要使用克隆?
想對一個物件進行復制,又想保留原有的物件進行接下來的操作,這個時候就需要克隆了,
(2)如何實作物件克隆?
實作Cloneable介面,重寫clone方法;
實作Serializable介面,通過物件的序列化和反序列化實作克隆,可以實作真正的深克隆,
BeanUtils,apache和Spring都提供了bean工具,只是這都是淺克隆,
(3)深拷貝和淺拷貝區別是什么?
淺拷貝:僅僅克隆基本型別變數,不克隆參考型別變數;
深克隆:既克隆基本型別變數,又克隆參考型別變數;
16、javac
(1)javac是什么
- javac是一種編譯器,能夠將一種語言規范轉化成另外一種語言規范
- javac的任務就是將Java源代碼轉化成JVM能夠識別的一種語言(Java位元組碼),這種位元組碼不是針對某種機器、某種平臺的
(2)javac編譯器編譯程式的步驟
① 詞法分析
首先是讀取源代碼,找出這些位元組中哪些是我們定義的語法關鍵詞,如Java中的if、else、for等關鍵詞,
語法分析的結果:從源代碼中找出一些規范化的token流,
注:token是一種認證機制
② 語法分析
檢查關鍵詞組合在一起是不是Java語言規范,如if后面是不是緊跟著一個布爾運算式,
語法分析的結果:形成一個符合Java語言規范的抽象語法樹
③ 語意分析
把一些難懂的、復雜的語法轉化為更加簡單的語法,
語意分析的結果:完成復雜語法到簡單語法的簡化,如將foreach陳述句轉化成for回圈結果,還有注解等,最后形成一個注解過后的抽象語法樹,這顆語法樹更接近目標語言的語法規則,
④ 生成位元組碼
通過位元組碼生成器生成位元組碼,根據經過注解的抽象語法樹生成位元組碼,也就是將一個資料結構轉化成另一個資料結構,
代碼生成器的結果:生成符合Java虛擬機規范的位元組碼,
注:抽象語法樹
在計算機科學中,抽象語法樹是源代碼語法結構的一種抽象表示,它以樹狀的形式表現編程語言的語法結構,樹上的每個節點都表示源代碼中的一種結構,
(3)javac編譯器的基本結構
按照上述編譯步驟來看,可以將javac編譯器分為4個模塊:詞法分析器、語法分析器、語意分析器和代碼生成器,
九、Java Character 類
【Java集合 4】Java.lang.Character類詳解
十、String
【Java基礎知識 7】toString()、String.valueOf、(String)強轉
【Java基礎知識 8】String、StringBuilder、StringBuffer詳解
十一、陣列
1、概念
同一種資料型別的集合,陣列是一個容器,
陣列能夠對存盤的元素進行自動排號,編號從0開始,方便操作,
2、格式
int[] arr = new int[10];
3、初始化
//方式1
int[] arr = { 1, 2, 3, 4, 5 };
//方式2
int[] arr3=new int[3];
arr3[0]=1;
arr3[1]=2;
arr3[2]=3;
4、遍歷
public class Test{
public static void main(String[] args) {
String[] arr = new String[3];
arr[0] = "CSDN";
arr[1] = "哪吒";
arr[2] = "博客專家";
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (String str:arr) {
System.out.println(str);
}
}
}
5、常見例外
- NullPointerException 空指標例外
- ArrayIndexOutOfBoundsException 索引值越界
【Java基礎知識 4】秒懂陣列拷貝,感知新境界
十二、資料保存在哪里
1、暫存器
暫存器是速度最快的資料存盤方式,資料直接保存在中央處理器,然而暫存器的數量是有限的,所以只能按需分配,
JVM中有4種常見的暫存器:
- pc程式暫存器
- optop運算元堆疊頂指標
- frame當前執行環境指標
- vars指向當前執行環境中第一個區域變數的指標
所有暫存器都為32位,
pc用于記錄程式的執行,optop,frame和vars用于記錄指向Java堆疊區的指標,
2、堆與堆疊
(1)堆記憶體用于存放new創建的物件
在堆中分配的記憶體,由JVM自動垃圾回收器管理,
在堆中產生一個物件后,會在堆疊中定義一個特殊變數,這個變數的取值等于陣列或物件在堆記憶體中的首地址,在堆疊中的這個特殊的變數就編程了陣列或者物件的參考變數,以后就可以在程式中使用堆疊記憶體中的參考變數來訪問堆中的物件,
物件在沒有參考變數指向它的時候,才會編程垃圾,不能再被使用,但是仍然占著記憶體,在隨后一個不確定的時間點被垃圾回收器釋放掉,這也是Java程式比較占記憶體的主要原因,實際上,堆疊中的變數指向堆記憶體中的變數,這就是Java中的指標,
(2)在函式中定義的一些基本型別的變數和物件的參考變數都是在堆疊記憶體中分配的,
當一段代碼定義一個變數時,java就在堆疊中分配一個記憶體,當超過變數的作用域后,java會自動釋放掉該變數分配的記憶體空間,
簡而言之,堆是用來存放物件的,堆疊是運行程式的,
堆:為成員分配和釋放,由程式員自己申請、自己釋放,否則發生記憶體泄露,典型為使用 new 申請的堆內容,
堆疊為編譯器自動分配和釋放,如函式引數、區域變數、臨時變數等等,
如果想迅速進行垃圾回收,可以將物件置為null,
3、常量存盤
常量通常會直接寫在程式代碼中,不可變,
4、非RAM存盤
不保存在應用程式里的資料,最典型的例子就是序列化物件,它指的是轉換為位元組流并可以發送到其它機器的物件,另一個例子則是持久化物件,它指的是保存在磁盤上的物件,也支持使用資料庫存盤物件資訊,
大多數微處理芯片有額外的快取記憶體,只不過快取內容使用的是傳統的記憶體管理方式,而非暫存器,
一個例子是字串常量池,所有字串和字串常量都會被自動放置到這個特殊的存盤空間中,
特殊情況 -> 原始型別
原始型別是直接創建一個“自動變數”,不是參考,該變數直接在堆疊上保存它的值,運行效率更高,
十三、java例外
【Java基礎知識 6】Java例外詳解
十四、序列化與反序列化
【Java基礎知識 9】序列化與反序列化
十五、Java IO流
【Java基礎知識 10】Java IO流詳解
十六、泛型
在Java5之前,JAVA語言的集合所支持的通用型別是Object,因為單根結構決定了所有物件都屬于Object型別,所以一個持有Object的集合就可以持有任何物件,這就使得集合十分易于復用,
其實并不能保存原始資料型別,不過自動裝箱機制在一定程度上解決了這個問題,
當集合中持有Object型別時,要添加一個物件到集合中,該物件會向上轉型為Object,從而失去了原本的型別,當你需要將其取出時,會獲得一個Object型別的物件參考,這就不是當初的型別了,需要進行向下轉型,但除非明確知道物件的具體型別,否則向下轉型是不安全的,轉型失敗會拋出例外,
這個問題的解決方式是“引數化型別”,一個被引數化的型別是一種特殊的類,可以讓編譯器自動適配特定的型別,引數化型別也叫泛型,通過尖括號中間加上類名來定義泛型,比如List<String>,
【Java 基礎知識 11】Java泛型詳解
十七、列舉
【Java基礎知識 12】Java列舉詳解
十八、注解
【Java基礎知識 13】Java注解詳解
十九、動態代理
【Java基礎知識 14】Java動態代理
二十、反射機制
【Java基礎知識 15】Java反射機制
二十一、Java注意事項
- ?盡量使用final修飾符
- 盡量重用物件
- 盡可能使用區域變數
- 及時關閉流
- 盡量減少對變數的重復計算
- 盡量采用懶加載的策略,即在需要的時候才創建
- 慎用例外
- 不要在回圈中使用trycatch,應該把其放在最外層
- 盡量能估計到待添加的內容的長度,為底層以陣列方式實作的集合、工具類指定初始長度
- 當復制大量資料時,使用system.arraycopy命令
- 乘法和除法使用移位操作
- 回圈內不要不斷創建物件參考
- 基于效率和型別檢查的考慮,應該盡可能使用array,無法確定陣列大小時才使用ArrayList
- 盡量使用hashmap、ArrayList、stringbuilder,除非執行緒安全需要,否則不建議使用hashtable、vector、stringbuffer,后三者由于使用同步機制而導致了性能開銷,
- 不要講陣列宣告為public static final
- 盡量在合適的場合使用單例模式
- 盡量避免使用靜態變數
- 及時清除不再需要的會話
- 實作RandomAccess介面的集合比如ArrayList,應當使用最普通的for回圈而不是foreach回圈
- 使用同步代碼塊代替同步方法
- 將常量宣告為static final,并以大寫命名
- 不要創建一些不使用的物件,不要匯入一些不使用的類
- 程式運行程序中避免使用反射
- 使用資料庫連接池和執行緒池
- 使用帶緩沖的輸入輸出流進行IO操作
- 順序插入和隨機訪問比較多的場景用ArrayList,元素洗掉和中間插入比較多的場景使用LinkedList
- 不要讓public方法中有太多的引數
- 字串變數和字串常量equals的時候將字串常量寫在前面
- 請知道,在java中if (i == 1)和if (1 == i)是沒有區別的,但從閱讀習慣上講,建議使用前者
- 不要對陣列使用toString方法
- 不要對超出范圍的基礎資料型別做向下強制型別轉型
- 公用的集合類中不使用的資料一定要及時的remove掉
- 把一個基本型別轉為字串,toString最快,String.valueOf次之,資料+“”最慢
- 使用最有效率的方法去遍歷map
- 對資源的close()建議分開操作
粉絲專屬福利
🍅 粉絲專屬福利:包郵送書3本,原價128元的《億級流量Java高并發與網路編程實戰》
🍅 獲取方式:
1、評論區評論:獲取點贊最多者,獲取一本;
2、微信群抽獎:采取微信群發紅包的形式,手氣最佳者獲取一本;
3、2021年9月28日 20:00進行抽獎,并在第一時間公布中獎結果;
【注意】想加入微信群聊,可以掃描主頁左側二維碼、私信與我、加本人微信guo_rui_
送書啦!!!
《億級流量Java高并發與網路編程實戰》簡介
【圖書簡介】
1、本書從并發的底層核心技術、互聯網應用框架、資料處理等三部分對高并發系列技術做了系統講解,
2、本書以實戰化訓練為宗旨,用詳盡且經典的案例闡述了 Java大資料及高級編程中的重點、難點,書中案例由真實專案演化而來,既體現了所述知識點的精華,又屏蔽了無關技術的干擾,
3、案例都是以“理論講解 環境搭建 完整代碼及分析 運行截圖”這種完善的結構進行講解,考慮到了讀者可能會遇到的各種問題,
【內容簡介】
《億級流量Java高并發與網路編程實戰》系統全面的介紹了開發人員必學的知識,如JVM、網路編程、NIO等知識,讓開發人員系統地掌握JAVA高并發與網路編程知識,《億級流量Java高并發與網路編程實戰》分為10章,內容如下,第1章,主要講高并發相關JVM原理決議;第2章,主要講 Java 網路編程;第3章,主要講 Java NIO;第4章,主要講并發框架Disruptor;第5章,主要講微服務構建框架Spring Boot;第6章,主要講微服務治理框架Spring Cloud/Dubbo;第7章,主要講 Java高并發網路編程框架Netty - 實戰應用;第8章,主要講 Java高并發網路編程框架Netty - 深度解讀;第9章,主要講海量資料的高并發處理;第10章,主要講基于高并發與網路編程的大型互聯網專案實戰,本書主要面向面向零基礎及入門級讀者,Java從業人員,
【作者簡介】
顏群,畢業于西安理工大學,精通JAVA、大資料等軟體技術,工業和資訊化部人才交流中心教學督導、西安實驗室教學總監、教研委員會委員、資深高級講師,擔任渭南師范學院、西京學院、西安交通大學城市學院等多所院校兼職講師,教授Java、大資料等課程;愛奇藝教育、W3cSchool官方合作講師;騰訊課堂、網易云課堂等在線教育機構知名講師,
我看過顏群老師在B站的JavaWeb視頻,講的非常非常的好,我在此特別推薦一下,
JavaWeb視頻教程(JSP/Servlet/上傳/下載/分頁/MVC/三層架構/Ajax)_嗶哩嗶哩_bilibili
本次抽取3名幸運粉絲,沒中的小伙伴可以等下期,或者自動購買:
《億級流量Java高并發與網路編程實戰》(顏群)【摘要 書評 試讀】- 京東圖書
《億級流量Java高并發與網路編程實戰》(顏群)【簡介_書評_在線閱讀】 - 當當圖書

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303101.html
標籤:其他
