學(xué)習(xí)記錄之JDK5\JDK8基礎(chǔ)(總結(jié))
1泛型應(yīng)用
1.1:概述
????泛型是JDK1.5以后推出的編譯時(shí)類型,運(yùn)行時(shí)無效, 我么通??梢詫⑵淅斫鉃橐环N參數(shù)化類型,可以應(yīng)用在接口、類、方法、屬性上,用于約束類中屬性,方法參數(shù)以及返回值類型,基于這種方式可以對(duì)變成過程中的接口、類、方法進(jìn)行通用化設(shè)計(jì),同時(shí)在編譯階段解決在運(yùn)行時(shí)執(zhí)行一些校驗(yàn)操作,提高其運(yùn)行效率。
1.2:泛型類
????單泛型參數(shù),關(guān)鍵代碼如下:
????多泛型參數(shù),關(guān)鍵代碼如下:
????泛型抽象類,代碼如下
????泛型具體類代碼如下:
泛型方法
泛型方法主要應(yīng)用與類中的靜態(tài)方法,但不限于靜態(tài)方法:
1.3:泛型通配符
????無界通配符:
泛型中的無界通配符使用“?”表示,泛指不確定性類型,例如,可以代表一種任意參數(shù)類型(實(shí)參類型),通常會(huì)應(yīng)用于變量的定義
有界通配符
????泛型在應(yīng)用時(shí)有時(shí)需要指定對(duì)象的上限和下限,我們稱這種形式叫限定通配符,語法如下:
指定泛型下限:<? super T> 表示參數(shù)是類型T或者T的父類,不影響往里存,但是往外取之惡能放在Object對(duì)象里。
指定泛型上限:<? extends T>表示參數(shù)類型是T或T的子類,只能往外取,不能往里放,因?yàn)榫幾g簡單不能確定你要放入的類型
有界通配符應(yīng)用案例,構(gòu)建一打印工具類,關(guān)鍵代碼如下:
說明,如果要從集合中讀取類型T的數(shù)據(jù), 并且不能寫入,可以使用 上界通配符(<? extends>)—Producer Extends。如果要從集合中寫入類型T 的數(shù)據(jù), 并且不需要讀取,可以使用下界通配符(<? super>)—Consumer Super。如果既要存又要取, 那么就要使用非限定通配符。
1.4:泛型類型擦除
????泛型是在編譯階段由編譯器執(zhí)行類型檢查和類型推斷,然后生成普通的非泛型的字節(jié)碼。這種實(shí)現(xiàn)技術(shù)稱之為擦除(erasure),所以說泛型是編譯時(shí)的一種類型,在運(yùn)行時(shí)無效,運(yùn)行時(shí)候都會(huì)編程Object類型。假如,嘗試基于反射技術(shù)向List<String> list = new ArrayList<String>()對(duì)象中添加整數(shù)100。關(guān)鍵代碼如下:
2注解應(yīng)用
2.1:注解是JDK5推出的一種新的應(yīng)用類型(特殊的class),是一種元數(shù)據(jù)(Meta Data):用于描述接口、類、屬性、方法、參數(shù)等,可以理解為一個(gè)生活中標(biāo)簽
2.2:注解的定義
?我們先來看一下,Java中自帶的Overide注解,代碼如下:???
在實(shí)際項(xiàng)目注解可能由第三方定義,也可能會(huì)由我們自己定義,例如
其中:@Target 用于描述定義的注解能夠修飾的對(duì)象,@Retention 用于描述定義的
注解何時(shí)有效。
創(chuàng)建注解時(shí),指定注解屬性,例如:
2.3:注解與反射
使用注解描述類及成員,代碼如下:
通過反射技術(shù)判定注解的存在,例如:
通過反射獲取注解屬性值,例如:
2.4:
????Java中的注解如何定義?(@interface)
? ? Java中注解的作用是什么?(描述類,屬性,方法,參數(shù)用于賦予這些成員特點(diǎn)的含義)
????Java中注解與Annotation接口是什么關(guān)系(is a 的關(guān)系,繼承關(guān)系)
????如何獲取類及成員上狀態(tài)為運(yùn)行時(shí)有效的注解對(duì)象?(反射技術(shù))
3拆箱封箱
3.1:概述
????Java中不僅提供了8種基本數(shù)據(jù)類型,還為了更好的體現(xiàn)面向?qū)ο筇匦?,專門提供了 8種基本數(shù)據(jù)類型對(duì)應(yīng)的對(duì)象封裝類型。Jdk1.5之后為了更好的實(shí)現(xiàn)基本數(shù)據(jù)類型和8種封裝類型之間的轉(zhuǎn)換,提供自動(dòng)封箱和拆箱機(jī)制。
3.2:自動(dòng)封箱
????自動(dòng)拆箱就是將基本類型自動(dòng)轉(zhuǎn)換為對(duì)象數(shù)據(jù)類型,例如:
其中,對(duì)于等號(hào)右邊的值會(huì)自動(dòng)調(diào)用Integer.valueOf方法轉(zhuǎn)換為對(duì)象類型。
3.3:自動(dòng)拆箱
????自動(dòng)拆箱就是對(duì)象類型自動(dòng)轉(zhuǎn)換為基本數(shù)據(jù)類型,例如:
說明,無論是自動(dòng)拆箱,還是自動(dòng)封裝,為Java編程過程中的類型轉(zhuǎn)換提供了很好便利。
4枚舉類型
4.1:概述
????枚舉是JDK1.5以后推出的一種新的類型(特殊的類),主要用于更加嚴(yán)格的約束變量類型,例如現(xiàn)有一個(gè)產(chǎn)品對(duì)象,此對(duì)象有一個(gè)性別屬性,請(qǐng)問此屬性的類型如何定義呢,還有現(xiàn)在有一訂單,我們?nèi)绾味x訂單狀態(tài)呢?在實(shí)際項(xiàng)目中這些類型的定義我們通常會(huì)借助枚舉進(jìn)行實(shí)現(xiàn)。
4.2:枚舉的定義
????Java中的枚舉借助enum關(guān)鍵字進(jìn)行定義,例如JDK中的枚舉:
枚舉類型,通常應(yīng)用于值固定的實(shí)例類型,例如一周七天,代碼如下:
其中:Week中MONDAY, TUESDAY等都屬于枚舉的實(shí)例,這些實(shí)例都是在類加載時(shí)創(chuàng)建,
可通過枚舉類名直接訪問,例如Week.MONDAY。
4.3:枚舉類型應(yīng)用
定義一性別枚舉類,例如:
在定義產(chǎn)品類型時(shí),應(yīng)用性別枚舉類,例如:
定義含有帶參構(gòu)建函數(shù)的枚舉類型,例如:
定義會(huì)員類,應(yīng)用Sex枚舉類型,例如:
枚舉應(yīng)用測試,案例如下:
5可變參數(shù)
5.1:概述
????JDK5中允許方法最后一個(gè)參數(shù)使用帶三個(gè)點(diǎn)的類型進(jìn)行定義,在進(jìn)行方法調(diào)用時(shí)可傳入任意個(gè)數(shù)的實(shí)際參數(shù),其目標(biāo)主要是用于簡化方法名相同,參數(shù)類型也相同,但參數(shù)個(gè)數(shù)不同的一系列方法的定義。
5.2:應(yīng)用實(shí)踐
????可變參數(shù)應(yīng)用案例,關(guān)鍵代碼如下:
說明,可變參數(shù)只能應(yīng)用在方法參數(shù)列表中的最后一個(gè)參數(shù)的定義上。
JDK8簡介
1.1:概述:
????Java 8由Oracle從2014年3月18日發(fā)布,此版本是自Java 5(發(fā)布于2004年)之后的一個(gè)重量級(jí)版本,也是java發(fā)展史上的一個(gè)里程碑式的版本。這個(gè)版本在JVM、編譯器、庫、Java語法特性等方面都做了很大改進(jìn),同時(shí)在語言的表達(dá)力、簡潔性等個(gè)方面也有了很大的提高。目前幾乎所有的JAVA 框架也都已升級(jí)到支持JDK8。
1.2:新特性介紹
????Java 8 這個(gè)版本提供了很多實(shí)用的新特性,針對(duì)接口推出了接口默認(rèn)方法,接口靜態(tài)方法以及函數(shù)式接口,同時(shí)為了簡化代碼編寫,推出了 lambda 表達(dá)式,為了增強(qiáng)對(duì)數(shù)據(jù)的操作,還定義了 Stream 操作等。這個(gè)版本目前是市場上一個(gè)應(yīng)用最廣泛,也是最重要的一個(gè)版本。
2JDK8接口新特性
2.1:概述
????JDK8 中對(duì)接口規(guī)范進(jìn)行了新的定義,允許在接口中定義默認(rèn)方法(使用 default 關(guān)鍵字修飾),靜態(tài)方法,同時(shí)還推出了函數(shù)式接口(使用@FunctionInterface注解描述)設(shè)計(jì)。
2.2:應(yīng)用場景
????基于 JDK8 中接口新規(guī)范的定義,不僅可以擴(kuò)展接口新功能(新的標(biāo)準(zhǔn)),還能保持接口向前兼容的特性。例如Java API中的集合操作規(guī)范。
2.3:快速入門分析
????default 方法設(shè)計(jì)及實(shí)現(xiàn)
JDK8中為了對(duì)接口業(yè)務(wù)進(jìn)行擴(kuò)展,但又不影響實(shí)現(xiàn)類,提供了默認(rèn)方法。此類型的方法實(shí)用default關(guān)鍵字修飾,可以有方法體的實(shí)現(xiàn)。例如list接口中的sort方法:
說明:一個(gè)接口中可以有多個(gè)默認(rèn)方法,在實(shí)現(xiàn)類中可以有選擇的對(duì)方法進(jìn)行重寫;
static 方法設(shè)計(jì)及實(shí)現(xiàn),JDK8的接口中還支持靜態(tài)方法;
函數(shù)式接口設(shè)計(jì)及實(shí)現(xiàn):Java8引入了一個(gè)是函數(shù)式接口(Functional Interfaces),此接口使用 @FunctionalInterface修飾,并且此接口內(nèi)部只能包含一個(gè)抽象方法。說明函數(shù)式接口推出的目的主要是為了配合后續(xù)Lambda表達(dá)式的應(yīng)用。
2.4:應(yīng)用案例增強(qiáng)分析及實(shí)現(xiàn)
在JDK中的java.util.function包中定義了大量函數(shù)式接口。常用的有如下幾個(gè):
消費(fèi)型接口:
函數(shù)式接口。
判定式接口
供給式接口
JDK8接口的新特性
????1.接口中所有的方法都是抽象的嗎?要看版本
????2.什么是接口默認(rèn)方法?(接口中由default關(guān)鍵字描述的方法,可以有方法體)
????3.JDK為什么要推出默認(rèn)方法?擴(kuò)展接口功能,而且還不需要修改實(shí)現(xiàn)
????4.一個(gè)接口中可以有多個(gè)默認(rèn)方法嗎?(可以)
????5.接口默認(rèn)方法,在接口的實(shí)現(xiàn)類中必須要重寫嗎? 不是
????6.接口中可以有靜態(tài)方法嗎?可以,JDK8或更新版本
????7.什么是函數(shù)式接口?@functionInterface注解描述的接口
????8.函數(shù)式接口最大的特點(diǎn)是什么?接口中最多有一個(gè)抽象方法
????9.函數(shù)式接口中可以有默認(rèn)方法或鏡頭方法嗎?可以
JDK8中Lambda表達(dá)式應(yīng)用
3.1:概述
????Java中的Lambda表達(dá)式是JDK8中的一種新特性,它允許我們將一段代碼(這段代碼可以理解為一個(gè)接口的實(shí)現(xiàn))當(dāng)成參數(shù)傳遞給某個(gè)方法,然后進(jìn)行業(yè)務(wù)處理,這種方式更像是一種函數(shù)式編程風(fēng)格,可以讓代碼結(jié)構(gòu)更簡潔,開發(fā)效率更高。
3.2:應(yīng)用場景
????Java中的Lambda為JAVA編程注入了函數(shù)式編程思想,在迭代操作,映射操作,聚合操作等很多方面的實(shí)現(xiàn)上做出了很大努力。并從語法角度簡化了程序員對(duì)特定代碼的編寫,通過底層的類型推斷,方法引用等特性讓代碼表現(xiàn)的更加優(yōu)雅?,F(xiàn)在已成為我們編程過程中常用的一種編程方式。
3.3:快速入門分析
最簡單的Lambda表達(dá)式可由逗號(hào)分隔的參數(shù)列表、->符號(hào)和語句塊組成,例如:
在上面這個(gè)代碼中的參數(shù) e 的類型是由編譯器推理得出的,你也可以顯式指定該參數(shù)的類型,例如:
如果 Lambda 表達(dá)式需要更復(fù)雜的語句塊,則可以使用花括號(hào)將該語句塊括起來,類似于Java中的函數(shù)體,例如:
lambda 表達(dá)式可以讓代碼編寫更加簡潔。我們先來思考下普通的函數(shù)或方法具備的幾個(gè)元素:
?? 訪問修飾符。
?? 返回值類型。
?? 方法名。
?? 參數(shù)列表。
?? 代碼塊。
在lambda 表達(dá)式應(yīng)用過程中,你應(yīng)該也注意到了,一般只有兩個(gè)元素:
其中“->” 將參數(shù)列表與函數(shù)主體分離,旨在對(duì)給定參數(shù)進(jìn)行處理。函數(shù)的主體可能
是一條或多條語句。例如其常見結(jié)構(gòu)如下:
Lambda表達(dá)式有返回值,返回值的類型也由編譯器推理得出。如果Lambda表達(dá)式中的語句塊只有一行,則可以不用使用return語句,下列兩個(gè)代碼片段效果相同:
3.4:應(yīng)用案例增強(qiáng)實(shí)現(xiàn)
????結(jié)合對(duì)lambda表達(dá)式基本語法的認(rèn)識(shí),通過如下案例在對(duì)lambda表達(dá)式繼續(xù)強(qiáng)化分
析和實(shí)現(xiàn)。案例1:構(gòu)建一個(gè)線程對(duì)象,執(zhí)行Runnable類型的任務(wù)。傳統(tǒng)方式的實(shí)現(xiàn),其關(guān)鍵代碼如下:
基于JDK8中的Lambda表達(dá)式實(shí)現(xiàn)方式,對(duì)傳統(tǒng)方式線程對(duì)象的創(chuàng)建進(jìn)行簡化,其關(guān)
鍵代碼如下:
案例2:通過lambda表達(dá)式演示排序過程中代碼的簡化。
定義一字符串?dāng)?shù)組,然后對(duì)字符串?dāng)?shù)組中的內(nèi)容,按字符串元素的長度對(duì)其進(jìn)行排序。代碼如下:
基于JDK8中的Lambda表達(dá)式,對(duì)排序如上排序方案的代碼實(shí)現(xiàn)過程進(jìn)行簡化,關(guān)鍵代碼如下:
JDK8中方法引用
4.1:概述
????方法引用是用來直接引用類方法、實(shí)例方法或者構(gòu)造方法的一種新的方式。這里要特別強(qiáng)調(diào)一點(diǎn)的是“方法引用”提供的是一種對(duì)方法的引用而不是執(zhí)行方法的方式,簡單點(diǎn)理解的話就是可以將方法作為參數(shù)進(jìn)行傳遞,我們還可以將方法引用理解為 lambda 的一種深層表達(dá)。
4.2:應(yīng)用場景
????方法引用是一種更簡潔易懂的 Lambda 表達(dá)式,操作符是雙冒號(hào)"::",也可以將方法引用看成是一個(gè)更加緊湊,易讀的Lambda表達(dá)式。
4.3:快速入門分析
????方法引用是一種更簡潔易懂的 Lambda 表達(dá)式,操作符是雙冒號(hào)"::",也可以將方法引用定義一個(gè)list集合,然后基于Lambda表達(dá)式迭代集合中的內(nèi)容進(jìn)行輸出,關(guān)鍵代碼如下:
基于方法引用的方式,輸出list集合中的具體內(nèi)容的,然后與傳統(tǒng)Lambda表達(dá)式方式,進(jìn)行對(duì)比分析,關(guān)鍵代碼如下:
說明:當(dāng)你要訪問的接口方法與執(zhí)行的方法引用參數(shù)相同,返回值也相同即可直接使用方法引用。
4.4:應(yīng)用案例增強(qiáng)分析
JDK8方法的引用可分為如下幾類:
?? 構(gòu)造方法引用。
格式:ClassName::new,應(yīng)用默認(rèn)構(gòu)造函數(shù)
?? 類靜態(tài)方法引用。
?格式:ClassName::static_method。
?? 類實(shí)例方法引用。
格式:ClassName::method,方法不能帶參數(shù)。
???對(duì)象實(shí)例方法引用。格式:對(duì)象實(shí)例::method,方法不能帶參數(shù)。
5 JDK8中Stream API應(yīng)用
5.1:概述
????Stream 作為 Java 8 的一大亮點(diǎn),它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作。
5.2:應(yīng)用場景
????在當(dāng)今這個(gè)數(shù)據(jù)爆炸的時(shí)代,數(shù)據(jù)來源多樣化、數(shù)據(jù)海量化,很多時(shí)候不得不脫離 RDBMS,以底層返回的數(shù)據(jù)為基礎(chǔ)進(jìn)行更上層的數(shù)據(jù)統(tǒng)計(jì)。而原有 Java 的集合 API 中,僅僅有極少量的輔助型方法,更多的時(shí)候是程序員需要用 Iterator 來遍歷集合,然后完成相關(guān)的聚合應(yīng)用邏輯。這是一種遠(yuǎn)不夠高效而且相對(duì)比較笨拙的方法。在 JDK8 中使用Stream 對(duì)象,不僅豐富了在業(yè)務(wù)層面對(duì)數(shù)據(jù)處理的方式,還可以讓代碼更加簡潔、易讀和高效。
5.3:快速入門分析
????我們?cè)谑褂肧tream對(duì)象時(shí),一般會(huì)按照如下為三個(gè)步驟進(jìn)行操作:
?? 第一步:創(chuàng)建Stream流對(duì)象。
?? 第二步:Stream流中間操作。
?? 第三步:Stream流終止操作。
Stream對(duì)象的操作過程,可通過圖-1進(jìn)行進(jìn)一步分析。

