




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java面試知識(shí)點(diǎn)解析(四)一一版本特性篇
?前言:
在遨游了一番JavaWeb的世界之后,發(fā)現(xiàn)了自己的一些缺失,所以就著一篇深度
好文:知名互聯(lián)網(wǎng)公司校招Java開發(fā)崗面試知識(shí)點(diǎn)解析,來好好的對(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語句,foreach簡化了迭代器。
格式:〃增強(qiáng)for循環(huán)括號(hào)里寫兩個(gè)參數(shù),第一個(gè)是聲明一個(gè)變量,第二個(gè)就是
需要迭代的容器
for(元素類型變量名:Collection集合&數(shù)組){
)
語法:
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集合,在遍歷過程中還需要對(duì)元素進(jìn)行操作,
比如刪除,需要使用迭代器。
如果遍歷數(shù)組,還需要對(duì)數(shù)組元素進(jìn)行操作,建議用傳統(tǒng)for循環(huán)因?yàn)榭梢远x角
標(biāo)通過角標(biāo)操作元素。如果只為遍歷獲取,可以簡化成高級(jí)for循環(huán),它的出現(xiàn)為
了簡化書寫。比起普通的for循環(huán),高級(jí)for循環(huán)還有性能優(yōu)勢(shì),因?yàn)樗鼘?duì)數(shù)組索
引的邊界值只計(jì)算一次(摘自?EffectiveJava))第46條)。
高級(jí)for循環(huán)可以遍歷map集合嗎?
答:原則上map集合是無法使用增強(qiáng)for循環(huán)來迭代的,因?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í)際上,
我們可以通過某種方式來使用增強(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)在簡潔性和預(yù)防Bug方面有著傳統(tǒng)for循環(huán)無法比擬的優(yōu)勢(shì),
并且沒有性能損失。應(yīng)該盡可能地使用for-each循環(huán)。遺憾的是,有三種常見的
情況是無法使用for-each循環(huán)的:
1.過濾一一如果需要遍歷集合,并刪除選定的元素,就需要使用顯式地迭代器,
以便可以調(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ù)組過去,2.有多少個(gè)參數(shù)就
傳遞多少個(gè)參數(shù)。
例如:
publicvoidprintColor(Stringred,Stringgreen,Stringyellow){
)
//或者
publicvoidprintColor(String[]colors){
)
這樣編寫方法參數(shù)雖然能夠?qū)崿F(xiàn)我們想要的效果,但是,這樣是不是有點(diǎn)麻煩呢?
再者,如果參數(shù)個(gè)數(shù)不確定,我們?cè)趺崔k呢?JavaJDK1.5為我們提供的可變參數(shù)
就能夠完美的解決這個(gè)問題
答:
可變參數(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ù)。現(xiàn)在,直接將數(shù)組中的元素作為參數(shù)傳遞即可。底層其實(shí)是將這些元素進(jìn)行
數(shù)組的封裝,而這個(gè)封裝動(dòng)作,是在底層完成的,被隱藏了。所以簡化了用戶的書
寫,少了調(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ù)列表的最后;
?②”「位于變量類型和變量名之間,前后有無空格都可以;
?③調(diào)用可變參數(shù)的方法時(shí),編譯器為該可變參數(shù)隱含創(chuàng)建一個(gè)數(shù)組,在方法
體中以數(shù)組的形式訪問可變參數(shù)。
Publicintadd(intx,int...args){〃也可以直接(int..args)就是說傳不傳
都可以
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
答:
問題:對(duì)象的某個(gè)屬性的值不能是任意的,必須為固定的一組取值其中的某一個(gè);
解決辦法:
1)在setGrade方法中做判斷,不符合格式要求就拋出異常;
2)直接限定用戶的選擇,通過自定義類模擬枚舉的方式來限定用戶的輸入,寫一
個(gè)Grade類,私有構(gòu)造函數(shù),對(duì)外提供5個(gè)靜態(tài)的常量表示類的實(shí)例;
3)jdk5中新定義了枚舉類型,專門用于解決此類問題;
4)枚舉就是一個(gè)特殊的java類,可以定義屬性、方法、構(gòu)造函數(shù)、實(shí)現(xiàn)接口、繼
承類;
為什么要有枚舉?
問題:要定義星期幾或性別的變量,該怎么定義?假設(shè)用1-7分別表示星期一到星
期日,但有人可能會(huì)寫成intweekday=0;或即使使用常量方式也無法阻止意外。
枚舉就是要讓某個(gè)類型的變量的取值只能為若干個(gè)固定值中的一個(gè),否則,編譯器
就會(huì)報(bào)錯(cuò)。枚舉可以讓編譯器在編譯時(shí)就可以控制源程序中填寫的非法值,普通變
量的方式在開發(fā)階段無法實(shí)現(xiàn)這一目標(biāo)。
用普通類如何實(shí)現(xiàn)枚舉功能,定義一個(gè)Weekday的類來模擬枚舉功能。
1、私有的構(gòu)造方法。
2、每個(gè)元素分別用一個(gè)公有的靜態(tài)成員變量表示。
可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else
語句轉(zhuǎn)移成了一個(gè)個(gè)獨(dú)立的類
示例:定義一個(gè)Weekday的類來模擬枚舉功能。
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)造方法、成員變量、普通方法和抽象
方法。
?枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的最后要有分號(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è)元素分別是由枚
舉類的子類來生成的實(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ì)象來處理,針對(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)歷了什么過程?裝箱->拆箱->裝箱
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的基石。
泛型可以帶來如下的好處總結(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)成員,簡化靜態(tài)成員的書寫。
import語句可以導(dǎo)入一個(gè)類或某個(gè)包中的所有類
importstatic語句導(dǎo)入一個(gè)類中的某個(gè)靜態(tài)方法或所有靜態(tài)方法
importstaticjava,util.Collections.〃導(dǎo)入了Collections類中的所有靜
態(tài)成員
靜態(tài)導(dǎo)入可以導(dǎo)入靜態(tài)方法,這樣就不必寫類名而可以直接調(diào)用靜態(tà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>也可以通過importstaticjava.lang.Math.*;導(dǎo)入Math類下所有的靜態(tài)方法。
2、如果將javac設(shè)置為了Java5以下,那么靜態(tài)導(dǎo)入等jdkl.5的特性都會(huì)報(bào)告錯(cuò)
誤。
7)新的線程模型和并發(fā)庫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語言對(duì)Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性
name,那我們通過getName,setName來得到其值或者設(shè)置新的值。通過
getName/setName來訪問name屬性,這就是默認(rèn)的規(guī)則。Java中提供了一套API
用來訪問某個(gè)屬性的getter/setter方法,通過這些API可以使你不需要了解這個(gè)
規(guī)則(但你最好還是要搞清楚),這些API存放于包java.beans中。
一般的做法是通過類Introspector來獲取某個(gè)對(duì)象的Beaninfo信息,然后通過
Beaninfo來獲取屬性的描述器(PropertyDescriptor),通過這個(gè)屬性描述器就可
以獲取某個(gè)屬性對(duì)應(yīng)的getter/setter方法,然后我們就可以通過反射機(jī)制來調(diào)用
這些方法。
擴(kuò)展閱讀:javaIntrospector(內(nèi)省)的介紹
9)注解(Annotations)
答:
注解(Annotation)是一種應(yīng)用于類、方法、參數(shù)、變量、構(gòu)造器及包聲明中的特殊
修飾符,它是一種由JSR-175標(biāo)準(zhǔn)選擇用來描述元數(shù)據(jù)的一種工具。Java從Java5
開始引入了注解。在注解出現(xiàn)之前,程序的元數(shù)據(jù)只是通過java注釋和javadoc,
但是注解提供的功能要遠(yuǎn)遠(yuǎn)超過這些。注解不僅包含了元數(shù)據(jù),它還可以作用于程
序運(yùn)行過程中、注解解釋器可以通過注解決定程序的執(zhí)行順序。
比如,下面這段代碼:
?Override
publicStringtoString(){
return"ThisisString.
)
上面的代碼中,我重寫了toString。方法并使用了?Override注解。但是,即使我
們不使用@Override注解標(biāo)記代碼,程序也能夠正常執(zhí)行。那么,該注解表示什么?
這么寫有什么好處嗎?事實(shí)上,?Override告訴編譯器這個(gè)方法是一個(gè)重寫方法
(描述方法的元數(shù)據(jù)),如果父類中不存在該方法,編譯器便會(huì)報(bào)錯(cuò),提示該方法沒
有重寫父類中的方法。如果我不小心拼寫錯(cuò)誤,例如將toString。寫成了
toStrringQ{doubler),而且我也沒有使用@Override注解,那程序依然能編譯運(yùn)行。
但運(yùn)行結(jié)果會(huì)和我期望的大不相同?,F(xiàn)在我們了解了什么是注解,并且使用注解有
助于閱讀程序。
為什么要引入注解?
使用注解之前(甚至在使用之后),XML被廣泛的應(yīng)用于描述元數(shù)據(jù)。不知何時(shí)開始
一些應(yīng)用開發(fā)人員和架構(gòu)師發(fā)現(xiàn)XML的維護(hù)越來越糟糕了。他們希望使用一些和
代碼緊耦合的東西,而不是像XML那樣和代碼是松耦合的(在某些情況下甚至是完
全分離的)代碼描述。如果你在Google中搜索"XMLvs.annotations",會(huì)看到許多
關(guān)于這個(gè)問題的辯論。最有趣的是XML配置其實(shí)就是為了分離代碼和配置而引入
的。上述兩種觀點(diǎn)可能會(huì)讓你很疑惑,兩者觀點(diǎn)似乎構(gòu)成了一種循環(huán),但各有利弊。
下面我們通過一個(gè)例子來理解這兩者的區(qū)別。
假如你想為應(yīng)用設(shè)置很多的常量或參數(shù),這種情況下,XML是一個(gè)很好的選擇,
因?yàn)樗粫?huì)同特定的代碼相連。如果你想把某個(gè)方法聲明為服務(wù),那么使用注解會(huì)
更好一些,因?yàn)檫@種情況下需要注解和方法緊密耦合起來,開發(fā)人員也必須認(rèn)識(shí)到
這點(diǎn)。
另一個(gè)很重要的因素是注解定義了一種標(biāo)準(zhǔn)的描述元數(shù)據(jù)的方式。在這之前,開發(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類處來實(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)造方法,你可以通過構(gòu)造方
法來直接創(chuàng)建ProcessBuilder的對(duì)象。而Process是一個(gè)抽象類,一般都通
過Runtime.exec()和ProcessBuilder.start()來間接創(chuàng)建其實(shí)例。
ProcessBuilder為進(jìn)程提供了更多的控制,例如,可以設(shè)置當(dāng)前工作目錄,還可
以改變環(huán)境參數(shù)。而Process類的功能相對(duì)來說簡單的多。ProcessBuilder類不
是同步的。如果多個(gè)線程同時(shí)訪問一個(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í)行打開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ù)的常用格式以及特定
于語言環(huán)境的輸出。常見的Java類型,如byte,
java.math.BigDecimal和java.util.Calendar都支持。通
過java.util.Formattable接口提供了針對(duì)任意用戶類型的有限格式定制。
更詳細(xì)的介紹見這里。主要使用方法的代碼示例如下:
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的新特征,主要功能是簡化文本掃描,但這個(gè)類最實(shí)
用的地方還是在獲取控制臺(tái)輸入。
(l).Scanner概述
可以從字符串(Readable)、輸入流、文件、Channel等來直接構(gòu)造Scanner對(duì)象,
有了Scanner了,就可以逐段(根據(jù)正則分隔式)來掃描整個(gè)文本,并對(duì)掃描后
的結(jié)果做想要的處理。
Scanner默認(rèn)使用空格作為分割符來分隔文本,但允許你使
用useDelimiter(Patternpattern)或useDelimiter(Stringpattern)方法來指
定新的分隔符。
主要API如下:
?delimiter():返回此Scanner當(dāng)前正在用于匹配分隔符的Pattern。
?hasNext():判斷掃描器中當(dāng)前掃描位置后是否還存在下一段。
?hasNextLine():如果在此掃描器的輸入中存在另一?行,則返回true。
?next():查找并返回來自此掃描器的下一個(gè)完整標(biāo)記。
?nextLineO:此掃描器執(zhí)行當(dāng)前行,并返回跳過的輸入信息。
(2).掃描控制臺(tái)輸入
當(dāng)通過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文件中讀取長整型long的數(shù)據(jù)。
Scannersc=newScanner(newFile("myNumbers"));
while(sc.hasNextLong()){
longaLong=sc.nextLong();
}
以下示例可以使用除空格之外的分隔符來從一個(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中新增的類,主要用來代替+號(hào)和StringBuffer來更加
高效的拼接字符串。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。
前者可以用來打開系統(tǒng)默認(rèn)瀏覽器瀏覽指定的URL,打開系統(tǒng)默認(rèn)郵件客戶端給指
定的郵箱發(fā)郵件,用默認(rèn)應(yīng)用程序打開或編輯文件(比如,用記事本打開以txt為后綴
名的文件),用系統(tǒng)默認(rèn)的打印機(jī)打印文檔;
后者可以用來在系統(tǒng)托盤區(qū)創(chuàng)建一個(gè)托盤程序.
2)使用JAXB2來實(shí)現(xiàn)對(duì)象與XML之間的映射
答:
JAXB是JavaArchitectureforXMLBinding的縮寫,可以將一個(gè)Java對(duì)象轉(zhuǎn)變成為
XML格式,反之亦然。
我們把對(duì)象與關(guān)系數(shù)據(jù)庫之間的映射稱為ORM,其實(shí)也可以把對(duì)象與XML之間的
映射稱為OXM(ObjectXMLMapping).原來JAXB是JavaEE的一部分,在JDK6中,
SUN將其放到了JavaSE中,這也是SUN的一貫做法。
JDK6中自帶的這個(gè)JAXB版本是2.0,比起1.O0SR31)來,JAXB20SR222)用JDK5
的新特性Annotation來標(biāo)識(shí)要作綁定的類和屬性等,這就極大簡化了開發(fā)的工作
量。
實(shí)際上,在JavaEE5.0中,EJB和WebServices也通過Annotation來簡化開發(fā)工
作。另外,JAXB2在底層是用StAX(JSR173)來處理XML文檔。除了JAXB之外,我
們還可以通過XMLBeans和Castor等來實(shí)現(xiàn)同樣的功能。
3)理解StAX
答:
StAXQSR173)是JDK6.0中除了D0M和SAX之外的又一種處理XML文檔的API。
StAX的來歷:在JAXP1.3(JSR206)有兩種處理XML文檔的方法:DOM(Document
ObjectModel)和SAXfSimpleAPIforXML).
由于JDK6.0中的JAXB20SR222)^UJAX-WS2.0QSR224)者B會(huì)用至UStAX,所以Sun
決定把StAX加入到JAXP家族當(dāng)中來,并將JAXP的版本升級(jí)到1.4(JAXP1.4是
JAXP1.3的維護(hù)版本)JDK6里面JAXP的版本就是1.4.0
StAX是TheStreamingAPIforXML的縮寫,一種利用拉模式解析(pull-
parsingJXML文檔的API.StAX通過提供一種基于事件迭代器(Iterator)的API讓程
序員去控制xml文檔解析過程,程序遍歷這個(gè)事件迭代器去處理每一個(gè)解析事件,
解析事件可以看做是程序拉出來的,也就是程序促使解析器產(chǎn)生一個(gè)解析事件,然
后處理該事件,之后又促使解析器產(chǎn)生下一個(gè)解析事件,如此循環(huán)直到碰到文檔結(jié)
束符;
SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個(gè)xml
文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將
整個(gè)xml文檔映射到一顆內(nèi)存樹,這樣就可以很容易地得到父節(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)語言的特征。
這個(gè)特性對(duì)于某些需要用到動(dòng)態(tài)編譯的應(yīng)用程序相當(dāng)有用,比如JSPWebServer,
當(dāng)我們手動(dòng)修改JSP后,是不希望需要重啟WebServer才可以看到效果的,這時(shí)
候我們就可以用CompilerAPI來實(shí)現(xiàn)動(dòng)態(tài)編譯JSP文件,當(dāng)然,現(xiàn)在的JSPWeb
Server也是支持JSP熱部署的,現(xiàn)在的JSPWebServer通過在運(yùn)行期間通過
Runtime.exec或ProcessBuilder來調(diào)用javac來編譯代碼,這種方式需要我們產(chǎn)生
另一個(gè)進(jìn)程去做編譯工作,不夠優(yōu)雅而且容易使代碼依賴與特定的操作系統(tǒng);
CompilerAPI通過一套易用的標(biāo)準(zhǔn)的API提供了更加豐富的方式去做動(dòng)態(tài)編譯,而
且是跨平臺(tái)的。
5)輕量級(jí)HttpServerAPI
答:
JDK6提供了一個(gè)簡單的HttpServerAPI,據(jù)此我們可以構(gòu)建自己的嵌入式Http
Server,它支持Http和Https協(xié)議,提供了HTTP1.1的部分實(shí)現(xiàn),沒有被實(shí)現(xiàn)的那部
分可以通過擴(kuò)展已有的HttpServerAPI來實(shí)現(xiàn),程序員必須自己實(shí)現(xiàn)HttpHandler
接口,HttpServer會(huì)調(diào)用HttpHandler實(shí)現(xiàn)類的回調(diào)方法來處理客戶端請(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來處理AnnotationsfJSR175)
實(shí)際上JSR269不僅僅用來處理Annotation,我覺得更強(qiáng)大的功能是它建立了Java
語言本身的一個(gè)模型,它把method,package,constructor,type,variable,enum,
annotation等Java語言元素映射為Types和Elements(兩會(huì)有什么區(qū)別?),從而將
Java語言的語義映射成為對(duì)象我們可以在javax.lang.model包下面可以看到這些
類所以我們可以利用JSR269提供的API來構(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過程可以看作是一個(gè)round的
序列.
JSR269主要被設(shè)計(jì)成為針對(duì)Tools或者容器的API,舉個(gè)例子,我們想建立一套基于
Annotation的單元測(cè)試框架(如TestNG),在測(cè)試類里面用Annotation來標(biāo)識(shí)測(cè)試期
間需要執(zhí)行的測(cè)試方法。
7)用Console開發(fā)控制臺(tái)程序
JDK6中提供了java.io.Console類專用來訪問基于字符的控制臺(tái)設(shè)備.你的程序如果
要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞.
但我們不總是能得到可用的Console,一個(gè)JVM是否有可用的Console依賴于底層
平臺(tái)和JVM如何被調(diào)用.如果JVM是在交互式命令行(比如Windows的cmd)中啟
動(dòng)的,并且輸入輸出沒有重定向到另外的地方,那么就可以得到一個(gè)可用的Console
實(shí)例.
8)對(duì)腳本語言的支持
如: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
文件來配置運(yùn)行參數(shù)(或者說是支持聲明式編程,如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開始,JDK目錄中新增了一個(gè)名為db的目錄。這便是Java6的新成員:
JavaDBo這是一個(gè)純Java實(shí)現(xiàn)、開源的數(shù)據(jù)庫管理系統(tǒng)(DBMS),源于Apache
軟件基金會(huì)(ASF)名下的項(xiàng)目Derby。它只有2MB大小,對(duì)比動(dòng)輒上G的數(shù)據(jù)庫
來說可謂袖珍。但這并不妨礙Derby功能齊備,支持幾乎大部分的數(shù)據(jù)庫應(yīng)用所
需要的特性。JDK6.0里面帶的這個(gè)Derby的版本是1021.7,支持存儲(chǔ)過程和觸發(fā)
器;有兩種運(yùn)行模式,一種是作為嵌入式數(shù)據(jù)庫,另一種是作為網(wǎng)絡(luò)數(shù)據(jù)庫。前者
的數(shù)據(jù)庫服務(wù)器和客戶端都在同一個(gè)JVM里面運(yùn)行,后者允許數(shù)據(jù)庫服務(wù)器端和
客戶端不在同一個(gè)JVM里面,而且允許這兩者在不同的物理機(jī)器上。值得注意的
是JDK6里面的這個(gè)Derby支持JDK6的新特性JDBC4.0規(guī)范(JSR221)。
11)JDBC4.0
在JavaSE6所提供的諸多新特性和改進(jìn)中,值得一提的是為Java程序提供數(shù)據(jù)庫
訪問機(jī)制的JDBC版本升級(jí)到了4.0,這個(gè)以JSR-221為代號(hào)的版本,提供了更加便
利的代碼編寫機(jī)制及柔性,并且支持更多的數(shù)據(jù)類型。JDBC4.0主要有以下改進(jìn)和
新特性。
?自動(dòng)加載java.sql.Driver,而不需要再調(diào)用class.forName;
?添加了java.sql.RowId數(shù)據(jù)類型用來可以訪問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)寫過一篇詳細(xì)介紹Java7特性的文章了,這里就直接黏了:Java7新特性
1)DiamondOperator
類型判斷是一個(gè)人特殊的煩惱,入下面的代碼:
Map<String<,List<String>>anagrams=newHashMap<String?List<String>>();
通過類型推斷后變成:
Map<StringJList<String>>anagrams=newHashMap<>();
注:這個(gè)V>被叫做diamond(鉆石)運(yùn)算符,Java7后這個(gè)運(yùn)算符從引用的聲明中
推斷類型。
2)在switch語句中使用字符串
switch語句可以使用原始類型或枚舉類型。Java引入了另一種類型,我們可以在
switch語句中使用:字符串類型。
說我們有一個(gè)根據(jù)其地位來處理貿(mào)易的要求。直到現(xiàn)在,我們使用if-其他語句來
完成這個(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語句來
改進(jìn)程序,該語句以String類型作為參數(shù)。
publicvoidprocessTrade(Tradet){
Stringstatus=t.getStatus();
switch(status){
caseNEW:
newTrade(t);
break;
caseEXECUTE:
executeTrade(t);
break;
casePENDING:
pendingTrade(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省東營市墾利區(qū)第一中學(xué)2025屆高三下學(xué)期第三次質(zhì)檢考試歷史試題含解析
- 江蘇省徐州市泉山區(qū)2025年初三適應(yīng)性監(jiān)測(cè)考試物理試題含解析
- 上海市長寧區(qū)2024-2025學(xué)年高三年級(jí)4月摸底考試英語試題含解析
- 山東省煙臺(tái)市萊山區(qū)重點(diǎn)中學(xué)2024-2025學(xué)年初三年級(jí)第二次教學(xué)質(zhì)量檢查考試數(shù)學(xué)試題含解析
- 江蘇省南通市安海中學(xué)2025年高三年級(jí)第二學(xué)期自主檢測(cè)試題(2)化學(xué)試題含解析
- 裝修電工施工合同范本
- 喀喇沁旗2025年三下數(shù)學(xué)期末復(fù)習(xí)檢測(cè)試題含解析
- 戰(zhàn)略規(guī)劃咨詢合同
- 甲乙丙三方設(shè)備購買租賃合同
- 統(tǒng)編版二年級(jí)語文下冊(cè)第八單元測(cè)試卷(B)(含答案)
- 2024年阜陽太和縣第二人民醫(yī)院招聘筆試真題
- 招商引資知識(shí)培訓(xùn)課件
- 癌癥治療協(xié)議書模板
- 2025年平頂山文化藝術(shù)職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 弘揚(yáng)航天精神中國航天日主題宣教課件
- 上海市寶山區(qū)上海交大附中2024-2025學(xué)年高考生物試題模擬試卷(8)生物試題含解析
- 私募基金財(cái)務(wù)管理制度版本
- 人教部編版語文四年級(jí)下冊(cè)第七單元大單元教學(xué)設(shè)計(jì)
- 2025-2030全球及中國煉油廠服務(wù)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 商務(wù)英語中的語用失誤分析論文
- 2025中國海洋大學(xué)輔導(dǎo)員考試題庫
評(píng)論
0/150
提交評(píng)論