Java 面試知識(shí)點(diǎn)解析(四)-版本特性篇_第1頁(yè)
Java 面試知識(shí)點(diǎn)解析(四)-版本特性篇_第2頁(yè)
Java 面試知識(shí)點(diǎn)解析(四)-版本特性篇_第3頁(yè)
Java 面試知識(shí)點(diǎn)解析(四)-版本特性篇_第4頁(yè)
Java 面試知識(shí)點(diǎn)解析(四)-版本特性篇_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java面試知識(shí)點(diǎn)解析(四)一一版本特性篇

?前言:

在遨游了一番JavaWeb的世界之后,發(fā)現(xiàn)了自己的一些缺失,所以就著一篇深度

好文:知名互聯(lián)網(wǎng)公司校招Java開(kāi)發(fā)崗面試知識(shí)點(diǎn)解析,來(lái)好好的對(duì)Java知識(shí)點(diǎn)

進(jìn)行復(fù)習(xí)和學(xué)習(xí)一番,大部分內(nèi)容參照自這一篇文章,有一些自己補(bǔ)充的,也算是

重新學(xué)習(xí)一下Java吧。

前序文章鏈接:

Java面試知識(shí)點(diǎn)解析(一)一一基礎(chǔ)知識(shí)篇

Java面試知識(shí)點(diǎn)解析(二)一一高并發(fā)編程篇

Java面試知識(shí)點(diǎn)解析(三)---JVM篇

對(duì)于Java各個(gè)版本的特性,特別是Java8的新知識(shí)點(diǎn),我們都應(yīng)該有所了解。

前排申明和好文推薦:閃爍之狐?Java5新特性及使用?Java6新特性及使用?Java7新特性及使

用?Java8新特性及使用(一)》Java8新特性及使用(二)

(一)Java5相關(guān)知識(shí)點(diǎn)

參考文章:jdkl.5新特性

1)增強(qiáng)型for循環(huán):

答:增強(qiáng)for循環(huán):foreach語(yǔ)句,foreach簡(jiǎn)化了迭代器。

格式:〃增強(qiáng)for循環(huán)括號(hào)里寫(xiě)兩個(gè)參數(shù),第一個(gè)是聲明一個(gè)變量,第二個(gè)就是

需要迭代的容器

for(元素類型變量名:Collection集合&數(shù)組){

)

語(yǔ)法:

for(type變量名:集合變量名){...}

注意事項(xiàng):

?迭代變量必須在()中定義!

?集合變量可以是數(shù)組或?qū)崿F(xiàn)了Iterable接口的集合類。

高級(jí)for循環(huán)和傳統(tǒng)for循環(huán)的區(qū)別:

高級(jí)for循環(huán)在使用時(shí),必須要明確被遍歷的目標(biāo)。這個(gè)目標(biāo),可以是Collection

集合或者數(shù)組,如果遍歷Collection集合,在遍歷過(guò)程中還需要對(duì)元素進(jìn)行操作,

比如刪除,需要使用迭代器。

如果遍歷數(shù)組,還需要對(duì)數(shù)組元素進(jìn)行操作,建議用傳統(tǒng)for循環(huán)因?yàn)榭梢远x角

標(biāo)通過(guò)角標(biāo)操作元素。如果只為遍歷獲取,可以簡(jiǎn)化成高級(jí)for循環(huán),它的出現(xiàn)為

了簡(jiǎn)化書(shū)寫(xiě)。比起普通的for循環(huán),高級(jí)for循環(huán)還有性能優(yōu)勢(shì),因?yàn)樗鼘?duì)數(shù)組索

引的邊界值只計(jì)算一次(摘自?EffectiveJava))第46條)。

高級(jí)for循環(huán)可以遍歷map集合嗎?

答:原則上map集合是無(wú)法使用增強(qiáng)for循環(huán)來(lái)迭代的,因?yàn)樵鰪?qiáng)for循環(huán)只能

針對(duì)實(shí)現(xiàn)了Iterable接口的集合進(jìn)行迭代;Iterable是jdk5中新定義的接口,就

一個(gè)方法iterator方法,只有實(shí)現(xiàn)了Iterable接口的類,才能保證一定有iterator

方法,java有這樣的限定是因?yàn)樵鰪?qiáng)for循環(huán)內(nèi)部還是用迭代器實(shí)現(xiàn)的,而實(shí)際上,

我們可以通過(guò)某種方式來(lái)使用增強(qiáng)for循環(huán)。

for(Objectobj:map.entrySet()){

Map.Entryentry=(Entry)obj;//obj依次表示Entry

System.out.println(entry.getKey()++entry.getValue());

)

總之,for-each循環(huán)在簡(jiǎn)潔性和預(yù)防Bug方面有著傳統(tǒng)for循環(huán)無(wú)法比擬的優(yōu)勢(shì),

并且沒(méi)有性能損失。應(yīng)該盡可能地使用for-each循環(huán)。遺憾的是,有三種常見(jiàn)的

情況是無(wú)法使用for-each循環(huán)的:

1.過(guò)濾一一如果需要遍歷集合,并刪除選定的元素,就需要使用顯式地迭代器,

以便可以調(diào)用它的remove方法。

2.轉(zhuǎn)換一一如果需要遍歷列表或者數(shù)組,并取代它部分或者全部的元素值(增刪、

或?qū)υ剡M(jìn)行賦值),就需要列表迭代器或者數(shù)組索引,以便設(shè)定元素的值

3.平行迭代一一如果需要并行地遍歷多個(gè)集合,就需要顯式地控制迭代器或者所

因變量以便所有迭代器或者索引變量都可以得到同步前移

2)可變參數(shù):

解析:什么意思呢?舉個(gè)例子:在JDK1.5之前,當(dāng)我們要為一個(gè)傳遞多個(gè)類型相

同的參數(shù)時(shí),我們有兩種方法解決,1.直接傳遞一個(gè)數(shù)組過(guò)去,2.有多少個(gè)參數(shù)就

傳遞多少個(gè)參數(shù)。

例如:

publicvoidprintColor(Stringred,Stringgreen,Stringyellow){

)

//或者

publicvoidprintColor(String[]colors){

)

這樣編寫(xiě)方法參數(shù)雖然能夠?qū)崿F(xiàn)我們想要的效果,但是,這樣是不是有點(diǎn)麻煩呢?

