
【軟件介紹】
Java Development Kit(JDK)是Sun Microsystems針對(duì)Java開(kāi)發(fā)員的產(chǎn)品。自從Java推出以來(lái),JDK已經(jīng)成為使用最廣泛的Java SDK。JDK 是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境,Java工具和Java基礎(chǔ)的類庫(kù)。JDK是學(xué)好Java的第一步。而專門運(yùn)行在x86平臺(tái)的Jrocket在服務(wù)端運(yùn)行效率也要比Sun JDK好很多。從SUN的JDK5.0開(kāi)始,提供了泛型等非常實(shí)用的功能,其版本也不斷更新,運(yùn)行效率得到了非常大的提高。定于2月19日發(fā)布的Java SE原來(lái)的重要補(bǔ)丁更新 - 2013年2月,但甲骨文決定加快釋放該重要補(bǔ)丁更新,因?yàn)榉e極開(kāi)發(fā)“野生”的Java漏洞影響在桌面瀏覽器,運(yùn)行時(shí)環(huán)境(jre)與該重要補(bǔ)丁更新解決。
【軟件特性】
jdk1.8新特性詳解1、default關(guān)鍵字
在java里面,我們通常都是認(rèn)為接口里面是只能有抽象方法,不能有任何方法的實(shí)現(xiàn)的,那么在jdk1.8里面打破了這個(gè)規(guī)定,引入了新的關(guān)鍵字default,通過(guò)使用default修飾方法,可以讓我們?cè)诮涌诶锩娑x具體的方法實(shí)現(xiàn)。
這個(gè)default方法是所有的實(shí)現(xiàn)類都不需要去實(shí)現(xiàn)的就可以直接調(diào)用,那么比如說(shuō)jdk的集合List里面增加了一個(gè)sort方法,那么如果定義為一個(gè)抽象方法,其所有的實(shí)現(xiàn)類如arrayList,LinkedList等都需要對(duì)其添加實(shí)現(xiàn),那么現(xiàn)在用default定義一個(gè)默認(rèn)的方法之后,其實(shí)現(xiàn)類可以直接使用這個(gè)方法了,這樣不管是開(kāi)發(fā)還是維護(hù)項(xiàng)目,都會(huì)大大簡(jiǎn)化代碼量。
2、Lambda 表達(dá)式
Lambda表達(dá)式是jdk1.8里面的一個(gè)重要的更新,這意味著java也開(kāi)始承認(rèn)了函數(shù)式編程,并且嘗試引入其中。
首先,什么是函數(shù)式編程,引用廖雪峰先生的教程里面的解釋就是說(shuō):函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語(yǔ)言編寫的函數(shù)沒(méi)有變量,因此,任意一個(gè)函數(shù),只要輸入是確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒(méi)有副作用。而允許使用變量的程序設(shè)計(jì)語(yǔ)言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數(shù)是有副作用的。函數(shù)式編程的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù)!
簡(jiǎn)單的來(lái)說(shuō)就是,函數(shù)也是一等公民了,在java里面一等公民有變量,對(duì)象,那么函數(shù)式編程語(yǔ)言里面函數(shù)也可以跟變量,對(duì)象一樣使用了,也就是說(shuō)函數(shù)既可以作為參數(shù),也可以作為返回值了。
3、函數(shù)式接口
定義:“函數(shù)式接口”是指僅僅只包含一個(gè)抽象方法的接口,每一個(gè)該類型的lambda表達(dá)式都會(huì)被匹配到這個(gè)抽象方法。jdk1.8提供了一個(gè)@FunctionalInterface注解來(lái)定義函數(shù)式接口,如果我們定義的接口不符合函數(shù)式的規(guī)范便會(huì)報(bào)錯(cuò)。
4.方法與構(gòu)造函數(shù)引用
jdk1.8提供了另外一種調(diào)用方式::,當(dāng) 你 需 要使用 方 法 引用時(shí) , 目 標(biāo)引用 放 在 分隔符::前 ,方法 的 名 稱放在 后 面 ,即ClassName :: methodName 。例如 ,Apple::getWeight就是引用了Apple類中定義的方法getWeight。請(qǐng)記住,不需要括號(hào),因?yàn)槟銢](méi)有實(shí)際調(diào)用這個(gè)方法。
5、局部變量限制
Lambda表達(dá)式也允許使用自由變量(不是參數(shù),而是在外層作用域中定義的變量),就像匿名類一樣。 它們被稱作捕獲Lambda。 Lambda可以沒(méi)有限制地捕獲(也就是在其主體中引用)實(shí)例變量和靜態(tài)變量。但局部變量必須顯式聲明為final,或事實(shí)上是final。
為什么局部變量有這些限制?
(1)實(shí)例變量和局部變量背后的實(shí)現(xiàn)有一個(gè)關(guān)鍵不同。實(shí)例變量都存儲(chǔ)在堆中,而局部變量則保存在棧上。如果Lambda可以直接訪問(wèn)局部變量,而且Lambda是在一個(gè)線程中使用的,則使用Lambda的線程,可能會(huì)在分配該變量的線程將這個(gè)變量收回之后,去訪問(wèn)該變量。因此, Java在訪問(wèn)自由局部變量時(shí),實(shí)際上是在訪問(wèn)它的副本,而不是訪問(wèn)原始變量。如果局部變量?jī)H僅賦值一次那就沒(méi)有什么區(qū)別了——因此就有了這個(gè)限制。
(2)這一限制不鼓勵(lì)你使用改變外部變量的典型命令式編程模式。
6、Date Api更新
1.8之前JDK自帶的日期處理類非常不方便,我們處理的時(shí)候經(jīng)常是使用的第三方工具包,比如commons-lang包等。不過(guò)1.8出現(xiàn)之后這個(gè)改觀了很多,比如日期時(shí)間的創(chuàng)建、比較、調(diào)整、格式化、時(shí)間間隔等。這些類都在java.time包下。比原來(lái)實(shí)用了很多。
6.1 LocalDate/LocalTime/LocalDateTime
LocalDate為日期處理類、LocalTime為時(shí)間處理類、LocalDateTime為日期時(shí)間處理類,方法都類似,具體可以看API文檔或源碼,選取幾個(gè)代表性的方法做下介紹。
now相關(guān)的方法可以獲取當(dāng)前日期或時(shí)間,of方法可以創(chuàng)建對(duì)應(yīng)的日期或時(shí)間,parse方法可以解析日期或時(shí)間,get方法可以獲取日期或時(shí)間信息,with方法可以設(shè)置日期或時(shí)間信息,plus或minus方法可以增減日期或時(shí)間信息;
6.2TemporalAdjusters
這個(gè)類在日期調(diào)整時(shí)非常有用,比如得到當(dāng)月的第一天、最后一天,當(dāng)年的第一天、最后一天,下一周或前一周的某天等。
6.3DateTimeFormatter
以前日期格式化一般用SimpleDateFormat類,但是不怎么好用,現(xiàn)在1.8引入了DateTimeFormatter類,默認(rèn)定義了很多常量格式(ISO打頭的),在使用的時(shí)候一般配合LocalDate/LocalTime/LocalDateTime使用,比如想把當(dāng)前日期格式化成yyyy-MM-dd hh:mm:ss的形式:
7、流
定義:流是Java API的新成員,它允許我們以聲明性方式處理數(shù)據(jù)集合(通過(guò)查詢語(yǔ)句來(lái)表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn))。就現(xiàn)在來(lái)說(shuō),我們可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外,流還可以透明地并行處理,也就是說(shuō)我們不用寫多線程代碼了。
Stream 不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它是有關(guān)算法和計(jì)算的,它更像一個(gè)高級(jí)版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個(gè)一個(gè)遍歷元素并對(duì)其執(zhí)行某些操作;高級(jí)版本的 Stream,用戶只要給出需要對(duì)其包含的元素執(zhí)行什么操作,比如 “過(guò)濾掉長(zhǎng)度大于 10 的字符串”、“獲取每個(gè)字符串的首字母”等,Stream 會(huì)隱式地在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。
Stream 就如同一個(gè)迭代器(Iterator),單向,不可往復(fù),數(shù)據(jù)只能遍歷一次,遍歷過(guò)一次后即用盡了,就好比流水從面前流過(guò),一去不復(fù)返。而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顧名思義,當(dāng)使用串行方式去遍歷時(shí),每個(gè) item 讀完后再讀下一個(gè) item。而使用并行去遍歷時(shí),數(shù)據(jù)會(huì)被分成多個(gè)段,其中每一個(gè)都在不同的線程中處理,然后將結(jié)果一起輸出。Stream 的并行操作依賴于 Java7 中引入的 Fork/Join 框架(JSR166y)來(lái)拆分任務(wù)和加速處理過(guò)程。
流的操作類型分為兩種:
Intermediate:一個(gè)流可以后面跟隨零個(gè)或多個(gè) intermediate 操作。其目的主要是打開(kāi)流,做出某種程度的數(shù)據(jù)映射/過(guò)濾,然后返回一個(gè)新的流,交給下一個(gè)操作使用。這類操作都是惰性化的(lazy),就是說(shuō),僅僅調(diào)用到這類方法,并沒(méi)有真正開(kāi)始流的遍歷。
Terminal:一個(gè)流只能有一個(gè) terminal 操作,當(dāng)這個(gè)操作執(zhí)行后,流就被使用“光”了,無(wú)法再被操作。所以這必定是流的最后一個(gè)操作。Terminal 操作的執(zhí)行,才會(huì)真正開(kāi)始流的遍歷,并且會(huì)生成一個(gè)結(jié)果,或者一個(gè) side effect。
在對(duì)于一個(gè) Stream 進(jìn)行多次轉(zhuǎn)換操作 (Intermediate 操作),每次都對(duì) Stream 的每個(gè)元素進(jìn)行轉(zhuǎn)換,而且是執(zhí)行多次,這樣時(shí)間復(fù)雜度就是 N(轉(zhuǎn)換次數(shù))個(gè) for 循環(huán)里把所有操作都做掉的總和嗎?其實(shí)不是這樣的,轉(zhuǎn)換操作都是 lazy 的,多個(gè)轉(zhuǎn)換操作只會(huì)在 Terminal 操作的時(shí)候融合起來(lái),一次循環(huán)完成。我們可以這樣簡(jiǎn)單的理解,Stream 里有個(gè)操作函數(shù)的集合,每次轉(zhuǎn)換操作就是把轉(zhuǎn)換函數(shù)放入這個(gè)集合中,在 Terminal 操作的時(shí)候循環(huán) Stream 對(duì)應(yīng)的集合,然后對(duì)每個(gè)元素執(zhí)行所有的函數(shù)。
【軟件組成】
JDK包含的基本組件包括:javac – 編譯器,將源程序轉(zhuǎn)成字節(jié)碼
jar – 打包工具,將相關(guān)的類文件打包成一個(gè)文件
javadoc – 文檔生成器,從源碼注釋中提取文檔
jdb – debugger,查錯(cuò)工具
java – 運(yùn)行編譯后的java程序(.class后綴的)
appletviewer:小程序?yàn)g覽器,一種執(zhí)行HTML文件上的Java小程序的Java瀏覽器。
Javah:產(chǎn)生可以調(diào)用Java過(guò)程的C過(guò)程,或建立能被Java程序調(diào)用的C過(guò)程的頭文件。
Javap:Java反匯編器,顯示編譯類文件中的可訪問(wèn)功能和數(shù)據(jù),同時(shí)顯示字節(jié)代碼含義。
Jconsole: Java進(jìn)行系統(tǒng)調(diào)試和監(jiān)控的工具
【安裝方法】
1.雙擊JDK1.8的安裝包,并點(diǎn)擊下一步


