中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

java技術(shù)代碼 Java開(kāi)發(fā)代碼

什么是java反射技術(shù),有沒(méi)有核心代碼?

看個(gè)例子吧 也算不上核心 幫助理解下反射

10余年的安義網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整安義建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“安義網(wǎng)站設(shè)計(jì)”,“安義網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

package test;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class Admin {

public Admin(){ }

private String id = "";

public String getId() {

System.out.print(id);

return id;

}

public void setId(String id) {

this.id = id;

}

public static void main(String[] args)

throws ClassNotFoundException, InstantiationException, IllegalAccessException,

SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

String str = "test.Admin";

Class c = Class.forName(str);

Object obj = c.newInstance(); //得到Admin類(lèi)

Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); //這里是設(shè)置屬性的值的方法(setId方法名)

m.invoke(obj,new Object[]{"admin"}); //調(diào)用方法實(shí)體類(lèi),參數(shù))

m = c.getMethod("getId",new Class[]{}); //這里是里獲取屬性的值

m.invoke(obj,new Object []{});

}

}

Java語(yǔ)言寫(xiě)段簡(jiǎn)單,但又有技術(shù)含量的即時(shí)通訊代碼,不勝感激之情溢于滿天下

這里有一個(gè)簡(jiǎn)單的模擬通訊 要先運(yùn)行服務(wù)器端 再運(yùn)行客戶端 否則會(huì)報(bào)錯(cuò):

服務(wù)器端代碼:

package?com.test3;

import?java.net.*;

import?java.io.*;

import?javax.swing.*;

import?java.awt.*;

import?java.awt.event.*;

public?class?Server2?extends?JFrame?implements?ActionListener?,?KeyListener?{

JTextArea?jta=null;

JScrollPane?jsp=null;

JTextField?jtf=null;

JButton?jb=null;

JPanel?jp=null;

InputStreamReader?isr=null;

BufferedReader?br=null;

PrintWriter?pw=null;

Socket?s;

String?jtatext="";

public?static?void?main(String[]?args)?{

//?TODO?Auto-generated?method?stub

Server2?sv2=new?Server2();

}

public?Server2(){

jta=new?JTextArea();

jta.setEditable(false);

jsp=new?JScrollPane(jta);

jtf=new?JTextField(10);

jtf.addKeyListener(this);

jb=new?JButton("發(fā)送");

jb.addActionListener(this);

jp=new?JPanel();

jp.add(jtf);

jp.add(jb);

this.add(jsp,"Center");

this.add(jp,"South");

this.setSize(300,300);

this.setLocationRelativeTo(this);

this.setTitle("服務(wù)器端");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

try{

ServerSocket?ss=new?ServerSocket(9999);

s=ss.accept();

isr=new?InputStreamReader(s.getInputStream());

br=new?BufferedReader(isr);

pw=new?PrintWriter(s.getOutputStream(),true);

while(true){

String?info=br.readLine();

jta.append("客戶端對(duì)服務(wù)器說(shuō):???"+info+"\r\n");

// this.jta.setText(jtatext);

}

}catch(Exception?e){

e.printStackTrace();

}

}

@Override

public?void?actionPerformed(ActionEvent?e)?{

if(e.getSource()==jb){

try?{

pw.println(jtf.getText());

jta.append("服務(wù)器對(duì)客戶端說(shuō):???"+jtf.getText()+"\r\n");

// jta.setText(jtatext);

jtf.setText("");

}?catch?(Exception?e1)?{

//?TODO?Auto-generated?catch?block

e1.printStackTrace();

}

}

}

@Override

public?void?keyTyped(KeyEvent?e)?{}

@Override

public?void?keyPressed(KeyEvent?e)?{

if(e.getKeyCode()==KeyEvent.VK_ENTER){

try?{

pw.println(jtf.getText());

jta.append("服務(wù)器對(duì)客戶端說(shuō):???"+jtf.getText()+"\r\n");

jtf.setText("");

}?catch?(Exception?e1)?{

e1.printStackTrace();

}

}

}

@Override

public?void?keyReleased(KeyEvent?e)?{}

}

客戶端代碼:

package?com.test3;

import?java.net.*;

import?java.io.*;

import?javax.swing.*;

import?java.awt.*;

import?java.awt.event.*;