再者,如果參數(shù)個(gè)數(shù)不確定,我們?cè)趺崔k呢?JavaJDK1.5為我們提供的可變參數(shù)

就能夠完美的解決這個(gè)問(wèn)題

答:

可變參數(shù)(...):用到函數(shù)的參數(shù)上,當(dāng)要操作的同一個(gè)類型元素個(gè)數(shù)不確定的時(shí)

候,可是用這個(gè)方式,這個(gè)參數(shù)可以接受任意個(gè)數(shù)的同一類型的數(shù)據(jù)。

和以前接收數(shù)組不一樣的是:

以前定義數(shù)組類型,需要先創(chuàng)建一個(gè)數(shù)組對(duì)象,再將這個(gè)數(shù)組對(duì)象作為參數(shù)傳遞給

函數(shù)?,F(xiàn)在,直接將數(shù)組中的元素作為參數(shù)傳遞即可。底層其實(shí)是將這些元素進(jìn)行

數(shù)組的封裝,而這個(gè)封裝動(dòng)作,是在底層完成的,被隱藏了。所以簡(jiǎn)化了用戶的書(shū)

寫(xiě),少了調(diào)用者定義數(shù)組的動(dòng)作。

如果在參數(shù)列表中使用了可變參數(shù),可變參數(shù)必須定義在參數(shù)列表結(jié)尾(也就是必

須是最后一個(gè)參數(shù),否則編譯會(huì)失敗。)o

如果要獲取多個(gè)int數(shù)的和呢?可以使用將多個(gè)int數(shù)封裝到數(shù)組中,直接對(duì)數(shù)組

求和即可。

可變參數(shù)的特點(diǎn):

?①只能出現(xiàn)在參數(shù)列表的最后;

?②”「位于變量類型和變量名之間,前后有無(wú)空格都可以;

?③調(diào)用可變參數(shù)的方法時(shí),編譯器為該可變參數(shù)隱含創(chuàng)建一個(gè)數(shù)組,在方法

體中以數(shù)組的形式訪問(wèn)可變參數(shù)。

Publicintadd(intx,int...args){〃也可以直接(int..args)就是說(shuō)傳不傳

都可以

Intsum=x;

For(inti=0;i<=args.lengrth;i++){

Sum+=args[i]]

}

returnsum;

)

實(shí)例:

publicclassVariableparameter{

publicstaticvoidmain(String[]args){

System,out.printin(add(1^2));

System,out.printin(add(1^2,3));

}

publicstaticintadd(intx,int...args){

intsum=x;

for(inti=0;i<args.length;i++){

sum+=args[i];

}

returnsum;

)

}

3)枚舉

解析:關(guān)鍵字enum

答:

問(wèn)題:對(duì)象的某個(gè)屬性的值不能是任意的,必須為固定的一組取值其中的某一個(gè);

解決辦法:

1)在setGrade方法中做判斷,不符合格式要求就拋出異常;

2)直接限定用戶的選擇,通過(guò)自定義類模擬枚舉的方式來(lái)限定用戶的輸入,寫(xiě)一

個(gè)Grade類,私有構(gòu)造函數(shù),對(duì)外提供5個(gè)靜態(tài)的常量表示類的實(shí)例;

3)jdk5中新定義了枚舉類型,專門用于解決此類問(wèn)題;

4)枚舉就是一個(gè)特殊的java類,可以定義屬性、方法、構(gòu)造函數(shù)、實(shí)現(xiàn)接口、繼

承類;

為什么要有枚舉?

問(wèn)題:要定義星期幾或性別的變量,該怎么定義?假設(shè)用1-7分別表示星期一到星

期日,但有人可能會(huì)寫(xiě)成intweekday=0;或即使使用常量方式也無(wú)法阻止意外。

枚舉就是要讓某個(gè)類型的變量的取值只能為若干個(gè)固定值中的一個(gè),否則,編譯器

就會(huì)報(bào)錯(cuò)。枚舉可以讓編譯器在編譯時(shí)就可以控制源程序中填寫(xiě)的非法值,普通變

量的方式在開(kāi)發(fā)階段無(wú)法實(shí)現(xiàn)這一目標(biāo)。

用普通類如何實(shí)現(xiàn)枚舉功能,定義一個(gè)Weekday的類來(lái)模擬枚舉功能。

1、私有的構(gòu)造方法。

2、每個(gè)元素分別用一個(gè)公有的靜態(tài)成員變量表示。

可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else

語(yǔ)句轉(zhuǎn)移成了一個(gè)個(gè)獨(dú)立的類

示例:定義一個(gè)Weekday的類來(lái)模擬枚舉功能。

publicclassWeekDay{

privateWeekDay(){}

publicstaticfinalWeekDaySUN=newWeekDayO;

publicstaticfinalWeekDayMON=newWeekDay。;

publicWeekDaynextDay(){

if(this==SUN){

returnMON;

}else{

returnSUN;

}

)

publicStringtoString(){

returnthis==SUN?"SUN":"MON";

)

)

publicclassEnumTest{

publicstaticvoidmain(String[]args){

WeekDayday=WeekDay.MON;

System,out.println(day.nextDay());

//結(jié)果:SUN

)

)

使用枚舉類實(shí)現(xiàn)

publicclassEnumTest{

publicstaticvoidmain(String[]args){

WeekDayday=WeekDay.FRI;

System.out.println(day);

//結(jié)果:FRI

System.out.println(day.name());

〃結(jié)果:FRI

System.out.println(day.ordinal());

〃結(jié)果:5

System.out.printIn(WeekDay.valueOf("SUN"));

〃結(jié)果:SUN

System.out.printIn(WeekDay.values().length);

〃結(jié)果:7

)

publicenumWeekDay(

SUN,MON,TUE,WED,THI.FRI.SAT;

)

)

總結(jié):枚舉是一種特殊的類,其中的每個(gè)元素都是該類的一個(gè)實(shí)例對(duì)象,例如可

以調(diào)用WeekDay.SUN.getClassQ.getName和WeekDay.class.getNameQo

注意:最后一個(gè)枚舉元素后面可以加分號(hào),也可以不加分號(hào)。

