最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

學(xué)習(xí)記錄之JDK5\JDK8基礎(chǔ)(總結(jié))

2022-08-26 16:57 作者:星月襲空  | 我要投稿

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)

?? …...

學(xué)習(xí)記錄之JDK5\JDK8基礎(chǔ)(總結(jié))的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
南川市| 昔阳县| 河池市| 南部县| 资阳市| 九江市| 宜丰县| 烟台市| 松潘县| 陈巴尔虎旗| 民权县| 青州市| 会同县| 宁海县| 金乡县| 湖北省| 东明县| 巴东县| 翼城县| 阿鲁科尔沁旗| 舒城县| 奉贤区| 抚宁县| 柞水县| 平罗县| 祥云县| 巨野县| 长沙市| 宿松县| 特克斯县| 许昌县| 新民市| 海晏县| 广宁县| 哈巴河县| 宾阳县| 于都县| 甘洛县| 潼南县| 双流县| 古蔺县|