Steam對(duì)象簡易應(yīng)用,代碼如下:
5.4:應(yīng)用案例增強(qiáng)分析
????
?? Stream 對(duì)象創(chuàng)建。
Stream對(duì)象的創(chuàng)建,常見方式有如下幾種:
1)?? 借助Collection接口中的stream()或parallelStream()方法。
2)?? 借助Arrays類中的stream(...)方法。
3)?? 借助Stream類中的of(...)方法。
4)?? 借助Stream類中的iterator和generator方法(無限操作)。
Stream對(duì)象創(chuàng)建,案例分析如下:
?? Stream 中間操作。
Stream 對(duì)象創(chuàng)建以后可以基于業(yè)務(wù)執(zhí)行一些中間操作,但這些操作的結(jié)果需要借助終止操作進(jìn)行輸出,案例分析如下:
初始條件:給定 list 集合作為 Stream 操作的對(duì)象,代碼如下:
對(duì)數(shù)據(jù)進(jìn)行過濾:
限定操作(limit):
跳過操作(skip):
去重操作(distinct):
排序操作(sorted):底層基于內(nèi)部比較器 Comparable 或外部 Comparator 比較器進(jìn)行比對(duì)。
映射操作(map):
? ? Stream 終止操作。
Stream 終止操作是 Stream 的結(jié)束操作,案例分析如下:
案例:初始條件定義,給定一個(gè) list 集合:
match 操作:
find 操作:
count 操作:
求最大,最小值:
forEach 迭代操作:
Reduce(規(guī)約)操作:
Collector(收集)操作:
JDK8中新日期對(duì)象應(yīng)用
6.1:概述
????在Java8之前,日期和時(shí)間的管理一直是令Java開發(fā)者很痛苦的一個(gè)的問題。java.util.Date、java.util.Calendar,SimpleDateFormat 都一直沒有很好解決這個(gè)問題。故此,Java8引入了一套全新的日期時(shí)間處理 API,新的 API基于 ISO標(biāo)準(zhǔn)日歷系統(tǒng),解決了以前日期和時(shí)間類的很多弊端問題。
6.2:應(yīng)用場景
????Java8 中的時(shí)間處理 API 定義在 java.time 包中,這些 API 具備不可變且線程安全特性,具備準(zhǔn)確和靈活特性。所以現(xiàn)在基本可以使用這組 API 替換所有原有歷史版本中時(shí)間 API 的應(yīng)用。
7.3:快速入門分析
????? ? Instant 時(shí)間戳對(duì)象應(yīng)用,默認(rèn)是 0 時(shí)區(qū),比北京少 8 個(gè)時(shí)區(qū)。
????獲取時(shí)間間隔。
??????LocalDate 日期對(duì)象,不包含具體時(shí)間。
?????? LocalTime 時(shí)間對(duì)象,不包含日期。
? ? ???LocalDateTime? 包含了日期和時(shí)間對(duì)象,沒有時(shí)區(qū)信息。
?? ZoneDateTime? 包含時(shí)區(qū)的完整日期時(shí)間對(duì)象,偏移量以 UTC 時(shí)間為基準(zhǔn)。
6.4:應(yīng)用案例增強(qiáng)分析
????項(xiàng)目中我們經(jīng)常會(huì)用到日期類型轉(zhuǎn)換,在JDK8中的實(shí)現(xiàn)方式如下:
說明:jdk8之前的日期與字符串之間的轉(zhuǎn)換通常會(huì)借助 SimpleDateFormat對(duì)象,但是此對(duì)象線程不安全,通常要借助 ThreadLocal對(duì)象,保證 SimpleDateFormat對(duì)象每個(gè)線程一份。
8 JDK8新特性總結(jié)
8.1 重難點(diǎn)分析
?? 接口新特性?(默認(rèn)方法,函數(shù)式接口,靜態(tài)方法)
?? Lambda 表達(dá)式?(函數(shù)式,簡化語法,開發(fā)效率)
?? 方法引用(MethodReference)
?? Stream 應(yīng)用實(shí)踐分析?(數(shù)據(jù)操作更方便,創(chuàng)建,中間操作,終止操作)
?? 常用新的日期對(duì)象應(yīng)用?(靈活,安全,準(zhǔn)確)
8.2 FAQ 分析
?? 常用的函數(shù)式接口有哪些?(消費(fèi)型,供給型,判定型,函數(shù)式)
?? Lambda 表達(dá)式關(guān)鍵作用是什么?(簡潔,開發(fā)效率)
?? Stream 應(yīng)用中有哪些常用操作?(過濾,統(tǒng)計(jì),映射,規(guī)約,收集,...)
?? JDK8 中常用的日期 API 有哪些?(Instant,LocalDateTime,DateTimeFormater)
?? …...