實(shí)現(xiàn)帶有構(gòu)造方法的枚舉

?枚舉就相當(dāng)于一個(gè)類,其中也可以定義構(gòu)造方法、成員變量、普通方法和抽象

方法。

?枚舉元素必須位于枚舉體中的最開(kāi)始部分,枚舉元素列表的最后要有分號(hào)與其

他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器會(huì)報(bào)

告錯(cuò)誤。

?帶構(gòu)造方法的枚舉:

構(gòu)造方法必須定義成私有的

如果有多個(gè)構(gòu)造方法,將根據(jù)枚舉元素創(chuàng)建時(shí)所帶的參數(shù)決定選擇哪個(gè)構(gòu)造方

法創(chuàng)建對(duì)象。

枚舉元素MON和MONO的效果一樣,都是調(diào)用默認(rèn)的構(gòu)造方法。

示例:

publicclassEnumTest{

publicstaticvoidmain(String[]args){

WeekDayday=WeekDay.FRI;

)

publicenumWeekDay(

SUN(1),MON(「TUE,WED,TH工,FRI.SAT;

privateWeekDay(){

System.out.println("first");

)

privateWeekDay(intvalue){

System,out.println("second");

)

〃結(jié)果:

//second

//first

//first

//first

//first

//first

//first

)

)

實(shí)現(xiàn)帶有抽象方法的枚舉

定義枚舉TrafficLamp,實(shí)現(xiàn)抽象的nextTrafficLamp方法:每個(gè)元素分別是由枚

舉類的子類來(lái)生成的實(shí)例對(duì)象,這些子類采用類似內(nèi)部類的方式進(jìn)行定義。增加上

表示時(shí)間的構(gòu)造方法。

publicclassEnumTest{

publicstaticvoidmain(String[]args){

TrafficLamplamp=TrafficLamp.RED;

System.out.printin(lamp.nextLamp());

〃結(jié)果:GREEN

)

publicenumTrafficLamp{

RED(30){

publicTrafficLampnextLamp(){

returnGREEN;

)

卜GREEN(45){

publicTrafficLampnextLamp(){

returnYELLOW;

)

},YELLOW(5){

publicTrafficLampnextLamp(){

returnRED;

}

};

privateinttime;

privateTrafficLamp(inttime){

this.time=time;

)

publicabstractTrafficLampnextLamp();

}

)

注意:

1、枚舉只有一個(gè)成員時(shí),就可以作為一種單例的實(shí)現(xiàn)方式。

2、查看生成的class文件,可以看到內(nèi)部類對(duì)應(yīng)的class文件。

4)自動(dòng)拆裝箱

答:在Java中數(shù)據(jù)類型分為兩種:基本數(shù)據(jù)類型、引用數(shù)據(jù)類型(對(duì)象)

自動(dòng)裝箱:把基本類型變成包裝器類型,本質(zhì)是調(diào)用包裝器類型的valueOf()方

注意:基本數(shù)據(jù)類型的數(shù)組與包裝器類型數(shù)組不能互換

在java程序中所有的數(shù)據(jù)都需要當(dāng)做對(duì)象來(lái)處理,針對(duì)8種基本數(shù)據(jù)類型提供了

包裝類,如下:

inttInteger

bytetByte

shorttShort

longtLong

char—Character

double—Double

floattFloat

boolean->Boolean

在jdkl.5以前基本數(shù)據(jù)類型和包裝類之間需要相互轉(zhuǎn)換:

基本---弓【用Integerx=newInteger(x);

引用一基本intnum=x.intValue();

1)Integerx=1;x=x+1;經(jīng)歷了什么過(guò)程?裝箱->拆箱->裝箱

2)為了優(yōu)化,虛擬機(jī)為包裝類提供了緩沖池,Integer池的大小為-128?127—

個(gè)字節(jié)的大小。String池:Java為了優(yōu)化字符串操作也提供了一個(gè)緩沖池;

->享元模式(FlyweightPattern):享元模式的特點(diǎn)是,復(fù)用我們內(nèi)存中己經(jīng)存在

的對(duì)象,降低系統(tǒng)創(chuàng)建對(duì)象實(shí)例。

自動(dòng)裝箱:

Integernuml=12;

自動(dòng)拆箱:

System.out.printIn(numl+12);

基本數(shù)據(jù)類型的對(duì)象緩存:

Integernuml=12;

Integernum2=12;

System.out.printIn(numl==num2);//ture

Integernum3=129;

Integernum4=129;

System.out.printIn(num3==num4);//false

Integernum5=Integer.valueOf(12);

Integernum6=Integer.valueOf(12);

System.out.printIn(num5==num6);//true

示例:

publicclassAutoBox{

publicstaticvoidmain(String[]args){

〃裝箱

IntegeriObj=3;

〃拆箱

System,out.println(iObj+12);

〃結(jié)果:15

Integeril=13;

Integeri2=13;

System.out.println(il==12);

〃結(jié)果:true

il=137;

i2=137;

System.out.println(il==i2);

//結(jié)果:false

)

}

注意:

如果有很多很小的對(duì)象,并且他們有相同的東西,那就可以把他們作為一個(gè)對(duì)象。

如果還有很多不同的東西,那就可以作為外部的東西,作為參數(shù)傳入。

這就是享元設(shè)計(jì)模式(flyweight)。

例如示例中的Integer對(duì)象,在-128?127范圍內(nèi)的Integer對(duì)象,用的頻率比較高,

就會(huì)作為同一個(gè)對(duì)象,因此結(jié)果為true。超出這個(gè)范圍的就不是同一個(gè)對(duì)象,因

此結(jié)果為falseo

5)泛型Generics

答:引用泛型之后,允許指定集合里元素的類型,免去了強(qiáng)制類型轉(zhuǎn)換,并且能在

編譯時(shí)刻進(jìn)行類型檢查的好處。ParameterizedType作為參數(shù)和返回值,Generic

是vararg、annotation、enumeration>collection的基石。

泛型可以帶來(lái)如下的好處總結(jié)如下:

1.類型安全:拋棄List、Map,使用List、Map給它們添加元素或者使用

Iterator遍歷時(shí),編譯期就可以給你檢查出類型錯(cuò)誤

2.方法參數(shù)和返回值加上了Type:拋棄List、Map,使用List、Map