public?class?Client2?extends?JFrame?implements?ActionListener?,KeyListener?{

JTextArea?jta=null;

JScrollPane?jsp=null;

JTextField?jtf=null;

JButton?jb=null;

JPanel?jp=null;

String?jtatext="";

Socket?s;

PrintWriter?pw=null;

InputStreamReader?isr=null;

BufferedReader?br=null;

public?static?void?main(String[]?args)?{

//?TODO?Auto-generated?method?stub

Client2?sv2=new?Client2();

}

public?Client2(){

jta=new?JTextArea();

jta.setEditable(false);

jsp=new?JScrollPane(jta);

jtf=new?JTextField(10);

jtf.addKeyListener(this);

jb=new?JButton("發(fā)送");

jb.addActionListener(this);

jp=new?JPanel();

jp.add(jtf);

jp.add(jb);

this.add(jsp,"Center");

this.add(jp,"South");

this.setSize(300,300);

this.setLocationRelativeTo(this);

this.setTitle("客戶端");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

try?{

?s=new?Socket("127.3.3.3",9999);

?isr=new?InputStreamReader(s.getInputStream());

?br=new?BufferedReader(isr);

?pw=new?PrintWriter(s.getOutputStream(),true);

?

?while(true){

?String?info=br.readLine();?

jta.append("服務(wù)器對(duì)客戶端說(shuō):???"+info+"\r\n");

?

?}

}?catch?(Exception?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

}

@Override

public?void?actionPerformed(ActionEvent?e)?{

if(e.getSource()==jb){

try?{

pw.println(this.jtf.getText());

jta.append("客戶端對(duì)服務(wù)器說(shuō):???"+jtf.getText()+"\r\n");

jtf.setText("");

}?catch?(Exception?e1)?{

//?TODO?Auto-generated?catch?block

e1.printStackTrace();

}

}

}

public?void?keyTyped(KeyEvent?e)?{}

public?void?keyPressed(KeyEvent?e)?{

if(e.getKeyCode()==KeyEvent.VK_ENTER){

try?{

pw.println(this.jtf.getText());

jta.append("客戶端對(duì)服務(wù)器說(shuō):???"+jtf.getText()+"\r\n");

jtf.setText("");

}?catch?(Exception?e1)?{

//?TODO?Auto-generated?catch?block

e1.printStackTrace();

}

}

}

public?void?keyReleased(KeyEvent?e)?{}

}

找高手幫我翻譯這個(gè)JAVA拼圖游戲代碼(希望能幫我解析每句中用到的JAVA技術(shù))

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Choice;

import java.awt.Color;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

//以上均引用不同的package內(nèi)的類(lèi)

public class MyMainFrame extends JFrame implements ActionListener {//MyMainFrame類(lèi)extends “JFrame”類(lèi)實(shí)現(xiàn) ActionListener的方法

MyCanvas myCanvas; //初始化對(duì)象MyCanvas類(lèi)

JPanel panelNorth,panelPreview;//定義上方的面板,及預(yù)覽所需的面板

Button start,preview,set;//定義開(kāi)始,預(yù)覽,設(shè)定按鈕

Container container;//容器,得到內(nèi)容面板

public MyMainFrame() {//初使化

container=this.getContentPane(); //得到當(dāng)前對(duì)象的ContentPane,并且把它賦給container

start=new Button("開(kāi)始");//創(chuàng)建并初始新的Button(按鈕)對(duì)象,賦給start

start.addActionListener(this); //在這個(gè)按鈕對(duì)象中添加監(jiān)聽(tīng)器,范圍是當(dāng)前對(duì)象

preview=new Button("預(yù)覽");//同上,創(chuàng)建新的Button對(duì)象。。。。。

preview.addActionListener(this);//同上。。。。。

set = new Button("設(shè)置"); //同上。。。。。(感覺(jué)代碼都差不多吧?呵呵)

set.addActionListener(this);//同上

panelPreview=new JPanel(); 創(chuàng)建新的JPanel(面板)對(duì)象

panelPreview.setLayout(null); //設(shè)置面板對(duì)象的布局為空

Icon icon=new ImageIcon("pic/pic_"+MyCanvas.pictureID+".jpg"); //創(chuàng)建并初始新的圖標(biāo)對(duì)象。圖標(biāo)的圖片路徑是pic目錄下的pic與通過(guò)MyCanvas.pictureId取得字符串再與.jpg合并后的名稱(chēng)。例如(pic/pic_1234.jsp)

JLabel label=new JLabel(icon); //定義新的JLable(java標(biāo)簽),并初始

label.setBounds(0,0,300,300); //設(shè)置標(biāo)簽的范圍(長(zhǎng)x軸,寬y軸,長(zhǎng)多,寬多少)

panelPreview.add(label); //面板對(duì)象中添加label這個(gè)對(duì)象

panelNorth=new JPanel(); //定義新的JPanel

panelNorth.setBackground(Color.red); //設(shè)置JPanel的背景色

panelNorth.add(start); //Jpanel加入按鈕

panelNorth.add(preview); //同上

panelNorth.add(set); //同上

myCanvas=new MyCanvas(); //實(shí)例化MyCanvas

container.add(myCanvas,BorderLayout.CENTER);//在容器(前邊定義好了這個(gè)對(duì)象)中添加myCanvas,設(shè)置它的布局為居中

container.add(panelNorth,BorderLayout.NORTH);//添加Jpanel,布局為北(也就是上)

this.setTitle("拼圖小游戲-"); //設(shè)置這個(gè)對(duì)象的題目叫。。。。。

this.setLocation(300,200); //設(shè)置它的初始位置

this.setSize(308,365); //設(shè)置大小

this.setResizable(false); //設(shè)置是否可以改變窗口的大小(否)

this.setVisible(true); //是否可以顯示(是)

this.setDefaultCloseOperation(3); //(swt和swing本人用的少)這個(gè)好像是按鈕的初始樣式是哪種吧。自己改下

}

public static void main(String[] args) {//類(lèi)進(jìn)口,也就是主程序的進(jìn)口

// TODO 自動(dòng)生成方法存根

new MyMainFrame(); //實(shí)例化主框架

}

public void actionPerformed(ActionEvent arg0) {//對(duì)三個(gè)按鈕事件的處理

// TODO 自動(dòng)生成方法存根

Button button=(Button)arg0.getSource(); //取得通過(guò)監(jiān)聽(tīng)得到的動(dòng)作時(shí)間對(duì)象的源(getSource具體得到的是啥,我也不太清楚)

if(button==start){ //判斷。如果監(jiān)聽(tīng)到的是按start按鈕

myCanvas.Start(); //啟動(dòng)myCanvas

}else if(button==preview){ //如果是preview按鈕

if(button.getLabel()=="預(yù)覽"){ //如果按鈕的標(biāo)簽是"預(yù)覽"

container.remove(myCanvas); //容器銷(xiāo)毀myCanvas

container.add(panelPreview); //然后容器添加panelPreview對(duì)象

panelPreview.updateUI(); //panelPreview對(duì)象的upDateUI方法

container.repaint(); //調(diào)用容器重新畫(huà)圖的命令

button.setLabel("返回"); //標(biāo)簽設(shè)置成"返回"

}else{ //如果以上兩個(gè)if都不是,執(zhí)行下邊的語(yǔ)句

container.remove(panelPreview); //cantainer銷(xiāo)毀p....這個(gè)對(duì)象

container.add(myCanvas); //添加m...這個(gè)對(duì)象

container.repaint(); //容器重新畫(huà)圖

button.setLabel("預(yù)覽"); //設(shè)置標(biāo)簽名稱(chēng)為"預(yù)覽"

}

}else if(button==set){//修改所選圖片 //如果間聽(tīng)到的是按set這個(gè)鍵的時(shí)候

Choice pic = new Choice(); //Choice實(shí)例化對(duì)象(這個(gè)是啥類(lèi),我也不知道,名字上看是選擇?)

pic.add("小貓"); //添加小貓

pic.add("小豬"); //添加小豬

pic.add("云"); //添加云

pic.add("QQ"); //添加qq

pic.add("卡通"); //添加卡通

pic.add("花"); //花

int i=JOptionPane.showConfirmDialog(this, pic, "選擇圖片", JOptionPane.OK_CANCEL_OPTION);//定義一個(gè)int類(lèi)型的對(duì)象i,賦值成后邊的那些

if(i==JOptionPane.YES_OPTION){ //如果對(duì)象i與JOptionPane對(duì)象的YES...相等,則執(zhí)行下列代碼

MyCanvas.pictureID=pic.getSelectedIndex()+1; //MyC....這個(gè)類(lèi)的pic...這個(gè)屬性等于pic.get......這個(gè)方法的結(jié)果+1

myCanvas.reLoadPictrue(); //myCanvas對(duì)象重新讀取圖片

Icon icon=new ImageIcon("pic/pic_"+MyCanvas.pictureID+".jpg"); //定義新的圖標(biāo)對(duì)象

JLabel label=new JLabel(icon); //初始新的標(biāo)簽(標(biāo)簽中加入圖標(biāo))

label.setBounds(0,0,300,300); //標(biāo)簽設(shè)置范圍

panelPreview.removeAll(); //調(diào)用pane....對(duì)象的remo...方法

panelPreview.add(label); //對(duì)象pan...調(diào)用add方法

panelPreview.repaint(); //調(diào)用。。。。對(duì)象重新畫(huà)的方法

}

}

}

}

------------------------

不太熟悉java的swt和swing,自己改下吧

Java代碼優(yōu)化有哪些常用的方法

1、 盡量指定類(lèi)的final修飾符 帶有final修飾符的類(lèi)是不可派生的。

在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String。為String類(lèi)指定final防止了人們覆蓋length()方法。另外,如果指定一個(gè)類(lèi)為final,則該類(lèi)所有的方法都是final。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高50% 。

2、 盡量重用對(duì)象。

特別是String 對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)用StringBuffer 代替。由于系統(tǒng)不僅要花時(shí)間生成對(duì)象,以后可能還需花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理。因此,生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。