2.選擇安裝目錄,完成后點(diǎn)擊下一步





3.等待安裝。。。

4.安裝JRE(Java Runtime Environment)java運(yùn)行環(huán)境,選擇和之前一樣的目錄,點(diǎn)擊下一步

5.等待安裝。。

6.安裝完成。

【使用教程】
jdk環(huán)境變量配置對(duì)于Java程序開(kāi)發(fā)而言,主要會(huì)使用JDK的兩個(gè)命令:javac.exe、java.exe。路徑:C:\Java\jdk 1.7.0 _09\bin。但是這些命令由于不屬于windows自己的命令,所以要想使用,就需要進(jìn)行路徑配置。
單擊“計(jì)算機(jī)-屬性-高級(jí)系統(tǒng)設(shè)置”,單擊“環(huán)境變量”。在“系統(tǒng)變量”欄下單擊“新建”,創(chuàng)建新的系統(tǒng)環(huán)境變量。

(1)新建->變量名"JAVA_HOME",變量值"C:\Java\jdk1.8.0_05"(即JDK的安裝路徑)
(2)編輯->變量名"Path",在原變量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)新建->變量名“CLASSPATH”,變量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
如:JAVA_HOME環(huán)境變量的操作如下:


確認(rèn)環(huán)境配置是否正確:
在控制臺(tái)分別輸入java,javac,java -version 命令,出現(xiàn)如下所示的JDK的編譯器信息,包括修改命令的語(yǔ)法和參數(shù)選項(xiàng)等信息。
java命令:


javac命令:

java -version命令:

jdk1.8如何設(shè)置默認(rèn)時(shí)區(qū)
首先我們打開(kāi)所用Tomcat的目錄;

然后讓我們進(jìn)入到其中的bin目錄,看到如圖界面;

在目錄中找到catalina.sh文件,如圖紅框位置文件;

讓我們進(jìn)行對(duì)這個(gè)文件的編輯,進(jìn)入到編輯頁(yè)面;

找到JAVA_OPTS配置項(xiàng),小編這里是已經(jīng)注釋掉的,不過(guò)沒(méi)關(guān)系,不影響之后的操作;

現(xiàn)在來(lái)設(shè)置默認(rèn)的時(shí)區(qū),為JAVA_OPTS設(shè)置值,
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=GMT+7",如圖所示;

保存并關(guān)閉文件,下面就可以重新試一試,時(shí)區(qū)已經(jīng)改成GMT+7了,如果要設(shè)置其他時(shí)區(qū),可以自行更改的;

【使用技巧】
JDK1.7和JDK1.8的切換首先要明確jdk一般都是默認(rèn)安裝在C:\Program Files\Java下的,在配置環(huán)境變量時(shí)一般要配置PATH,CLASSPATH,JAVA_HOME三個(gè)變量,其中PATH是系統(tǒng)已經(jīng)創(chuàng)建好的,CLASSPATH,JAVA_HOME則是需要手動(dòng)創(chuàng)建的。(百度說(shuō):1.5之后不用再設(shè)置classpath了,但個(gè)人強(qiáng)烈建議繼續(xù)設(shè)置以保證向下兼用問(wèn)題)
一、配置jdk1.7(win7系統(tǒng))
安裝好之后,右擊 計(jì)算機(jī)——>屬性——>高級(jí)系統(tǒng)設(shè)置——>環(huán)境變量——>系統(tǒng)變量
第一點(diǎn):新建變量JAVA_HOME,填寫jdk的安裝路徑,我的是:C:\Program Files\Java\jdk1.7.0_75,要注意不要加“;”
第二點(diǎn):新建變量CLASSPATH,填寫“.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;”,
引號(hào)不是哈!注意前面有“.”,如果你用就復(fù)制這句話就好,JAVA_HOME就是剛才新建的第一個(gè)變量名,要保持一致(至于為啥要填寫這個(gè),我目前也不知道,但是應(yīng)該是需要的架包)
第三點(diǎn):PATH屬性填寫“C:\Program Files\Java\jdk1.7.0_75\bin”,
要注意,加上這句話之前PATH原有的內(nèi)容不要隨便刪除,都是非常重要的配置,在原有內(nèi)容的后面加上英文分號(hào)“;”,再 添上這句話。
驗(yàn)證是否成功:在運(yùn)行中輸入cmd,輸入java -version