3.不需要類型轉(zhuǎn)換:Listlist=newArrayListQ;

4.類型通配符"?”:假設(shè)一個(gè)打印List中元素的方法printList,我們希望任何類型

T的List都可以被打印

6)靜態(tài)導(dǎo)入

答:靜態(tài)導(dǎo)入:導(dǎo)入了類中的所有靜態(tài)成員,簡(jiǎn)化靜態(tài)成員的書(shū)寫(xiě)。

import語(yǔ)句可以導(dǎo)入一個(gè)類或某個(gè)包中的所有類

importstatic語(yǔ)句導(dǎo)入一個(gè)類中的某個(gè)靜態(tài)方法或所有靜態(tài)方法

importstaticjava,util.Collections.〃導(dǎo)入了Collections類中的所有靜

態(tài)成員

靜態(tài)導(dǎo)入可以導(dǎo)入靜態(tài)方法,這樣就不必寫(xiě)類名而可以直接調(diào)用靜態(tài)方法了。

例子:

原來(lái)的:

publicclassDemol2{

publicstaticvoidmain(String[]args){

System.out.printIn(Math?max(12,15));

System.out.printIn(Math.abs(3-6));

}

)

使用靜態(tài)導(dǎo)入的:

importstaticjava.lang.Math.max;

importstaticjava.lang.Math.abs;

publicclassDemol2{

publicstaticvoidmain(String[]args){

System.out.println(max(12?15));

System,out.printIn(abs(3-6));

)

}

注意:

1>也可以通過(guò)importstaticjava.lang.Math.*;導(dǎo)入Math類下所有的靜態(tài)方法。

2、如果將javac設(shè)置為了Java5以下,那么靜態(tài)導(dǎo)入等jdkl.5的特性都會(huì)報(bào)告錯(cuò)

誤。

7)新的線程模型和并發(fā)庫(kù)ThreadFramework(重要)

答:最主要的就是引入了java.util.concurrent包,這個(gè)都是需要重點(diǎn)掌握的。

HashMap的替代者ConcurrentHashMap和ArrayList的替代者

CopyOnWriteArrayList在大并發(fā)量讀取時(shí)采用java.util.concurrent包里的一些類會(huì)

讓大家滿意BlockingQueue、Callable、Executor、Semaphore

8)內(nèi)省(Introspector)

答:是Java語(yǔ)言對(duì)Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性

name,那我們通過(guò)getName,setName來(lái)得到其值或者設(shè)置新的值。通過(guò)

getName/setName來(lái)訪問(wèn)name屬性,這就是默認(rèn)的規(guī)則。Java中提供了一套API

用來(lái)訪問(wèn)某個(gè)屬性的getter/setter方法,通過(guò)這些API可以使你不需要了解這個(gè)

規(guī)則(但你最好還是要搞清楚),這些API存放于包java.beans中。

一般的做法是通過(guò)類Introspector來(lái)獲取某個(gè)對(duì)象的Beaninfo信息,然后通過(guò)

Beaninfo來(lái)獲取屬性的描述器(PropertyDescriptor),通過(guò)這個(gè)屬性描述器就可

以獲取某個(gè)屬性對(duì)應(yīng)的getter/setter方法,然后我們就可以通過(guò)反射機(jī)制來(lái)調(diào)用

這些方法。

擴(kuò)展閱讀:javaIntrospector(內(nèi)省)的介紹

9)注解(Annotations)

答:

注解(Annotation)是一種應(yīng)用于類、方法、參數(shù)、變量、構(gòu)造器及包聲明中的特殊

修飾符,它是一種由JSR-175標(biāo)準(zhǔn)選擇用來(lái)描述元數(shù)據(jù)的一種工具。Java從Java5

開(kāi)始引入了注解。在注解出現(xiàn)之前,程序的元數(shù)據(jù)只是通過(guò)java注釋和javadoc,

但是注解提供的功能要遠(yuǎn)遠(yuǎn)超過(guò)這些。注解不僅包含了元數(shù)據(jù),它還可以作用于程

序運(yùn)行過(guò)程中、注解解釋器可以通過(guò)注解決定程序的執(zhí)行順序。

比如,下面這段代碼:

?Override

publicStringtoString(){

return"ThisisString.

上面的代碼中,我重寫(xiě)了toString。方法并使用了?Override注解。但是,即使我

們不使用@Override注解標(biāo)記代碼,程序也能夠正常執(zhí)行。那么,該注解表示什么?

這么寫(xiě)有什么好處嗎?事實(shí)上,?Override告訴編譯器這個(gè)方法是一個(gè)重寫(xiě)方法

(描述方法的元數(shù)據(jù)),如果父類中不存在該方法,編譯器便會(huì)報(bào)錯(cuò),提示該方法沒(méi)

有重寫(xiě)父類中的方法。如果我不小心拼寫(xiě)錯(cuò)誤,例如將toString。寫(xiě)成了

toStrringQ{doubler),而且我也沒(méi)有使用@Override注解,那程序依然能編譯運(yùn)行。

但運(yùn)行結(jié)果會(huì)和我期望的大不相同?,F(xiàn)在我們了解了什么是注解,并且使用注解有

助于閱讀程序。

為什么要引入注解?

使用注解之前(甚至在使用之后),XML被廣泛的應(yīng)用于描述元數(shù)據(jù)。不知何時(shí)開(kāi)始

一些應(yīng)用開(kāi)發(fā)人員和架構(gòu)師發(fā)現(xiàn)XML的維護(hù)越來(lái)越糟糕了。他們希望使用一些和

代碼緊耦合的東西,而不是像XML那樣和代碼是松耦合的(在某些情況下甚至是完

全分離的)代碼描述。如果你在Google中搜索"XMLvs.annotations",會(huì)看到許多

關(guān)于這個(gè)問(wèn)題的辯論。最有趣的是XML配置其實(shí)就是為了分離代碼和配置而引入

的。上述兩種觀點(diǎn)可能會(huì)讓你很疑惑,兩者觀點(diǎn)似乎構(gòu)成了一種循環(huán),但各有利弊。

下面我們通過(guò)一個(gè)例子來(lái)理解這兩者的區(qū)別。

假如你想為應(yīng)用設(shè)置很多的常量或參數(shù),這種情況下,XML是一個(gè)很好的選擇,

因?yàn)樗粫?huì)同特定的代碼相連。如果你想把某個(gè)方法聲明為服務(wù),那么使用注解會(huì)

