黑武士的領(lǐng)地
          ——黑武士是反微軟的JAVA陣營(yíng)的流氓JAVA程序員
          posts - 26,comments - 4,trackbacks - 0
           1.J2SE:懷胎

            Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領(lǐng)導(dǎo)的綠色計(jì)劃(Green Project)開(kāi)始著力發(fā)展一種分布式系統(tǒng)結(jié)構(gòu),使其能夠在各種消費(fèi)性電子產(chǎn)品上運(yùn)行,他們使用了C/C++/Oak語(yǔ)言。由于電子產(chǎn)品種類(lèi)繁多,運(yùn)行環(huán)境各不相同,使得用這些語(yǔ)言進(jìn)行開(kāi)發(fā)的軟件必須為不同的電子產(chǎn)品而專(zhuān)門(mén)設(shè)計(jì),所以項(xiàng)目組疲于奔命,消費(fèi)性電子產(chǎn)品軟件環(huán)境的發(fā)展無(wú)法達(dá)到預(yù)期的目標(biāo),綠色計(jì)劃也陷于停滯狀態(tài)。

            直至 1994年下半年,由于Internet的迅猛發(fā)展和環(huán)球信息網(wǎng) WWW的快速增長(zhǎng),第一個(gè)全球信息網(wǎng)絡(luò)瀏覽器Mosaic誕生了;此時(shí),工業(yè)界對(duì)適合在網(wǎng)絡(luò)異構(gòu)環(huán)境下使用的語(yǔ)言有一種非常急迫的需求;Games Gosling決定改變綠色計(jì)劃的發(fā)展方向,他們對(duì)Oak進(jìn)行了小規(guī)模的改造,就這樣,Java在1995年的3月23日誕生了!Java的誕生標(biāo)志著互聯(lián)網(wǎng)時(shí)代的開(kāi)始,它能夠被應(yīng)用在全球信息網(wǎng)絡(luò)的平臺(tái)上編寫(xiě)互動(dòng)性及強(qiáng)的Applet程序,而1995年的Applet無(wú)疑能給人們無(wú)窮的視覺(jué)和腦力震蕩。

            但沒(méi)有相應(yīng)的開(kāi)發(fā)庫(kù)而只靠Java語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā)肯定是困難重重,所以Sun公司在1996年的1月23日發(fā)布了JDK1.0來(lái)幫助開(kāi)發(fā)人員的開(kāi)發(fā)。
          JDK包括兩大部分:運(yùn)行環(huán)境和開(kāi)發(fā)工具。而運(yùn)行環(huán)境包括五大部分:核心API,集成API,用戶界面API,發(fā)布技術(shù),Java虛擬機(jī)(JVM)。Java能夠在信息網(wǎng)絡(luò)時(shí)代快速發(fā)展,得益于它獨(dú)特的組成結(jié)構(gòu),它并不直接被編譯成所在平臺(tái)的機(jī)器語(yǔ)言然后執(zhí)行,而是先被編譯成字節(jié)碼,然后才到裝有JVM的硬件上運(yùn)行,所以它能夠跨平臺(tái)運(yùn)行;而且,不是一定要使用Java語(yǔ)言來(lái)寫(xiě)程序才能編譯成Java字節(jié)碼,我們用C/C++/Javascript等語(yǔ)言來(lái)寫(xiě)程序也可以編譯出JVM要求的字節(jié)碼文件。在這個(gè)時(shí)期,人們使用最多的 Java API 無(wú)疑地就是 AWT,因?yàn)?JDK 1.0 時(shí)只有 AWT 稱(chēng)得上是一組完整的 framework,其它 Java API 都比較偏向個(gè)別的 class。

            緊跟著,Sun公司在1997年2月18日發(fā)布了JDK1.1。JDK1.1相對(duì)于舊版本最大的改進(jìn),是推出了JIT(Just-In-Time)編譯器。傳統(tǒng)的JVM收到一道字節(jié)碼指令后,解釋成機(jī)器碼,馬上執(zhí)行該機(jī)器碼,然后丟掉該機(jī)器碼,再接收下一道字節(jié)碼指令……即便是以前執(zhí)行過(guò)的字節(jié)碼指令,依然需要重新解釋成機(jī)器碼才能執(zhí)行。而JIT編譯器會(huì)把常執(zhí)行的部分先解釋好放在內(nèi)存,以后再次執(zhí)行該指令時(shí),不用再解釋?zhuān)苯訌膬?nèi)存中取出機(jī)器碼就可以執(zhí)行了,這樣提高了不少的效率。

            在JDK1.1時(shí)代,Java平臺(tái)分為PersonalJava與EmbeddedJava,前者比較適用于運(yùn)算資源和內(nèi)存豐富的設(shè)備,而資源有限者適用于后者。這樣的分類(lèi)明顯不符合時(shí)代發(fā)展的潮流,所以,Java平臺(tái)處處蘊(yùn)藏著新的翻天覆地的革命……

            2.J2SE1.2:誕生

            JDK1.2在1998年12月4日的隆重發(fā)布,標(biāo)志著Java2平臺(tái)的誕生。Java2的J2SE1.2時(shí)代是一個(gè)大變革時(shí)代,它進(jìn)行了如下的三大革命:

            * 市場(chǎng)推廣革命

            在Java1.0或者1.1中,稱(chēng)API庫(kù)為JDK,但為了方便市場(chǎng)推廣,Sun公司在Java1.2版以后將JDK1.2改名為J2SDK,將Java改名為Java 2。在99年Sun公司還將Java2平臺(tái)分為三大塊:J2SE,J2EE,
          J2ME。這次市場(chǎng)推廣革命順應(yīng)了網(wǎng)絡(luò)急速發(fā)展的潮流,對(duì)Java2平臺(tái)的發(fā)展起到了很好的催化劑的作用。

            * API供應(yīng)標(biāo)準(zhǔn)革命

            而隨著供應(yīng)商的不同,Java的API分為三大類(lèi):

            Java Core API:由Sun公司制定的基本的API,所有的Java平臺(tái)都應(yīng)該提供。這就是我們平常所說(shuō)的Java核心類(lèi)庫(kù)。

            Java Optional API:由Sun公司制定的擴(kuò)充API,Java平臺(tái)可以有選擇地提供。比如, JFC以前是Sun對(duì)JDK的功能擴(kuò)展,不是Java的公共規(guī)范。Java2平臺(tái)則包含了JFC技術(shù),不需要再擴(kuò)展了。

            特殊API:由特殊廠商或者組織提供的API。比如,美國(guó)法律對(duì)出口中國(guó)的加解密算法的安全強(qiáng)度有一定的限制,Java平臺(tái)中不能包括一些安全強(qiáng)度較高的加密解密算法,所以部分其它國(guó)家的公司,如加拿大的BouncyCastle公司等,可以提供一些自己的安全API。

            * API制定過(guò)程的革命

            如果你有需求不能通過(guò)遵循標(biāo)準(zhǔn)的API來(lái)實(shí)現(xiàn),可以向 www.jcp.org 提出制定新的API的請(qǐng)求,經(jīng)過(guò)審核,你的請(qǐng)求可能被通過(guò)或者駁回;如果是被通過(guò),則開(kāi)始進(jìn)入制定該API的程序。

            J2SE1.2時(shí)代進(jìn)行的這些革命形成的制度一直沿用到現(xiàn)在,對(duì)Java技術(shù)的發(fā)展形成了深遠(yuǎn)的影響。

            除了上述的三大革命,Java2 還支持并新增了許多新特性,最受追捧的當(dāng)屬Swing庫(kù)。Swing 是輕量級(jí) 的 API,它不但有各式各樣先進(jìn)的組件,而且連組件風(fēng)格都可抽換。Swing 出現(xiàn)之后,大家很快地就不太使用 AWT 了。但請(qǐng)不要以為 Swing 是用來(lái)取代 AWT 的,其實(shí) Swing 是架構(gòu)在 AWT 之上的, Swing 的出現(xiàn)只是減少程序員直接使用 AWT 的機(jī)會(huì),而不會(huì)讓 AWT 消失。Java2 還廢棄了一些API,最重要的莫過(guò)于Thread類(lèi)中對(duì)suspend(),resume()和stop()等方法的廢棄。由于JDK1.1的集合類(lèi)庫(kù)中的Vector類(lèi)和HashTable類(lèi)都考慮了同步,在平常的使用中影響效率,所以Java2專(zhuān)門(mén)添加了對(duì)應(yīng)的非同步類(lèi),并完善了集合類(lèi)庫(kù)。

            Java2平臺(tái)能夠得到廣泛的應(yīng)用,還應(yīng)歸功于這個(gè)時(shí)期的一些優(yōu)秀書(shū)籍,比如著名的<<Core Java2>>(卷一和卷二),該書(shū)隨著JDK版本的變化已經(jīng)出到第六版。

            3. J2SE1.3:拓廣

            Java2平臺(tái)推出后,得到了市場(chǎng)的強(qiáng)烈反響,所以,在2000年5月8日推出的J2SE1.3對(duì)J2SE1.2的改進(jìn),主要是對(duì)各種已有API的加強(qiáng)和對(duì)新API的拓展。

            數(shù)字運(yùn)算: 加入了java.lang.StrictMath,方便我們的一般的數(shù)字運(yùn)算。

            新的Timer API:相信大家對(duì)其中的java.util.Timer和java.util.TimerTask一定不陌生。

            Collections包:??加入了一些新的API,方便我們的使用。

            虛擬機(jī)停止鉤子:J2SE1.3還加入了一個(gè)強(qiáng)大的功能,那就是虛擬機(jī)停止鉤子(Virtual Machine Shutdown Hooks),這個(gè)功能使得我們能夠在虛擬機(jī)停止時(shí)完成我們自己的操作,比如關(guān)閉網(wǎng)絡(luò)連接或者保存會(huì)話狀態(tài)或者清除臨時(shí)文件等等。

            DNS服務(wù):在JNDI接口方面,加入了一個(gè)DNS服務(wù)的實(shí)現(xiàn)。

            Jini實(shí)現(xiàn):J2SE1.3包含了一個(gè)Jini實(shí)現(xiàn),這使得我們可以方便地把諸如打印機(jī)、攝像機(jī)和磁盤(pán)驅(qū)動(dòng)設(shè)備插入現(xiàn)有網(wǎng)絡(luò)中,并且能自動(dòng)搜索已在網(wǎng)上的設(shè)備可以提供的服務(wù)并享用這些服務(wù)。

            XML支持:由于計(jì)算機(jī)網(wǎng)絡(luò)和XML技術(shù)的快速發(fā)展, J2SE1.3在Optional API中引入了Java API for XML包。

            HotSpot虛擬機(jī):J2SE1.3引入了HotSpot虛擬機(jī)。在solaris版的JDK1.3中,已經(jīng)不支持傳統(tǒng)的虛擬機(jī),而windows版的JDK1.3同時(shí)支持傳統(tǒng)虛擬機(jī)和HotSpot虛擬機(jī)。

            從上面的分析可以看出,J2SE1.3主要是對(duì)J2SE1.2查漏補(bǔ)缺和拓展新的API。從應(yīng)用領(lǐng)域方面考慮,J2SE1.3已經(jīng)涵蓋了數(shù)據(jù)庫(kù)、WEB、多媒體、網(wǎng)絡(luò)、電話、影像、加解密、圖形等等大部分的信息技術(shù)領(lǐng)域。

            在這個(gè)時(shí)期Java2還有一個(gè)重要活動(dòng)就是推出SCSL(Sun社區(qū)源代碼許可)許可協(xié)議。Sun公司
          開(kāi)放源代碼項(xiàng)目的“女1號(hào)”Danese Cooper在1999年加入公司,負(fù)責(zé)Sun(包括Java)和開(kāi)放源代碼社區(qū)之間的協(xié)調(diào)工作。Sun一直盡可能在贏利和開(kāi)放源代碼之間尋求更好的平衡。
          在J2SE1.3時(shí)代,Java2平臺(tái)得到了充分的發(fā)展,各大應(yīng)用服務(wù)器在這個(gè)時(shí)代漸漸成熟并被廣泛采納,而Java2相關(guān)的培訓(xùn)和書(shū)籍更是如火如荼,《Thinking in Java》當(dāng)屬不得不推薦的一本。

            4. J2SE1.4:快速

            J2SE1.4平臺(tái)的推出發(fā)生在2002年2月13日,由于此前在Java平臺(tái)和.Net平臺(tái)間發(fā)生了規(guī)模浩大的孰優(yōu)孰劣的論戰(zhàn),而論戰(zhàn)中,Java平臺(tái)最大的缺點(diǎn)就是性能問(wèn)題,所以J2SE1.4平臺(tái)把性能的改善放在了最重要的位置。

            HotSpot虛擬機(jī): HotSpot虛擬機(jī)能夠很大程度上提高性能,所以J2SE1.4已經(jīng)不支持傳統(tǒng)的虛擬機(jī)。現(xiàn)在,啟動(dòng)應(yīng)用程序應(yīng)該通過(guò)-client或者-server選項(xiàng)來(lái)啟動(dòng),如果你還是通過(guò)-classic選項(xiàng)來(lái)啟動(dòng),會(huì)收到這樣的錯(cuò)誤提示:”Error: Classic VM no longer supported。”

            鎖機(jī)制: 由于舊版的HotSpot虛擬機(jī)的鎖機(jī)制會(huì)導(dǎo)制嚴(yán)重的性能和功能問(wèn)題,J2SE1.4已經(jīng)改寫(xiě)了該鎖機(jī)制。

            安全API: Java Cryptography Extension(JCE),Java Secure Socket Extension(JSSE)和Java Authentication and Authorization(JAAS)這三大安全API從optional API移到了core API中。這樣,J2SE1.4的安全域(SecureRandom)實(shí)現(xiàn)可以利用操作系統(tǒng)提供的安全機(jī)制,以便縮短應(yīng)用程序的啟動(dòng)時(shí)間。同時(shí)從optional API移到core API的功能還有XML處理API和JDBC2.0 API。

            RandomAccess標(biāo)記接口: 加入了RandomAccess標(biāo)記接口,如果一個(gè)List實(shí)現(xiàn)了該接口,則表示它支持快速的隨機(jī)訪問(wèn),這樣可以提高List訪問(wèn)的速度。

            LinkedHashMap: 加入了LinkedHashMap,這是一個(gè)插入排序的Map實(shí)現(xiàn),但它的運(yùn)行速度和HashMap一樣快。

            反射: 很多產(chǎn)品中都要使用反射(Reflection)機(jī)制,但大家知道,反射是相當(dāng)耗時(shí)的,所以,J2SE1.4中重寫(xiě)了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法,使得我們利用反射也能寫(xiě)出高性能的應(yīng)用程序。

            64位計(jì)算: J2SE1.4支持64位計(jì)算。64位支持使J2SE1.4可以使用超過(guò)幾百GB的內(nèi)存,而以前的版本僅可以使用4G以內(nèi)的內(nèi)存。內(nèi)存使用的擴(kuò)大可以提高程序的運(yùn)行效率。

            新的I/O API: J2SE1.4在API層面最大的變動(dòng),就是它更新了原有的java.io包,以及加入了一組更有效率更多功能的新的I/O API。舊的I/O處理是以串流(stream)的方式來(lái)存取的,以字節(jié)為單位,而新的I/O處理是以塊(block)的方式來(lái)存取的。一個(gè)塊可能包含了512字節(jié),而磁盤(pán)的存取本就是一個(gè)塊一個(gè)塊來(lái)進(jìn)行的,所以新的I/O處理方式對(duì)于底層底數(shù)據(jù)存取更自然更有效率。

            斷言和日志處理: J2SE1.4版本在Java語(yǔ)言層面上加入了斷言(assert關(guān)鍵字),在API層面上加入日志處理API,這些為程序的調(diào)試提供了強(qiáng)有力的支持 。

            從上面的分析可以看出,Java 2平臺(tái)在經(jīng)過(guò)數(shù)年的發(fā)展后,已經(jīng)比較成熟穩(wěn)定,J2SE1.4主要是對(duì)平臺(tái)的性能進(jìn)行較多的考慮和修改。在分布式程序方面,1.4版比1.3版的運(yùn)行效率提高了一半以上;而在客戶端程序方面,1.4版比1.3版的效率提高了1/3。當(dāng)然,除了考慮運(yùn)行效率,J2SE1.4還有其它方面的改進(jìn),如推出了一個(gè)全新的運(yùn)行Java應(yīng)用程序的方法Java Web Start,該方法克服了Java Applet的安全性限制的問(wèn)題和Java Application的軟件發(fā)布難的問(wèn)題,并結(jié)合了上面兩種方法的好處,為Java軟件客戶提供了非常友好的使用體驗(yàn)。

            J2SE1.4版是J2SE第一個(gè)參與了 Java共同體過(guò)程(JCP)的J2SE版本。 象Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM這樣的公司,和Sun一起定義并發(fā)展了J2SE 1.4規(guī)范。在開(kāi)放、良好的文檔編撰與管理的過(guò)程中,形成了一個(gè)高質(zhì)量的、代表了Java共同體的多樣性的規(guī)范。J2SE1.4的Specification Lead是Doug Kramer。Doug Kramer是優(yōu)秀的Java開(kāi)發(fā)人員和著名的教育培訓(xùn)專(zhuān)家,他同時(shí)還是J2SE1.4.2的Specification Lead 和J2SE1.5的JVM的Specification Lead。

            5. J2SE5.0:易用

            在2004年十月J2SE5.0發(fā)布的時(shí)候,SUN公司這樣解釋這次版本名稱(chēng)不是J2SE1.5而是J2SE5.0的原因:“從Java誕生至今已有9年時(shí)間,而從有J2SE算起也有5個(gè)年頭了;在這樣的背境下,將該版本號(hào)從1.5改為5.0可以更好的反映出新版的J2SE的成熟度、穩(wěn)定性、可伸縮性、安全性。”

            J2SE的這次變更之重大和意義之深遠(yuǎn),的確也值得我們?yōu)橹寻姹咎?hào)變換到J2SE5.0。我們?cè)倏纯碨un公司網(wǎng)站對(duì)J2SE5.0的features描述:“通過(guò)增強(qiáng)Java平臺(tái)的力量,允許開(kāi)發(fā)者更容易地使用,Java編程語(yǔ)言的這些改進(jìn)將吸引大量各種Java開(kāi)發(fā)者”,這是“Java技術(shù)發(fā)展歷程的一個(gè)重要里程碑” 。從這個(gè)描述我們可以看出,J2SE5.0最大的目標(biāo)是通過(guò)提供易用性而吸引各種開(kāi)發(fā)者(當(dāng)然包括以前的C/C++開(kāi)發(fā)者) ,而它對(duì)以前版本的修改并不僅僅是API的升級(jí),而且包括對(duì)Java語(yǔ)言層面的改進(jìn)。

            訪問(wèn)環(huán)境變量: 最初的Java語(yǔ)言有一個(gè)訪問(wèn)環(huán)境變量的方法System.getenv(),但因?yàn)镴ava宣稱(chēng)的”Write Once,Run AnyWhere”特性,所以在JDK1.0中去掉了這個(gè)能夠訪問(wèn)平臺(tái)專(zhuān)有信息的方法。在J2SE5.0中,它又來(lái)了,并有所擴(kuò)充。由此可見(jiàn)J2SE5.0對(duì)編程方便性的重視程度。

            泛型 J2SE5.0提供了強(qiáng)大的泛型機(jī)制,讓程序員可以減少代碼重復(fù),這個(gè)變化應(yīng)該可以吸引小部分的C#開(kāi)發(fā)人員吧。

            增強(qiáng)的for循環(huán) 為了克服普通for循環(huán)的代碼臃腫特點(diǎn),J2SE5.0提供了增強(qiáng)的for循環(huán),我們現(xiàn)在可以這樣寫(xiě)一個(gè)for循環(huán):

          public void printAll(Collection<String> coll)
          {
          for(String str : coll)
          {
          System.out.println(str);
          }
          }

            怎么樣?是不是簡(jiǎn)單了很多?

            自動(dòng)的裝箱/拆箱 我們以前手工的做裝箱(Boxing)/拆箱(unBoxing)操作時(shí),是不是很煩?放心,J2SE5.0提供了自動(dòng)的裝箱/拆箱操作,我們現(xiàn)在可以寫(xiě)如下的代碼:

          public void boxing(int i)
          {
          ArrayList<Integer> list=new ArrayList<Integer>();
          list.add(0,i);
          System.out.println(“i的值是”+list.get(0));
          }

            可變參數(shù)數(shù)目 J2SE5.0 開(kāi)始支持Varargs(不固定自變量個(gè)數(shù)),J2SE5.0中還加入了以前拋棄的
          枚舉和C風(fēng)格的格式化輸出,這應(yīng)該是為了吸引以前的C開(kāi)發(fā)者吧。畢竟,在C開(kāi)發(fā)中枚舉和格式化輸出用的是太多了。

            并發(fā) J2SE5.0中加入了java.util.concurrent包,并向集合框架中加入了Queue接口,J2SE5.0還為各種集合提供了并發(fā)情況下的實(shí)現(xiàn)。
          Properties類(lèi)增強(qiáng) 由于XML的普及性應(yīng)用,J2SE5.0為java.util.Properties類(lèi)加入了從XML文件中裝載屬性和把屬性值存儲(chǔ)到XML文件中的方法。

            Annotation功能 J2SE5.0提供了注解(annotation)/元數(shù)據(jù)(metadata)功能,相信以后的大部分應(yīng)用產(chǎn)品都將充分利用它的注解而實(shí)現(xiàn)產(chǎn)品的各種特性。

            其它 J2SE5.0還在多線程(并發(fā)機(jī)制)、安全、國(guó)際化、UI等方面進(jìn)行了大規(guī)模的變更,使得我們能夠更方便地進(jìn)行Java開(kāi)發(fā)。

            其實(shí),上面的這些變更,并不是我們程序員非要不可的內(nèi)容。我們完全可以通過(guò)自己的辦法來(lái)達(dá)到這些變更實(shí)現(xiàn)的功能。但J2SE5.0的目標(biāo)就是讓我們程序員能夠更加方便地進(jìn)行開(kāi)發(fā),所以,我們?cè)诨贘2SE5.0開(kāi)發(fā)時(shí),應(yīng)該能夠明顯的體會(huì)到它的易用性。

            6.展望

            時(shí)至今日,J2SE已經(jīng)發(fā)展為一個(gè)覆蓋面廣、效率高、易用性強(qiáng)的技術(shù)平臺(tái),但Java并沒(méi)有停止前進(jìn)的腳步。Mustang版本的J2SE正在緊鑼密鼓的開(kāi)發(fā)當(dāng)中,按以前的慣例,每?jī)赡陼?huì)發(fā)布一個(gè)全新的J2SE版本,所以Mustang開(kāi)發(fā)版對(duì)應(yīng)的J2SE6.0發(fā)布版將在2006年完成。

            J2SE6.0的Specification Lead是Sun公司老資格的開(kāi)發(fā)者M(jìn)ark Reinhold,我們?cè)贘2SE1.2中就能看到他的影子。Mark Reinhold曾經(jīng)是NIO(新的I/O處理) API的Specification Lead,現(xiàn)在是Sun的J2SE架構(gòu)師與總工程師。Mark Reinhold透露說(shuō),J2SE6.0將更易于管理,可以給外部的管理軟件提供更多信息。它可以讓調(diào)試軟件在程序運(yùn)行的時(shí)候進(jìn)行檢查,而不是在運(yùn)行之前,這樣更容易找到問(wèn)題所在。他說(shuō),J2SE6.0 將會(huì)更好地和圖形用戶界面集成,包括微軟即將發(fā)布的Windows 版本Longhorn。

            2005年3月23日是Java技術(shù)
          十周年慶典日,在這十年的發(fā)展中,Java平臺(tái)吸引了四百萬(wàn)開(kāi)發(fā)者,在網(wǎng)絡(luò)計(jì)算遍及全球的今天,更是有17.5億臺(tái)設(shè)備使用了Java技術(shù)。作為Java技術(shù)的基礎(chǔ),J2SE的功績(jī)不可掩沒(méi),我們期望J2SE伴隨Java平臺(tái)一路走好!
          posted on 2005-08-01 08:20 黑武士 閱讀(124) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 業(yè)界新聞
          主站蜘蛛池模板: 永川市| 手机| 谷城县| 滦平县| 措勤县| 桂阳县| 甘德县| 汨罗市| 罗平县| 奉化市| 雅江县| 波密县| 依兰县| 连平县| 习水县| 浪卡子县| 连山| 渭源县| 赫章县| 资溪县| 石楼县| 吴桥县| 盘锦市| 湾仔区| 温宿县| 苍溪县| 乐山市| 牡丹江市| 柳林县| 安塞县| 广昌县| 镇安县| 孝昌县| 永宁县| 汉源县| 凉山| 滨州市| 都兰县| 门头沟区| 射阳县| 美姑县|