3、 盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。

其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴(lài)于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。請(qǐng)參見(jiàn)《盡可能使用堆棧變量》。

4、 不要重復(fù)初始化變量

默認(rèn)情況下,調(diào)用類(lèi)的構(gòu)造函數(shù)時(shí), Java會(huì)把變量初始化成確定的值:所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個(gè)類(lèi)從另一個(gè)類(lèi)派生時(shí),這一點(diǎn)尤其應(yīng)該注意,因?yàn)橛胣ew關(guān)鍵詞創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。

5、 在JAVA + ORACLE 的應(yīng)用系統(tǒng)開(kāi)發(fā)中,java中內(nèi)嵌的SQL語(yǔ)句盡量使用大寫(xiě)的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。

6、 Java 編程過(guò)程中,進(jìn)行數(shù)據(jù)庫(kù)連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,即使關(guān)閉以釋放資源。

因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開(kāi)銷(xiāo),稍有不慎,會(huì)導(dǎo)致嚴(yán)重的后果。

7、 由于JVM的有其自身的GC機(jī)制,不需要程序開(kāi)發(fā)者的過(guò)多考慮,從一定程度上減輕了開(kāi)發(fā)者負(fù)擔(dān),但同時(shí)也遺漏了隱患,過(guò)分的創(chuàng)建對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存,嚴(yán)重時(shí)會(huì)導(dǎo)致內(nèi)存泄露,因此,保證過(guò)期對(duì)象的及時(shí)回收具有重要意義。

JVM回收垃圾的條件是:對(duì)象不在被引用;然而,JVM的GC并非十分的機(jī)智,即使對(duì)象滿足了垃圾回收的條件也不一定會(huì)被立即回收。所以,建議我們?cè)趯?duì)象使用完畢,應(yīng)手動(dòng)置成null。

8、 在使用同步機(jī)制時(shí),應(yīng)盡量使用方法同步代替代碼塊同步。

9、 盡量減少對(duì)變量的重復(fù)計(jì)算

例如:for(int i = 0;i list.size; i ++) {

}

應(yīng)替換為:

for(int i = 0,int len = list.size();i len; i ++){

}

10、盡量采用lazy loading 的策略,即在需要的時(shí)候才開(kāi)始創(chuàng)建。

例如: String str = “aaa”;

if(i == 1) {

list.add(str);

}

應(yīng)替換為:

if(i == 1) {

String str = “aaa”;

list.add(str);

}

11、慎用異常

異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。 異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。

12、不要在循環(huán)中使用:

Try {

} catch() {

}

應(yīng)把其放置在最外層。

13、StringBuffer 的使用:

StringBuffer表示了可變的、可寫(xiě)的字符串。

有三個(gè)構(gòu)造方法 :

StringBuffer (); //默認(rèn)分配16個(gè)字符的空間

StringBuffer (int size); //分配size個(gè)字符的空間

StringBuffer (String str); //分配16個(gè)字符+str.length()個(gè)字符空間

你可以通過(guò)StringBuffer的構(gòu)造函數(shù)來(lái)設(shè)定它的初始化容量,這樣可以明顯地提升性能。

這里提到的構(gòu)造函數(shù)是StringBuffer(int length),length參數(shù)表示當(dāng)前的StringBuffer能保持的字符數(shù)量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對(duì)象創(chuàng)建之后設(shè)置它的容量。首先我們看看StringBuffer的缺省行為,然后再找出一條更好的提升性能的途徑。

StringBuffer在內(nèi)部維護(hù)一個(gè)字符數(shù)組,當(dāng)你使用缺省的構(gòu)造函數(shù)來(lái)創(chuàng)建StringBuffer對(duì)象的時(shí)候,因?yàn)闆](méi)有設(shè)置初始化字符長(zhǎng)度,StringBuffer的容量被初始化為16個(gè)字符,也就是說(shuō)缺省容量就是16個(gè)字符。當(dāng)StringBuffer達(dá)到最大容量的時(shí)候,它會(huì)將自身容量增加到當(dāng)前的2倍再加2,也就是(2*舊值+2)。如果你使用缺省值,初始化之后接著往里面追加字符,在你追加到第16個(gè)字符的時(shí)候它會(huì)將容量增加到34(2*16+2),當(dāng)追加到34個(gè)字符的時(shí)候就會(huì)將容量增加到70(2*34+2)。無(wú)論何事只要StringBuffer到達(dá)它的最大容量它就不得不創(chuàng)建一個(gè)新的字符數(shù)組然后重新將舊字符和新字符都拷貝一遍――這也太昂貴了點(diǎn)。所以總是給StringBuffer設(shè)置一個(gè)合理的初始化容量值是錯(cuò)不了的,這樣會(huì)帶來(lái)立竿見(jiàn)影的性能增益。StringBuffer初始化過(guò)程的調(diào)整的作用由此可見(jiàn)一斑。所以,使用一個(gè)合適的容量值來(lái)初始化StringBuffer永遠(yuǎn)都是一個(gè)最佳的建議。

14、合理的使用Java類(lèi) java.util.Vector。

簡(jiǎn)單地說(shuō),一個(gè)Vector就是一個(gè)java.lang.Object實(shí)例的數(shù)組。Vector與數(shù)組相似,它的元素可以通過(guò)整數(shù)形式的索引訪問(wèn)。但是,Vector類(lèi)型的對(duì)象在創(chuàng)建之后,對(duì)象的大小能夠根據(jù)元素的增加或者刪除而擴(kuò)展、縮小。請(qǐng)考慮下面這個(gè)向Vector加入元素的例子:

Object bj = new Object();

Vector v = new Vector(100000);

for(int I=0;

I100000; I++) { v.add(0,obj); }

除非有絕對(duì)充足的理由要求每次都把新元素插入到Vector的前面,否則上面的代碼對(duì)性能不利。在默認(rèn)構(gòu)造函數(shù)中,Vector的初始存儲(chǔ)能力是10個(gè)元素,如果新元素加入時(shí)存儲(chǔ)能力不足,則以后存儲(chǔ)能力每次加倍。Vector類(lèi)就對(duì)象StringBuffer類(lèi)一樣,每次擴(kuò)展存儲(chǔ)能力時(shí),所有現(xiàn)有的元素都要復(fù)制到新的存儲(chǔ)空間之中。下面的代碼片段要比前面的例子快幾個(gè)數(shù)量級(jí):

Object bj = new Object();

Vector v = new Vector(100000);

for(int I=0; I100000; I++) { v.add(obj); }

同樣的規(guī)則也適用于Vector類(lèi)的remove()方法。由于Vector中各個(gè)元素之間不能含有“空隙”,刪除除最后一個(gè)元素之外的任意其他元素都導(dǎo)致被刪除元素之后的元素向前移動(dòng)。也就是說(shuō),從Vector刪除最后一個(gè)元素要比刪除第一個(gè)元素“開(kāi)銷(xiāo)”低好幾倍。

假設(shè)要從前面的Vector刪除所有元素,我們可以使用這種代碼:

for(int I=0; I100000; I++)

{

v.remove(0);

}

但是,與下面的代碼相比,前面的代碼要慢幾個(gè)數(shù)量級(jí):

for(int I=0; I100000; I++)

{

v.remove(v.size()-1);

}

從Vector類(lèi)型的對(duì)象v刪除所有元素的最好方法是:

v.removeAllElements();

假設(shè)Vector類(lèi)型的對(duì)象v包含字符串“Hello”??紤]下面的代碼,它要從這個(gè)Vector中刪除“Hello”字符串:

String s = "Hello";

int i = v.indexOf(s);

if(I != -1) v.remove(s);

這些代碼看起來(lái)沒(méi)什么錯(cuò)誤,但它同樣對(duì)性能不利。在這段代碼中,indexOf()方法對(duì)v進(jìn)行順序搜索尋找字符串“Hello”,remove(s)方法也要進(jìn)行同樣的順序搜索。改進(jìn)之后的版本是:

String s = "Hello";

int i = v.indexOf(s);

if(I != -1) v.remove(i);

這個(gè)版本中我們直接在remove()方法中給出待刪除元素的精確索引位置,從而避免了第二次搜索。一個(gè)更好的版本是:

String s = "Hello"; v.remove(s);

最后,我們?cè)賮?lái)看一個(gè)有關(guān)Vector類(lèi)的代碼片段:

for(int I=0; I++;I v.length)

如果v包含100,000個(gè)元素,這個(gè)代碼片段將調(diào)用v.size()方法100,000次。雖然size方法是一個(gè)簡(jiǎn)單的方法,但它仍舊需要一次方法調(diào)用的開(kāi)銷(xiāo),至少JVM需要為它配置以及清除堆棧環(huán)境。在這里,for循環(huán)內(nèi)部的代碼不會(huì)以任何方式修改Vector類(lèi)型對(duì)象v的大小,因此上面的代碼最好改寫(xiě)成下面這種形式:

int size = v.size(); for(int I=0; I++;Isize)

雖然這是一個(gè)簡(jiǎn)單的改動(dòng),但它仍舊贏得了性能。畢竟,每一個(gè)CPU周期都是寶貴的。

15、當(dāng)復(fù)制大量數(shù)據(jù)時(shí),使用System.arraycopy()命令。

int[] src={1,3,5,6,7,8};

int[] dest = new int[6];

System.arraycopy(src, 0, dest, 0, 6);

src:源數(shù)組; srcPos:源數(shù)組要復(fù)制的起始位置;

dest:目的數(shù)組; destPos:目的數(shù)組放置的起始位置;

length:復(fù)制的長(zhǎng)度.

注意:src and dest都必須是同類(lèi)型或者可以進(jìn)行轉(zhuǎn)換類(lèi)型的數(shù)組.

16、代碼重構(gòu):增強(qiáng)代碼的可讀性。

public class ShopCart {

private List carts ;

public void add (Object item) {

if(carts == null) {

carts = new ArrayList();

}

crts.add(item);

}

public void remove(Object item) {

if(carts. contains(item)) {

carts.remove(item);

}

}

public List getCarts() {

//返回只讀列表

return Collections.unmodifiableList(carts);

}

//不推薦這種方式

//this.getCarts().add(item);

}

17、不用new關(guān)鍵詞創(chuàng)建類(lèi)的實(shí)例

用new關(guān)鍵詞創(chuàng)建類(lèi)的實(shí)例時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。但如果一個(gè)對(duì)象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會(huì)調(diào)用任何類(lèi)構(gòu)造函數(shù)。

在使用設(shè)計(jì)模式(Design Pattern)的場(chǎng)合,如果用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)例非常簡(jiǎn)單。例如,下面是Factory模式的一個(gè)典型實(shí)現(xiàn):

public static Credit getNewCredit() {

return new Credit();

}

改進(jìn)后的代碼使用clone()方法,如下所示:

private static Credit BaseCredit = new Credit();

public static Credit getNewCredit() {

return (Credit) BaseCredit.clone();

}

上面的思路對(duì)于數(shù)組處理同樣很有用。

18、乘法和除法

考慮下面的代碼:

for (val = 0; val 100000; val +=5) {

alterX = val * 8; myResult = val * 2;

}

用移位操作替代乘法操作可以極大地提高性能。下面是修改后的代碼:

for (val = 0; val 100000; val += 5) {

alterX = val 3; myResult = val 1;

}

修改后的代碼不再做乘以8的操作,而是改用等價(jià)的左移3位操作,每左移1位相當(dāng)于乘以2。相應(yīng)地,右移1位操作相當(dāng)于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

19、在JSP頁(yè)面中關(guān)閉無(wú)用的會(huì)話。

一個(gè)常見(jiàn)的誤解是以為session在有客戶端訪問(wèn)時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才被創(chuàng)建,注意如果JSP沒(méi)有顯示的使用 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語(yǔ)句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對(duì)象的來(lái)歷。由于session會(huì)消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。

對(duì)于那些無(wú)需跟蹤會(huì)話狀態(tài)的頁(yè)面,關(guān)閉自動(dòng)創(chuàng)建的會(huì)話可以節(jié)省一些資源。使用如下page指令:%@ page session="false"%

20、JDBC與I/O

如果應(yīng)用程序需要訪問(wèn)一個(gè)規(guī)模很大的數(shù)據(jù)集,則應(yīng)當(dāng)考慮使用塊提取方式。默認(rèn)情況下,JDBC每次提取32行數(shù)據(jù)。舉例來(lái)說(shuō),假設(shè)我們要遍歷一個(gè)5000行的記錄集,JDBC必須調(diào)用數(shù)據(jù)庫(kù)157次才能提取到全部數(shù)據(jù)。如果把塊大小改成512,則調(diào)用數(shù)據(jù)庫(kù)的次數(shù)將減少到10次。

21、Servlet與內(nèi)存使用

許多開(kāi)發(fā)者隨意地把大量信息保存到用戶會(huì)話之中。一些時(shí)候,保存在會(huì)話中的對(duì)象沒(méi)有及時(shí)地被垃圾回收機(jī)制回收。從性能上看,典型的癥狀是用戶感到系統(tǒng)周期性地變慢,卻又不能把原因歸于任何一個(gè)具體的組件。如果監(jiān)視JVM的堆空間,它的表現(xiàn)是內(nèi)存占用不正常地大起大落。