更好一些,因?yàn)檫@種情況下需要注解和方法緊密耦合起來(lái),開(kāi)發(fā)人員也必須認(rèn)識(shí)到

這點(diǎn)。

另一個(gè)很重要的因素是注解定義了一種標(biāo)準(zhǔn)的描述元數(shù)據(jù)的方式。在這之前,開(kāi)發(fā)

人員通常使用他們自己的方式定義元數(shù)據(jù)。例如,使用標(biāo)記接口,注釋,transient

關(guān)鍵字等等。每個(gè)程序員按照自己的方式定義元數(shù)據(jù),而不像注解這種標(biāo)準(zhǔn)的方式。

目前,許多框架將XML和Annotation兩種方式結(jié)合使用,平衡兩者之間的利弊。

參考文章(更多注解戳這里):Java注解的理解和應(yīng)用

10)新增ProcessBuilder類

答:

ProcessBuilder類是Java5在java.lang包中新添加的一^新類,此類用于創(chuàng)建

操作系統(tǒng)進(jìn)程,它提供一種啟動(dòng)和管理進(jìn)程(也就是應(yīng)用程序)的方法。在此之前,

都是由Process類處來(lái)實(shí)現(xiàn)進(jìn)程的控制管理。每個(gè)ProcessBuilder實(shí)例管理一個(gè)

進(jìn)程屬性集。它的start()方法利用這些屬性創(chuàng)建一個(gè)新的Process實(shí)例。

start()方法可以從同一實(shí)例重復(fù)調(diào)用,以利用相同的或相關(guān)的屬性創(chuàng)建新的子進(jìn)

程。

ProcessBuilder是一個(gè)final類,有兩個(gè)帶參數(shù)的構(gòu)造方法,你可以通過(guò)構(gòu)造方

法來(lái)直接創(chuàng)建ProcessBuilder的對(duì)象。而Process是一個(gè)抽象類,一般都通

過(guò)Runtime.exec()和ProcessBuilder.start()來(lái)間接創(chuàng)建其實(shí)例。

ProcessBuilder為進(jìn)程提供了更多的控制,例如,可以設(shè)置當(dāng)前工作目錄,還可

以改變環(huán)境參數(shù)。而Process類的功能相對(duì)來(lái)說(shuō)簡(jiǎn)單的多。ProcessBuilder類不

是同步的。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)ProcessBuilder,而其中至少一個(gè)線程從

結(jié)構(gòu)上修改了其中一個(gè)屬性,它必須保持外部同步。

若要使用ProcessBuilder創(chuàng)建一個(gè)進(jìn)程,只需要?jiǎng)?chuàng)建ProcessBuilder的一個(gè)實(shí)例,

指定該進(jìn)程的名稱和所需參數(shù)。要執(zhí)行此程序,調(diào)用該實(shí)例上的start。即可。下

面是一個(gè)執(zhí)行打開(kāi)Windows記事本的例子。注意它將要編輯的文件名指定為一個(gè)

參數(shù)。

classPBDemo{

publicstaticvoidmain(Stringargs[]){

try{

ProcessBuilderproc=newProcessBuilder("notepad.exe","te

stfile");

proc.start();

}catch(Exceptione){

System.out.printin("Errorexecutingnotepad.");

)

)

}

參考文章:Java5新特性及使用

11)新增Formatter格式化器(Formatter)

Formatter類是Java5中新增的printf-style格式化字符串的解釋器,它提供對(duì)

布局和對(duì)齊的支持,提供了對(duì)數(shù)字,字符串和日期/時(shí)間數(shù)據(jù)的常用格式以及特定

于語(yǔ)言環(huán)境的輸出。常見(jiàn)的Java類型,如byte,

java.math.BigDecimal和java.util.Calendar都支持。通

過(guò)java.util.Formattable接口提供了針對(duì)任意用戶類型的有限格式定制。

更詳細(xì)的介紹見(jiàn)這里。主要使用方法的代碼示例如下:

importjava.io.BufferedReader;

importjava.io.FileReader;

importjava.text.MessageFormat;

importjava.text.SimpleDateFormat;

importjava.util.*;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

/**

*格式化測(cè)試使用的示例類.

*

*@authorblinkfoxon2017-11-28.

*/