就表示成功了,如果還有問(wèn)題,一般是變量配置的有問(wèn)題,或者原本裝的jdk沒(méi)有清理干凈,這一點(diǎn)我還沒(méi)有實(shí)踐,就不寫了。
jdk1.8的配置和1.7基本一致,不再重復(fù)了(我是先裝的1.7,然后現(xiàn)在用的是1.8,我的目的是切換回1.7)
二、jdk1.8切換回jdk1.7
1. JAVA_HOME 改成:C:\Program Files\Java\jdk1.8.0_74
2.PATH改成:C:\Program Files\Java\jdk1.8.0_74\bin
同樣的1.7切換為1.8也是修改這兩項(xiàng)。
三、最后強(qiáng)調(diào)可能出現(xiàn)不成功的原因
我現(xiàn)在是1.8,因?yàn)槭?.8,所以
在安裝jdk8的時(shí)候,安裝過(guò)程中會(huì)在系統(tǒng)變量Path的最前面加上了C:\ProgramData\Oracle\Java\javapath;
這是安裝jdk8的時(shí)候帶出來(lái)的,并且在Path的最前面,所以無(wú)論修改注冊(cè)表還是Java控制臺(tái)都沒(méi)有用,
執(zhí)行的指令在系統(tǒng)變量中搜尋命令時(shí)最先找到的就是C:\ProgramData\Oracle\Java\javapath;
始終是jdk8的。
那么,我們需要把Path最前面的C:\ProgramData\Oracle\Java\javapath;刪除
這樣才能對(duì)JAVA_HOME修改來(lái)切換需要的jdk環(huán)境。
總之照做就對(duì)了,找到PATH,把“C:\ProgramData\Oracle\Java\javapath;”刪掉,友情提醒,最好先把整個(gè)path內(nèi)容COPY一份,免得手抖刪錯(cuò)了。
刪除之后,聽(tīng)說(shuō)會(huì)出現(xiàn)如下錯(cuò)誤(但是我沒(méi)有出現(xiàn)):

(然后可能還會(huì)不行,因?yàn)镃:\Windows\System32下面還有三個(gè)文件java.exe、javaw.exe和javaws.exe,也需要?jiǎng)h了)
但是我也只找到了javaws.exe然后刪掉了,可能我之前換得時(shí)候不小心處理過(guò),所以少了兩個(gè)。
然后要做的就和之前的配置一樣了,把那三個(gè)系統(tǒng)變量從1.8換成1.7的。(記得輸入java -version驗(yàn)證一下版本)



