解決這類(lèi)內(nèi)存問(wèn)題主要有二種辦法。第一種辦法是,在所有作用范圍為會(huì)話的Bean中實(shí)現(xiàn)HttpSessionBindingListener接口。這樣,只要實(shí)現(xiàn)valueUnbound()方法,就可以顯式地釋放Bean使用的資源。

另外一種辦法就是盡快地把會(huì)話作廢。大多數(shù)應(yīng)用服務(wù)器都有設(shè)置會(huì)話作廢間隔時(shí)間的選項(xiàng)。另外,也可以用編程的方式調(diào)用會(huì)話的setMaxInactiveInterval()方法,該方法用來(lái)設(shè)定在作廢會(huì)話之前,Servlet容器允許的客戶請(qǐng)求的最大間隔時(shí)間,以秒計(jì)。

22、使用緩沖標(biāo)記

一些應(yīng)用服務(wù)器加入了面向JSP的緩沖標(biāo)記功能。例如,BEA的WebLogic Server從6.0版本開(kāi)始支持這個(gè)功能,Open Symphony工程也同樣支持這個(gè)功能。JSP緩沖標(biāo)記既能夠緩沖頁(yè)面片斷,也能夠緩沖整個(gè)頁(yè)面。當(dāng)JSP頁(yè)面執(zhí)行時(shí),如果目標(biāo)片斷已經(jīng)在緩沖之中,則生成該片斷的代碼就不用再執(zhí)行。頁(yè)面級(jí)緩沖捕獲對(duì)指定URL的請(qǐng)求,并緩沖整個(gè)結(jié)果頁(yè)面。對(duì)于購(gòu)物籃、目錄以及門(mén)戶網(wǎng)站的主頁(yè)來(lái)說(shuō),這個(gè)功能極其有用。對(duì)于這類(lèi)應(yīng)用,頁(yè)面級(jí)緩沖能夠保存頁(yè)面執(zhí)行的結(jié)果,供后繼請(qǐng)求使用。

23、選擇合適的引用機(jī)制

在典型的JSP應(yīng)用系統(tǒng)中,頁(yè)頭、頁(yè)腳部分往往被抽取出來(lái),然后根據(jù)需要引入頁(yè)頭、頁(yè)腳。當(dāng)前,在JSP頁(yè)面中引入外部資源的方法主要有兩種:include指令,以及include動(dòng)作。

include指令:例如%@ include file="copyright.html" %。該指令在編譯時(shí)引入指定的資源。在編譯之前,帶有include指令的頁(yè)面和指定的資源被合并成一個(gè)文件。被引用的外部資源在編譯時(shí)就確定,比運(yùn)行時(shí)才確定資源更高效。

include動(dòng)作:例如jsp:include page="copyright.jsp" /。該動(dòng)作引入指定頁(yè)面執(zhí)行后生成的結(jié)果。由于它在運(yùn)行時(shí)完成,因此對(duì)輸出結(jié)果的控制更加靈活。但時(shí),只有當(dāng)被引用的內(nèi)容頻繁地改變時(shí),或者在對(duì)主頁(yè)面的請(qǐng)求沒(méi)有出現(xiàn)之前,被引用的頁(yè)面無(wú)法確定時(shí),使用include動(dòng)作才合算。

24、及時(shí)清除不再需要的會(huì)話

為了清除不再活動(dòng)的會(huì)話,許多應(yīng)用服務(wù)器都有默認(rèn)的會(huì)話超時(shí)時(shí)間,一般為30分鐘。當(dāng)應(yīng)用服務(wù)器需要保存更多會(huì)話時(shí),如果內(nèi)存容量不足,操作系統(tǒng)會(huì)把部分內(nèi)存數(shù)據(jù)轉(zhuǎn)移到磁盤(pán),應(yīng)用服務(wù)器也可能根據(jù)“最近最頻繁使用”(Most Recently Used)算法把部分不活躍的會(huì)話轉(zhuǎn)儲(chǔ)到磁盤(pán),甚至可能拋出“內(nèi)存不足”異常。在大規(guī)模系統(tǒng)中,串行化會(huì)話的代價(jià)是很昂貴的。當(dāng)會(huì)話不再需要時(shí),應(yīng)當(dāng)及時(shí)調(diào)用HttpSession.invalidate()方法清除會(huì)話。HttpSession.invalidate()方法通常可以在應(yīng)用的退出頁(yè)面調(diào)用。

25、不要將數(shù)組聲明為:public static final 。

26、HashMap的遍歷效率討論

經(jīng)常遇到對(duì)HashMap中的key和value值對(duì)的遍歷操作,有如下兩種方法:

MapString, String[] paraMap = new HashMapString, String[]();

//第一個(gè)循環(huán)

SetString appFieldDefIds = paraMap.keySet();

for (String appFieldDefId : appFieldDefIds) {

String[] values = paraMap.get(appFieldDefId);

......

}

//第二個(gè)循環(huán)

for(EntryString, String[] entry : paraMap.entrySet()){

String appFieldDefId = entry.getKey();

String[] values = entry.getValue();

.......

}

第一種實(shí)現(xiàn)明顯的效率不如第二種實(shí)現(xiàn)。

分析如下 SetString appFieldDefIds = paraMap.keySet(); 是先從HashMap中取得keySet

代碼如下:

public SetK keySet() {

SetK ks = keySet;

return (ks != null ? ks : (keySet = new KeySet()));

}

private class KeySet extends AbstractSetK {

public IteratorK iterator() {

return newKeyIterator();

}

public int size() {

return size;

}

public boolean contains(Object o) {

return containsKey(o);

}

public boolean remove(Object o) {

return HashMap.this.removeEntryForKey(o) != null;

}

public void clear() {

HashMap.this.clear();

}

}