publicclassFormatTester{

privatestaticfinalLoggerlog=LoggerFactory.getLogger(FormatTes

ter.class);

/**

*格式化.

*/

privatestaticvoidformatter(){

StringBuildersb=newStringBuilder();

Formatterformatter=newFormatter(sb,Locale.US);

//可重新排序輸出.

formatter.format("%n%4$2s%3$2s%2$2s%l$2s%n","a","b","c",

Hd");//->”dcba"

formatter.format(Locale.FRANCE"e=%+10.4f".Math.E);//->"

e=+2,7183"

formatter.format("%nAmountgainedorlostsincelaststatement:

$%(>.2F',6217.58);

//->"Amountgainedorlostsincelaststatement:$6,217.58”

("打印出格式化后的字符串:{}”,formatter);

formatter.close();

)

/**

*printf打印.

*/

privatestaticvoidprintf(){

Stringfilename="testfile";

try(FileReaderfileReader=newFileReader(filename)){

BufferedReaderreader=newBufferedReader(fileReader);

Stringline;

inti=1;

while((line=reader.readLine())!=null){

System.out.printf("Line%d:%s%n”,i++,line);

)

}catch(Exceptione){

System.err.printf("Unabletoopenfilenamed'%s1:%s",fil

ename,e.getMessage());

}

)

*stringFormat使用.

*/

privatestaticvoidstringFormat(){

//格式化日期.

Calendarc=newGregorianCalendar(1995?Calendar.MAY,23);

Strings=String.format("Duke'sBirthday:%l$tm

c);

//->s=="Duke'sBirthday:May23,1995"

(s);

}

*格式化消息.

*/

privatestaticvoidmessageFormat(){

Stringmsg="歡迎光臨,當(dāng)前({0})等待的業(yè)務(wù)受理的顧客有{1}位,請(qǐng)

排號(hào)辦理業(yè)務(wù)!]

MessageFormatmf=newMessageFormat(msg);

Stringfmsg=mf.format(newObject[]{newDate。,35});

(fmsg);

}

/**

*格式化日期.

*/

privatestaticvoiddateFormat(){

Stringstr="2010-1-1017:39:21";

SimpleDateFormatformat=newSimpleDateFormat("yyyyMMddHHmmss

");

try(

("格式化后的日期:{}",format.format(format.parse(st

r)));

}catch(Exceptione){

log.error("日期格式化出錯(cuò)!:e);

)

)

publicstaticvoidmain(String[]args){

formatter。;

stringFormat();

messageFormat();

dateFormat();

printf();

)

)

參考文章:Java5新特性及使用

12)新增Scanner類(Scanner)

java.util.Scanner是Java5的新特征,主要功能是簡(jiǎn)化文本掃描,但這個(gè)類最實(shí)

用的地方還是在獲取控制臺(tái)輸入。

(l).Scanner概述

可以從字符串(Readable)、輸入流、文件、Channel等來(lái)直接構(gòu)造Scanner對(duì)象,

有了Scanner了,就可以逐段(根據(jù)正則分隔式)來(lái)掃描整個(gè)文本,并對(duì)掃描后

的結(jié)果做想要的處理。

Scanner默認(rèn)使用空格作為分割符來(lái)分隔文本,但允許你使

用useDelimiter(Patternpattern)或useDelimiter(Stringpattern)方法來(lái)指

定新的分隔符。

主要API如下:

?delimiter():返回此Scanner當(dāng)前正在用于匹配分隔符的Pattern。

?hasNext():判斷掃描器中當(dāng)前掃描位置后是否還存在下一段。

?hasNextLine():如果在此掃描器的輸入中存在另一?行,則返回true。

?next():查找并返回來(lái)自此掃描器的下一個(gè)完整標(biāo)記。

?nextLineO:此掃描器執(zhí)行當(dāng)前行,并返回跳過(guò)的輸入信息。

(2).掃描控制臺(tái)輸入

當(dāng)通過(guò)newScanner(System.in)創(chuàng)建了一個(gè)Scanner實(shí)例時(shí),控制臺(tái)會(huì)一直等待

輸入,直到敲回車鍵結(jié)束,把所輸入的內(nèi)容傳給Scanner,作為掃描對(duì)象。如果要

獲取輸入的內(nèi)容,則只需要調(diào)用Scanner的nextLine()方法即可。

/**

*掃描控制臺(tái)輸入.

*

*@authorblinkfox2017-11-28

*/

publicclassScannerTest{

publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);

System.out.printIn("請(qǐng)輸入字符串:");

while(true){

Stringline=s.nextLine();

if(line.equals("exit"))break;

System.out.printIn(">>>"+line);

)

)

)

(3).其它示例

該示例中會(huì)從myNumbers文件中讀取長(zhǎng)整型long的數(shù)據(jù)。

Scannersc=newScanner(newFile("myNumbers"));

while(sc.hasNextLong()){

longaLong=sc.nextLong();

}

以下示例可以使用除空格之外的分隔符來(lái)從一個(gè)字符串中讀取幾個(gè)條目:

Stringinput="1fish2fishredfishbluefish";

Scanners=newScanner(input).useDelimiter(,,\\s*fish\\s*,,);

System.out.println(s.nextlnt());

System.out.println(s.nextlnt());

System.out.println(s.next());

System.out.printIn(s.next());

s.close();

將輸出:

1

2

red

blue

參考文章:Java5新特性及使用

13)StringBuilder

StringBuilder也是Java5中新增的類,主要用來(lái)代替+號(hào)和StringBuffer來(lái)更加

高效的拼接字符串。StringBuffer與StringBuilder都是繼承

于AbstractStringBuilder,主要的區(qū)別就是StringBuffer的函數(shù)上都

有synchronized關(guān)鍵字,保證線程安全。

關(guān)于StringBuilder的使用這里就不再詳細(xì)介紹了,網(wǎng)上文章也有很多??傊?,對(duì)

于動(dòng)態(tài)字符串的拼接推薦使用StringBuilder。靜態(tài)字符串的拼接直接使用+號(hào)或

者字符串的concat(Stringstr)方法,甚至也使用StringBuilder亦可。

參考文章:Java5新特性及使用

(二)Java6相關(guān)知識(shí)點(diǎn)

關(guān)于JDK1.6的新特性,了解一下就可以了…如果有興趣深入研究的童鞋,右轉(zhuǎn)這里;Java6新特性

及使用

1)Desktop類和SystemTray類:

答:

在JDK6中,AWT新增加了兩個(gè)類:Desktop和SystemTray。

前者可以用來(lái)打開(kāi)系統(tǒng)默認(rèn)瀏覽器瀏覽指定的URL,打開(kāi)系統(tǒng)默認(rèn)郵件客戶端給指

定的郵箱發(fā)郵件,用默認(rèn)應(yīng)用程序打開(kāi)或編輯文件(比如,用記事本打開(kāi)以txt為后綴

名的文件),用系統(tǒng)默認(rèn)的打印機(jī)打印文檔;

后者可以用來(lái)在系統(tǒng)托盤區(qū)創(chuàng)建一個(gè)托盤程序.

2)使用JAXB2來(lái)實(shí)現(xiàn)對(duì)象與XML之間的映射

答:

JAXB是JavaArchitectureforXMLBinding的縮寫(xiě),可以將一個(gè)Java對(duì)象轉(zhuǎn)變成為

XML格式,反之亦然。

我們把對(duì)象與關(guān)系數(shù)據(jù)庫(kù)之間的映射稱為ORM,其實(shí)也可以把對(duì)象與XML之間的

映射稱為OXM(ObjectXMLMapping).原來(lái)JAXB是JavaEE的一部分,在JDK6中,

SUN將其放到了JavaSE中,這也是SUN的一貫做法。

JDK6中自帶的這個(gè)JAXB版本是2.0,比起1.O0SR31)來(lái),JAXB20SR222)用JDK5

的新特性Annotation來(lái)標(biāo)識(shí)要作綁定的類和屬性等,這就極大簡(jiǎn)化了開(kāi)發(fā)的工作

量。