其實(shí)就是返回一個(gè)私有類(lèi)KeySet, 它是從AbstractSet繼承而來(lái),實(shí)現(xiàn)了Set接口。

再來(lái)看看for/in循環(huán)的語(yǔ)法

for(declaration : expression)

statement

在執(zhí)行階段被翻譯成如下各式

for(IteratorE #i = (expression).iterator(); #i.hashNext();){

declaration = #i.next();

statement

}

因此在第一個(gè)for語(yǔ)句for (String appFieldDefId : appFieldDefIds) 中調(diào)用了HashMap.keySet().iterator()

而這個(gè)方法調(diào)用了newKeyIterator()

IteratorK newKeyIterator() {

return new KeyIterator();

}

private class KeyIterator extends HashIteratorK {

public K next() {

return nextEntry().getKey();

}

}

所以在for中還是調(diào)用了

在第二個(gè)循環(huán)for(EntryString, String[] entry : paraMap.entrySet())中使用的Iterator是如下的一個(gè)內(nèi)部

類(lèi)

private class EntryIterator extends HashIteratorMap.EntryK,V {

public Map.EntryK,V next() {

return nextEntry();

}

}

此時(shí)第一個(gè)循環(huán)得到key,第二個(gè)循環(huán)得到HashMap的Entry效率就是從循環(huán)里面體現(xiàn)出來(lái)的第二個(gè)循環(huán)此致可以直接取key和value值而第一個(gè)循環(huán)還是得再利用HashMap的get(Object key)來(lái)取value值現(xiàn)在看看HashMap的get(Object key)方法

public V get(Object key) {

Object k = maskNull(key);

int hash = hash(k);

int i = indexFor(hash, table.length); //Entry[] table

EntryK,V e = table;

while (true) {

if (e == null)

return null;

if (e.hash == hash eq(k, e.key))

return e.value;

e = e.next;

}

}

其實(shí)就是再次利用Hash值取出相應(yīng)的Entry做比較得到結(jié)果,所以使用第一中循環(huán)相當(dāng)于兩次進(jìn)入HashMap的Entry

中而第二個(gè)循環(huán)取得Entry的值之后直接取key和value,效率比第一個(gè)循環(huán)高。其實(shí)按照Map的概念來(lái)看也應(yīng)該是用第二個(gè)循環(huán)好一點(diǎn),它本來(lái)就是key和value的值對(duì),將key和value分開(kāi)操作在這里不是個(gè)好選擇。

27、array(數(shù)組) 和 ArryList的使用

array([]):最高效;但是其容量固定且無(wú)法動(dòng)態(tài)改變;

ArrayList:容量可動(dòng)態(tài)增長(zhǎng);但犧牲效率;

基于效率和類(lèi)型檢驗(yàn),應(yīng)盡可能使用array,無(wú)法確定數(shù)組大小時(shí)才使用ArrayList!

ArrayList是Array的復(fù)雜版本

ArrayList內(nèi)部封裝了一個(gè)Object類(lèi)型的數(shù)組,從一般的意義來(lái)說(shuō),它和數(shù)組沒(méi)有本質(zhì)的差別,甚至于ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內(nèi)部數(shù)組的基礎(chǔ)上直接調(diào)用Array的對(duì)應(yīng)方法。

ArrayList存入對(duì)象時(shí),拋棄類(lèi)型信息,所有對(duì)象屏蔽為Object,編譯時(shí)不檢查類(lèi)型,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。

注:jdk5中加入了對(duì)泛型的支持,已經(jīng)可以在使用ArrayList時(shí)進(jìn)行類(lèi)型檢查。

從這一點(diǎn)上看來(lái),ArrayList與數(shù)組的區(qū)別主要就是由于動(dòng)態(tài)增容的效率問(wèn)題了

28、盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,后者由于使用同步機(jī)制,而導(dǎo)致了性能的開(kāi)銷(xiāo)。

29、StringBuffer 和StringBuilder的區(qū)別:

java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類(lèi)似于 String 的字符串緩沖區(qū),但不能修改。

StringBuilder。與該類(lèi)相比,通常應(yīng)該優(yōu)先使用 java.lang.StringBuilder類(lèi),因?yàn)樗С炙邢嗤牟僮鳎捎谒粓?zhí)行同步,所以速度更快。為了獲得更好的性能,在構(gòu)造 StirngBuffer 或 StirngBuilder 時(shí)應(yīng)盡可能指定它的容量。當(dāng)然,如果你操作的字符串長(zhǎng)度不超過(guò) 16 個(gè)字符就不用了。 相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%-15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。而在現(xiàn)實(shí)的模塊化編程中,負(fù)責(zé)某一模塊的程序員不一定能清晰地判斷該模塊是否會(huì)放入多線程的環(huán)境中運(yùn)行,因此:除非你能確定你的系統(tǒng)的瓶頸是在 StringBuffer 上,并且確定你的模塊不會(huì)運(yùn)行在多線程模式下,否則還是用 StringBuffer 吧。

30、盡量避免使用split

除非是必須的,否則應(yīng)該避免使用split,split由于支持正則表達(dá)式,所以效率比較低,如果是頻繁的幾十,幾百萬(wàn)的調(diào)用將會(huì)耗費(fèi)大量資源,如果確實(shí)需要頻繁的調(diào)用split,可以考慮使用apache的 StringUtils.split(string,char),頻繁split的可以緩存結(jié)果。

其他補(bǔ)充:

1、及時(shí)清除不再使用的對(duì)象,設(shè)為null