實(shí)際上,在JavaEE5.0中,EJB和WebServices也通過(guò)Annotation來(lái)簡(jiǎn)化開(kāi)發(fā)工

作。另外,JAXB2在底層是用StAX(JSR173)來(lái)處理XML文檔。除了JAXB之外,我

們還可以通過(guò)XMLBeans和Castor等來(lái)實(shí)現(xiàn)同樣的功能。

3)理解StAX

答:

StAXQSR173)是JDK6.0中除了D0M和SAX之外的又一種處理XML文檔的API。

StAX的來(lái)歷:在JAXP1.3(JSR206)有兩種處理XML文檔的方法:DOM(Document

ObjectModel)和SAXfSimpleAPIforXML).

由于JDK6.0中的JAXB20SR222)^UJAX-WS2.0QSR224)者B會(huì)用至UStAX,所以Sun

決定把StAX加入到JAXP家族當(dāng)中來(lái),并將JAXP的版本升級(jí)到1.4(JAXP1.4是

JAXP1.3的維護(hù)版本)JDK6里面JAXP的版本就是1.4.0

StAX是TheStreamingAPIforXML的縮寫(xiě),一種利用拉模式解析(pull-

parsingJXML文檔的API.StAX通過(guò)提供一種基于事件迭代器(Iterator)的API讓程

序員去控制xml文檔解析過(guò)程,程序遍歷這個(gè)事件迭代器去處理每一個(gè)解析事件,

解析事件可以看做是程序拉出來(lái)的,也就是程序促使解析器產(chǎn)生一個(gè)解析事件,然

后處理該事件,之后又促使解析器產(chǎn)生下一個(gè)解析事件,如此循環(huán)直到碰到文檔結(jié)

束符;

SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個(gè)xml

文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將

整個(gè)xml文檔映射到一顆內(nèi)存樹(shù),這樣就可以很容易地得到父節(jié)點(diǎn)和子結(jié)點(diǎn)以及

兄弟節(jié)點(diǎn)的數(shù)據(jù),但如果文檔很大,將會(huì)嚴(yán)重影響性能。

4)使用CompilerAPI

答:

現(xiàn)在我們可以用JDK6的CompilerAPI0SR199)去動(dòng)態(tài)編譯Java源文件,Compiler

API結(jié)合反射功能就可以實(shí)現(xiàn)動(dòng)態(tài)的產(chǎn)生Java代碼并編譯執(zhí)行這些代碼,有點(diǎn)動(dòng)

態(tài)語(yǔ)言的特征。

這個(gè)特性對(duì)于某些需要用到動(dòng)態(tài)編譯的應(yīng)用程序相當(dāng)有用,比如JSPWebServer,

當(dāng)我們手動(dòng)修改JSP后,是不希望需要重啟WebServer才可以看到效果的,這時(shí)

候我們就可以用CompilerAPI來(lái)實(shí)現(xiàn)動(dòng)態(tài)編譯JSP文件,當(dāng)然,現(xiàn)在的JSPWeb

Server也是支持JSP熱部署的,現(xiàn)在的JSPWebServer通過(guò)在運(yùn)行期間通過(guò)

Runtime.exec或ProcessBuilder來(lái)調(diào)用javac來(lái)編譯代碼,這種方式需要我們產(chǎn)生

另一個(gè)進(jìn)程去做編譯工作,不夠優(yōu)雅而且容易使代碼依賴與特定的操作系統(tǒng);

CompilerAPI通過(guò)一套易用的標(biāo)準(zhǔn)的API提供了更加豐富的方式去做動(dòng)態(tài)編譯,而

且是跨平臺(tái)的。

5)輕量級(jí)HttpServerAPI

答:

JDK6提供了一個(gè)簡(jiǎn)單的HttpServerAPI,據(jù)此我們可以構(gòu)建自己的嵌入式Http

Server,它支持Http和Https協(xié)議,提供了HTTP1.1的部分實(shí)現(xiàn),沒(méi)有被實(shí)現(xiàn)的那部

分可以通過(guò)擴(kuò)展已有的HttpServerAPI來(lái)實(shí)現(xiàn),程序員必須自己實(shí)現(xiàn)HttpHandler

接口,HttpServer會(huì)調(diào)用HttpHandler實(shí)現(xiàn)類的回調(diào)方法來(lái)處理客戶端請(qǐng)求,在這里,

我們把一個(gè)Http請(qǐng)求和它向響應(yīng)稱為一個(gè)交換,包裝成HttpExchange

類,HttpServer負(fù)責(zé)將HttpExchange傳給HttpHandler實(shí)現(xiàn)類的回調(diào)方法.

6)插入式注解處理API(PluggableAnnotationProcessingAPI)

答:

插入式注解處理API0SR269)提供一套標(biāo)準(zhǔn)API來(lái)處理AnnotationsfJSR175)

實(shí)際上JSR269不僅僅用來(lái)處理Annotation,我覺(jué)得更強(qiáng)大的功能是它建立了Java

語(yǔ)言本身的一個(gè)模型,它把method,package,constructor,type,variable,enum,

annotation等Java語(yǔ)言元素映射為Types和Elements(兩會(huì)有什么區(qū)別?),從而將

Java語(yǔ)言的語(yǔ)義映射成為對(duì)象我們可以在javax.lang.model包下面可以看到這些

類所以我們可以利用JSR269提供的API來(lái)構(gòu)建一個(gè)功能豐富的元編程

(metaprogramming)環(huán)境.

JSR269用AnnotationProcessor在編譯期間而不是運(yùn)行期間處理Annotation,

AnnotationProcessor相當(dāng)于編譯器的一個(gè)插件,所以稱為插入式注解處理.如果

AnnotationProcessor處理Annotation時(shí)(執(zhí)行process方法)產(chǎn)生了新的Java代碼,

編譯器會(huì)再調(diào)用一次AnnotationProcessor,如果第二次處理還有新代碼產(chǎn)生,就會(huì)接

著調(diào)用AnnotationProcessor,直到?jīng)]有新代碼產(chǎn)生為止.每執(zhí)行一次process。方法

被稱為一個(gè)‘round",這樣整個(gè)Annotationprocessing過(guò)程可以看作是一個(gè)round的

序列.