2、盡可能使用final,static等關(guān)鍵字

3、盡可能使用buffered對(duì)象

如何優(yōu)化代碼使JAVA源文件及編譯后CLASS文件更小

1 盡量使用繼承,繼承的方法越多,你要寫(xiě)的代碼量也就越少

2 打開(kāi)JAVA編譯器的優(yōu)化選項(xiàng): javac -O 這個(gè)選項(xiàng)將刪除掉CLASS文件中的行號(hào),并能把

一些private, static,final的小段方法申明為inline方法調(diào)用

3 把公用的代碼提取出來(lái)

4 不要初始化很大的數(shù)組,盡管初始化一個(gè)數(shù)組在JAVA代碼中只是一行的代碼量,但

編譯后的代碼是一行代碼插入一個(gè)數(shù)組的元素,所以如果你有大量的數(shù)據(jù)需要存在數(shù)組

中的話,可以先把這些數(shù)據(jù)放在String中,然后在運(yùn)行期把字符串解析到數(shù)組中

5 日期類(lèi)型的對(duì)象會(huì)占用很大的空間,如果你要存儲(chǔ)大量的日期對(duì)象,可以考慮把它存儲(chǔ)為

long型,然后在使用的時(shí)候轉(zhuǎn)換為Date類(lèi)型

6 類(lèi)名,方法名和變量名盡量使用簡(jiǎn)短的名字,可以考慮使用Hashjava, Jobe, Obfuscate and Jshrink等工具自動(dòng)完成這個(gè)工作

7 將static final類(lèi)型的變量定義到Interface中去

8 算術(shù)運(yùn)算 能用左移/右移的運(yùn)算就不要用*和/運(yùn)算,相同的運(yùn)算不要運(yùn)算多次

2. 不要兩次初始化變量

Java通過(guò)調(diào)用獨(dú)特的類(lèi)構(gòu)造器默認(rèn)地初始化變量為一個(gè)已知的值。所有的對(duì)象被設(shè)置成null,integers (byte, short, int, long)被設(shè)置成0,float和double設(shè)置成0.0,Boolean變量設(shè)置成false。這對(duì)那些擴(kuò)展自其它類(lèi)的類(lèi)尤其重要,這跟使用一個(gè)新的關(guān)鍵詞創(chuàng)建一個(gè)對(duì)象時(shí)所有一連串的構(gòu)造器被自動(dòng)調(diào)用一樣。

3. 在任何可能的地方讓類(lèi)為Final

標(biāo)記為final的類(lèi)不能被擴(kuò)展。在《核心Java API》中有大量這個(gè)技術(shù)的例子,諸如java.lang.String。將String類(lèi)標(biāo)記為final阻止了開(kāi)發(fā)者創(chuàng)建他們自己實(shí)現(xiàn)的長(zhǎng)度方法。

更深入點(diǎn)說(shuō),如果類(lèi)是final的,所有類(lèi)的方法也是final的。Java編譯器可能會(huì)內(nèi)聯(lián)所有的方法(這依賴(lài)于編譯器的實(shí)現(xiàn))。在我的測(cè)試?yán)?,我已?jīng)看到性能平均增加了50%。

9. 異常在需要拋出的地方拋出,try catch能整合就整合

try {

some.method1(); // Difficult for javac

} catch( method1Exception e ) { // and the JVM runtime

// Handle exception 1 // to optimize this

} // code

try {

some.method2();

} catch( method2Exception e ) {

// Handle exception 2

}

try {

some.method3();

} catch( method3Exception e ) {

// Handle exception 3

}

已下代碼 更容易被編譯器優(yōu)化

try {

some.method1(); // Easier to optimize

some.method2();

some.method3();

} catch( method1Exception e ) {

// Handle exception 1

} catch( method2Exception e ) {

// Handle exception 2

} catch( method3Exception e ) {

// Handle exception 3

}

10. For循環(huán)的優(yōu)化

Replace…

for( int i = 0; i collection.size(); i++ ) {

...

}

with…

for( int i = 0, n = collection.size(); i n; i++ ) {

...

}

5、 在JAVA + ORACLE 的應(yīng)用系統(tǒng)開(kāi)發(fā)中,java中內(nèi)嵌的SQL語(yǔ)句盡量使用大寫(xiě)的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。

10、盡量采用lazy loading 的策略,即在需要的時(shí)候才開(kāi)始創(chuàng)建。

例如: String str = “aaa”;

if(i == 1) {

list.add(str);

}

應(yīng)替換為:

if(i == 1) {

String str = “aaa”;

list.add(str);

}

12、不要在循環(huán)中使用:

Try {

} catch() {

}

應(yīng)把其放置在最外層

文章名稱(chēng):java技術(shù)代碼 Java開(kāi)發(fā)代碼
標(biāo)題鏈接:http://m.rwnh.cn/article42/dodoiec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站設(shè)計(jì)App設(shè)計(jì)、搜索引擎優(yōu)化、網(wǎng)站制作、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
贡山| 通化县| 马鞍山市| 武城县| 景谷| 荔波县| 沁阳市| 屏边| 漳平市| 额尔古纳市| 大悟县| 甘德县| 蓝山县| 岳阳县| 鄄城县| 芷江| 江油市| 深泽县| 托克托县| 疏附县| 常德市| 台南市| 丰台区| 朔州市| 荔波县| 吐鲁番市| 襄汾县| 三门县| 南京市| 景德镇市| 永宁县| 虹口区| 江孜县| 高青县| 商水县| 昆明市| 万盛区| 崇文区| 丽水市| 修文县| 南皮县|