JSR269主要被設(shè)計(jì)成為針對(duì)Tools或者容器的API,舉個(gè)例子,我們想建立一套基于

Annotation的單元測(cè)試框架(如TestNG),在測(cè)試類里面用Annotation來(lái)標(biāo)識(shí)測(cè)試期

間需要執(zhí)行的測(cè)試方法。

7)用Console開(kāi)發(fā)控制臺(tái)程序

JDK6中提供了java.io.Console類專用來(lái)訪問(wèn)基于字符的控制臺(tái)設(shè)備.你的程序如果

要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞.

但我們不總是能得到可用的Console,一個(gè)JVM是否有可用的Console依賴于底層

平臺(tái)和JVM如何被調(diào)用.如果JVM是在交互式命令行(比如Windows的cmd)中啟

動(dòng)的,并且輸入輸出沒(méi)有重定向到另外的地方,那么就可以得到一個(gè)可用的Console

實(shí)例.

8)對(duì)腳本語(yǔ)言的支持

如:ruby,groovy,javascript.

9)Commonannotations

Commonannotations原本是JavaEE5.0(JSR244)規(guī)范的一部分,現(xiàn)在SUN把它的

一部分放到了JavaSE6.0中.隨著Annotation元數(shù)據(jù)功能(JSR175)力口入至ljJavaSE

5.0里面,很多Java技術(shù)(比如EJB,WebServices)都會(huì)用Annotation部分代替XML

文件來(lái)配置運(yùn)行參數(shù)(或者說(shuō)是支持聲明式編程,如EJB的聲明式事務(wù)),如果這些

技術(shù)為通用目的都單獨(dú)定義了自己的Annotations,顯然有點(diǎn)重復(fù)建設(shè),所以,為其他

相關(guān)的Java技術(shù)定義一套公共的Annotation是有價(jià)值的,可以避免重復(fù)建設(shè)的同

時(shí),也保證JavaSE和JavaEE各種技術(shù)的一致性。

10)JavaDB(Derby)

從JDK6開(kāi)始,JDK目錄中新增了一個(gè)名為db的目錄。這便是Java6的新成員:

JavaDBo這是一個(gè)純Java實(shí)現(xiàn)、開(kāi)源的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS),源于Apache

軟件基金會(huì)(ASF)名下的項(xiàng)目Derby。它只有2MB大小,對(duì)比動(dòng)輒上G的數(shù)據(jù)庫(kù)

來(lái)說(shuō)可謂袖珍。但這并不妨礙Derby功能齊備,支持幾乎大部分的數(shù)據(jù)庫(kù)應(yīng)用所

需要的特性。JDK6.0里面帶的這個(gè)Derby的版本是1021.7,支持存儲(chǔ)過(guò)程和觸發(fā)

器;有兩種運(yùn)行模式,一種是作為嵌入式數(shù)據(jù)庫(kù),另一種是作為網(wǎng)絡(luò)數(shù)據(jù)庫(kù)。前者

的數(shù)據(jù)庫(kù)服務(wù)器和客戶端都在同一個(gè)JVM里面運(yùn)行,后者允許數(shù)據(jù)庫(kù)服務(wù)器端和

客戶端不在同一個(gè)JVM里面,而且允許這兩者在不同的物理機(jī)器上。值得注意的

是JDK6里面的這個(gè)Derby支持JDK6的新特性JDBC4.0規(guī)范(JSR221)。

11)JDBC4.0

在JavaSE6所提供的諸多新特性和改進(jìn)中,值得一提的是為Java程序提供數(shù)據(jù)庫(kù)

訪問(wèn)機(jī)制的JDBC版本升級(jí)到了4.0,這個(gè)以JSR-221為代號(hào)的版本,提供了更加便

利的代碼編寫(xiě)機(jī)制及柔性,并且支持更多的數(shù)據(jù)類型。JDBC4.0主要有以下改進(jìn)和

新特性。

?自動(dòng)加載java.sql.Driver,而不需要再調(diào)用class.forName;

?添加了java.sql.RowId數(shù)據(jù)類型用來(lái)可以訪問(wèn)sqlrowid;

?添加了NationalCharacterSet的支持;

?增強(qiáng)了BLOB和CLOB的支持功能;

?SQL/XML和XML支持;

?WrapperPattern;

?SQLException增強(qiáng);

?Connection和Statement接口增強(qiáng);

?NewScalarFuntions;

?JDBCAPIchangeso

(三)JAVA7相關(guān)知識(shí)點(diǎn)

之前已經(jīng)寫(xiě)過(guò)一篇詳細(xì)介紹Java7特性的文章了,這里就直接黏了:Java7新特性

1)DiamondOperator

類型判斷是一個(gè)人特殊的煩惱,入下面的代碼:

Map<String<,List<String>>anagrams=newHashMap<String?List<String>>();

通過(guò)類型推斷后變成:

Map<StringJList<String>>anagrams=newHashMap<>();

注:這個(gè)V>被叫做diamond(鉆石)運(yùn)算符,Java7后這個(gè)運(yùn)算符從引用的聲明中

推斷類型。

2)在switch語(yǔ)句中使用字符串

switch語(yǔ)句可以使用原始類型或枚舉類型。Java引入了另一種類型,我們可以在

switch語(yǔ)句中使用:字符串類型。

說(shuō)我們有一個(gè)根據(jù)其地位來(lái)處理貿(mào)易的要求。直到現(xiàn)在,我們使用if-其他語(yǔ)句來(lái)

完成這個(gè)任務(wù)。

privatevoidprocessTrade(Tradet){

Stringstatus=t.getStatus();

if(status.equalsIgnoreCase(NEW)){

newTrade(t);

}elseif(status.equalsIgnoreCase(EXECUTE)){

executeTrade(t);

}elseif(status.equalsIgnoreCase(PENDING)){

pendingTrade(t);

)

}

這種處理字符串的方法是粗糙的。在Java中,我們可以使用增強(qiáng)的switch語(yǔ)句來(lái)

改進(jìn)程序,該語(yǔ)句以String類型作為參數(shù)。

publicvoidprocessTrade(Tradet){

Stringstatus=t.getStatus();

switch(status){

caseNEW:

newTrade(t);

break;

caseEXECUTE:

executeTrade(t);

break;

casePENDING:

pendingTrade(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論