最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程實(shí)現(xiàn)對(duì)象克?。◤?fù)制)代碼詳解

 更新時(shí)間:2017年11月29日 11:34:31   作者:萌小Q  
這篇文章主要介紹了Java編程實(shí)現(xiàn)對(duì)象克?。◤?fù)制)代碼詳解,涉及了克隆的原因,如何實(shí)現(xiàn)克隆,克隆的一般步驟,深克隆與淺克隆的介紹等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。

克隆,想必大家都有耳聞,世界上第一只克隆羊多莉就是利用細(xì)胞核移植技術(shù)將哺乳動(dòng)物的成年體細(xì)胞培育出新個(gè)體,甚為神奇。其實(shí)在Java中也存在克隆的概念,即實(shí)現(xiàn)對(duì)象的復(fù)制。

本文將嘗試介紹一些關(guān)于Java中的克隆和一些深入的問題,希望可以幫助大家更好地了解克隆。

假如說你想復(fù)制一個(gè)簡單變量。很簡單:

int apples = 5; 
int pears = apples; 

不僅僅是int類型,其它七種原始數(shù)據(jù)類型(boolean,char,byte,short,float,double.long)同樣適用于該類情況。

但是如果你復(fù)制的是一個(gè)對(duì)象,情況就有些復(fù)雜了。

假設(shè)說我是一個(gè)beginner,我會(huì)這樣寫:

class Student { 
  private int number; 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number) { 
    this.number = number; 
  } 
   
} 
public class Test { 
   
  public static void main(String args[]) { 
    Student stu1 = new Student(); 
    stu1.setNumber(12345); 
    Student stu2 = stu1; 
     
    System.out.println("學(xué)生1:" + stu1.getNumber()); 
    System.out.println("學(xué)生2:" + stu2.getNumber()); 
  } 
}

結(jié)果:

學(xué)生1:12345 
學(xué)生2:12345

這里我們自定義了一個(gè)學(xué)生類,該類只有一個(gè)number字段。

我們新建了一個(gè)學(xué)生實(shí)例,然后將該值賦值給stu2實(shí)例。(Student stu2 = stu1;)

再看看打印結(jié)果,作為一個(gè)新手,拍了拍胸腹,對(duì)象復(fù)制不過如此,

難道真的是這樣嗎?

我們?cè)囍淖僺tu2實(shí)例的number字段,再打印結(jié)果看看:

stu2.setNumber(54321); 
 
System.out.println("學(xué)生1:" + stu1.getNumber()); 
System.out.println("學(xué)生2:" + stu2.getNumber()); 

結(jié)果:

學(xué)生1:54321 
學(xué)生2:54321  

這就怪了,為什么改變學(xué)生2的學(xué)號(hào),學(xué)生1的學(xué)號(hào)也發(fā)生了變化呢?

原因出在(stu2 = stu1) 這一句。該語句的作用是將stu1的引用賦值給stu2,

這樣,stu1和stu2指向內(nèi)存堆中同一個(gè)對(duì)象。如圖:

那么,怎樣才能達(dá)到復(fù)制一個(gè)對(duì)象呢?

是否記得萬類之王Object。它有11個(gè)方法,有兩個(gè)protected的方法,其中一個(gè)為clone方法。

在Java中所有的類都是缺省的繼承自Java語言包中的Object類的,查看它的源碼,你可以把你的JDK目錄下的src.zip復(fù)制到其他地方然后解壓,里面就是所有的源碼。發(fā)現(xiàn)里面有一個(gè)訪問限定符為protected的方法clone():

/*
Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object.
The general intent is that, for any object x, the expression:
1) x.clone() != x will be true
2) x.clone().getClass() == x.getClass() will be true, but these are not absolute requirements.
3) x.clone().equals(x) will be true, this is not an absolute requirement.
*/
protected native Object clone() throws CloneNotSupportedException;

仔細(xì)一看,它還是一個(gè)native方法,大家都知道native方法是非Java語言實(shí)現(xiàn)的代碼,供Java程序調(diào)用的,因?yàn)镴ava程序是運(yùn)行在JVM虛擬機(jī)上面的,要想訪問到比較底層的與操作系統(tǒng)相關(guān)的就沒辦法了,只能由靠近操作系統(tǒng)的語言來實(shí)現(xiàn)。

第一次聲明保證克隆對(duì)象將有單獨(dú)的內(nèi)存地址分配。
第二次聲明表明,原始和克隆的對(duì)象應(yīng)該具有相同的類類型,但它不是強(qiáng)制性的。
第三聲明表明,原始和克隆的對(duì)象應(yīng)該是平等的equals()方法使用,但它不是強(qiáng)制性的。

因?yàn)槊總€(gè)類直接或間接的父類都是Object,因此它們都含有clone()方法,但是因?yàn)樵摲椒ㄊ莗rotected,所以都不能在類外進(jìn)行訪問。

要想對(duì)一個(gè)對(duì)象進(jìn)行復(fù)制,就需要對(duì)clone方法覆蓋。

為什么要克???

  大家先思考一個(gè)問題,為什么需要克隆對(duì)象?直接new一個(gè)對(duì)象不行嗎?

  答案是:克隆的對(duì)象可能包含一些已經(jīng)修改過的屬性,而new出來的對(duì)象的屬性都還是初始化時(shí)候的值,所以當(dāng)需要一個(gè)新的對(duì)象來保存當(dāng)前對(duì)象的“狀態(tài)”就靠clone方法了。那么我把這個(gè)對(duì)象的臨時(shí)屬性一個(gè)一個(gè)的賦值給我新new的對(duì)象不也行嘛?可以是可以,但是一來麻煩不說,二來,大家通過上面的源碼都發(fā)現(xiàn)了clone是一個(gè)native方法,就是快啊,在底層實(shí)現(xiàn)的。

  提個(gè)醒,我們常見的Object a=new Object();Object b;b=a;這種形式的代碼復(fù)制的是引用,即對(duì)象在內(nèi)存中的地址,a和b對(duì)象仍然指向了同一個(gè)對(duì)象。

  而通過clone方法賦值的對(duì)象跟原來的對(duì)象時(shí)同時(shí)獨(dú)立存在的。

如何實(shí)現(xiàn)克隆

先介紹一下兩種不同的克隆方法,淺克隆(ShallowClone)和深克隆(DeepClone)。

在Java語言中,數(shù)據(jù)類型分為值類型(基本數(shù)據(jù)類型)和引用類型,值類型包括int、double、byte、boolean、char等簡單數(shù)據(jù)類型,引用類型包括類、接口、數(shù)組等復(fù)雜類型。淺克隆和深克隆的主要區(qū)別在于是否支持引用類型的成員變量的復(fù)制,下面將對(duì)兩者進(jìn)行詳細(xì)介紹。

一般步驟是(淺克?。?/strong>

1. 被復(fù)制的類需要實(shí)現(xiàn)Clonenable接口(不實(shí)現(xiàn)的話在調(diào)用clone方法會(huì)拋出CloneNotSupportedException異常), 該接口為標(biāo)記接口(不含任何方法)

2. 覆蓋clone()方法,訪問修飾符設(shè)為public。方法中調(diào)用super.clone()方法得到需要的復(fù)制對(duì)象。(native為本地方法)

下面對(duì)上面那個(gè)方法進(jìn)行改造:

class Student implements Cloneable{
	private int number;
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	@Override 
	  public Object clone() {
		Student stu = null;
		try{
			stu = (Student)super.clone();
		}
		catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return stu;
	}
}
public class Test {
	public static void main(String args[]) {
		Student stu1 = new Student();
		stu1.setNumber(12345);
		Student stu2 = (Student)stu1.clone();
		System.out.println("學(xué)生1:" + stu1.getNumber());
		System.out.println("學(xué)生2:" + stu2.getNumber());
		stu2.setNumber(54321);
		System.out.println("學(xué)生1:" + stu1.getNumber());
		System.out.println("學(xué)生2:" + stu2.getNumber());
	}
}

結(jié)果:

學(xué)生1:12345 
學(xué)生2:12345 
學(xué)生1:12345 
學(xué)生2:54321

如果你還不相信這兩個(gè)對(duì)象不是同一個(gè)對(duì)象,那么你可以看看這一句:

System.out.println(stu1 == stu2); // false 

上面的復(fù)制被稱為淺克隆。

還有一種稍微復(fù)雜的深度復(fù)制:

我們?cè)趯W(xué)生類里再加一個(gè)Address類。

class Address {
	private String add;
	public String getAdd() {
		return add;
	}
	public void setAdd(String add) {
		this.add = add;
	}
}
class Student implements Cloneable{
	private int number;
	private Address addr;
	public Address getAddr() {
		return addr;
	}
	public void setAddr(Address addr) {
		this.addr = addr;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	@Override 
	  public Object clone() {
		Student stu = null;
		try{
			stu = (Student)super.clone();
		}
		catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return stu;
	}
}
public class Test {
	public static void main(String args[]) {
		Address addr = new Address();
		addr.setAdd("杭州市");
		Student stu1 = new Student();
		stu1.setNumber(123);
		stu1.setAddr(addr);
		Student stu2 = (Student)stu1.clone();
		System.out.println("學(xué)生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());
		System.out.println("學(xué)生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());
	}
}

結(jié)果:

學(xué)生1:123,地址:杭州市 
學(xué)生2:123,地址:杭州市 

乍一看沒什么問題,真的是這樣嗎?

我們?cè)趍ain方法中試著改變addr實(shí)例的地址。

addr.setAdd("西湖區(qū)"); 
 
System.out.println("學(xué)生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd()); 
System.out.println("學(xué)生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd()); 

結(jié)果:

學(xué)生1:123,地址:杭州市 
學(xué)生2:123,地址:杭州市 
學(xué)生1:123,地址:西湖區(qū) 
學(xué)生2:123,地址:西湖區(qū) 

這就奇怪了,怎么兩個(gè)學(xué)生的地址都改變了?

原因是淺復(fù)制只是復(fù)制了addr變量的引用,并沒有真正的開辟另一塊空間,將值復(fù)制后再將引用返回給新對(duì)象。

所以,為了達(dá)到真正的復(fù)制對(duì)象,而不是純粹引用復(fù)制。我們需要將Address類可復(fù)制化,并且修改clone方法,完整代碼如下:

package abc; 
 
class Address implements Cloneable { 
  private String add; 
 
  public String getAdd() { 
    return add; 
  } 
 
  public void setAdd(String add) { 
    this.add = add; 
  } 
   
  @Override 
  public Object clone() { 
    Address addr = null; 
    try{ 
      addr = (Address)super.clone(); 
    }catch(CloneNotSupportedException e) { 
      e.printStackTrace(); 
    } 
    return addr; 
  } 
} 
 
class Student implements Cloneable{ 
  private int number; 
 
  private Address addr; 
   
  public Address getAddr() { 
    return addr; 
  } 
 
  public void setAddr(Address addr) { 
    this.addr = addr; 
  } 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number) { 
    this.number = number; 
  } 
   
  @Override 
  public Object clone() { 
    Student stu = null; 
    try{ 
      stu = (Student)super.clone();  //淺復(fù)制 
    }catch(CloneNotSupportedException e) { 
      e.printStackTrace(); 
    } 
    stu.addr = (Address)addr.clone();  //深度復(fù)制 
    return stu; 
  } 
} 
public class Test { 
   
  public static void main(String args[]) { 
     
    Address addr = new Address(); 
    addr.setAdd("杭州市"); 
    Student stu1 = new Student(); 
    stu1.setNumber(123); 
    stu1.setAddr(addr); 
     
    Student stu2 = (Student)stu1.clone(); 
     
    System.out.println("學(xué)生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd()); 
    System.out.println("學(xué)生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd()); 
     
    addr.setAdd("西湖區(qū)"); 
     
    System.out.println("學(xué)生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd()); 
    System.out.println("學(xué)生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd()); 
  } 
}

結(jié)果:

學(xué)生1:123,地址:杭州市
學(xué)生2:123,地址:杭州市
學(xué)生1:123,地址:西湖區(qū)
學(xué)生2:123,地址:杭州市

這樣結(jié)果就符合我們的想法了。

最后我們可以看看API里其中一個(gè)實(shí)現(xiàn)了clone方法的類:

java.util.Date:

/** 
 * Return a copy of this object. 
 */ 
public Object clone() { 
  Date d = null; 
  try { 
    d = (Date)super.clone(); 
    if (cdate != null) { 
      d.cdate = (BaseCalendar.Date) cdate.clone(); 
    } 
  } catch (CloneNotSupportedException e) {} // Won't happen 
  return d; 
}

該類其實(shí)也屬于深度復(fù)制。

淺克隆和深克隆

1、淺克隆

在淺克隆中,如果原型對(duì)象的成員變量是值類型,將復(fù)制一份給克隆對(duì)象;如果原型對(duì)象的成員變量是引用類型,則將引用對(duì)象的地址復(fù)制一份給克隆對(duì)象,也就是說原型對(duì)象和克隆對(duì)象的成員變量指向相同的內(nèi)存地址。

簡單來說,在淺克隆中,當(dāng)對(duì)象被復(fù)制時(shí)只復(fù)制它本身和其中包含的值類型的成員變量,而引用類型的成員對(duì)象并沒有復(fù)制。

在Java語言中,通過覆蓋Object類的clone()方法可以實(shí)現(xiàn)淺克隆。

2、深克隆

在深克隆中,無論原型對(duì)象的成員變量是值類型還是引用類型,都將復(fù)制一份給克隆對(duì)象,深克隆將原型對(duì)象的所有引用對(duì)象也復(fù)制一份給克隆對(duì)象。

簡單來說,在深克隆中,除了對(duì)象本身被復(fù)制外,對(duì)象所包含的所有成員變量也將復(fù)制。

在Java語言中,如果需要實(shí)現(xiàn)深克隆,可以通過覆蓋Object類的clone()方法實(shí)現(xiàn),也可以通過序列化(Serialization)等方式來實(shí)現(xiàn)。

(如果引用類型里面還包含很多引用類型,或者內(nèi)層引用類型的類里面又包含引用類型,使用clone方法就會(huì)很麻煩。這時(shí)我們可以用序列化的方式來實(shí)現(xiàn)對(duì)象的深克隆。)

序列化就是將對(duì)象寫到流的過程,寫到流中的對(duì)象是原有對(duì)象的一個(gè)拷貝,而原對(duì)象仍然存在于內(nèi)存中。通過序列化實(shí)現(xiàn)的拷貝不僅可以復(fù)制對(duì)象本身,而且可以復(fù)制其引用的成員對(duì)象,因此通過序列化將對(duì)象寫到一個(gè)流中,再從流里將其讀出來,可以實(shí)現(xiàn)深克隆。需要注意的是能夠?qū)崿F(xiàn)序列化的對(duì)象其類必須實(shí)現(xiàn)Serializable接口,否則無法實(shí)現(xiàn)序列化操作。

擴(kuò)展

Java語言提供的Cloneable接口和Serializable接口的代碼非常簡單,它們都是空接口,這種空接口也稱為標(biāo)識(shí)接口,標(biāo)識(shí)接口中沒有任何方法的定義,其作用是告訴JRE這些接口的實(shí)現(xiàn)類是否具有某個(gè)功能,如是否支持克隆、是否支持序列化等。

解決多層克隆問題

如果引用類型里面還包含很多引用類型,或者內(nèi)層引用類型的類里面又包含引用類型,使用clone方法就會(huì)很麻煩。這時(shí)我們可以用序列化的方式來實(shí)現(xiàn)對(duì)象的深克隆。

public class Outer implements Serializable{
 private static final long serialVersionUID = 369285298572941L; //最好是顯式聲明ID
 public Inner inner;
 //Discription:[深度復(fù)制方法,需要對(duì)象及對(duì)象所有的對(duì)象屬性都實(shí)現(xiàn)序列化] 
 public Outer myclone() {
   Outer outer = null;
   try { // 將該對(duì)象序列化成流,因?yàn)閷懺诹骼锏氖菍?duì)象的一個(gè)拷貝,而原對(duì)象仍然存在于JVM里面。所以利用這個(gè)特性可以實(shí)現(xiàn)對(duì)象的深拷貝
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(baos);
     oos.writeObject(this);
      // 將流序列化成對(duì)象
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
     ObjectInputStream ois = new ObjectInputStream(bais);
     outer = (Outer) ois.readObject();
   } catch (IOException e) {
     e.printStackTrace();
   } catch (ClassNotFoundException e) {
     e.printStackTrace();
   }
   return outer;
 }
}

Inner也必須實(shí)現(xiàn)Serializable,否則無法序列化:

public class Inner implements Serializable{
 private static final long serialVersionUID = 872390113109L; //最好是顯式聲明ID
 public String name = "";

 public Inner(String name) {
   this.name = name;
 }

 @Override
 public String toString() {
   return "Inner的name值為:" + name;
 }
}

這樣也能使兩個(gè)對(duì)象在內(nèi)存空間內(nèi)完全獨(dú)立存在,互不影響對(duì)方的值。

總結(jié)

實(shí)現(xiàn)對(duì)象克隆有兩種方式:

  1). 實(shí)現(xiàn)Cloneable接口并重寫Object類中的clone()方法;

  2). 實(shí)現(xiàn)Serializable接口,通過對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆,可以實(shí)現(xiàn)真正的深度克隆。

注意:基于序列化和反序列化實(shí)現(xiàn)的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對(duì)象是否支持序列化,這項(xiàng)檢查是編譯器完成的,不是在運(yùn)行時(shí)拋出異常,這種是方案明顯優(yōu)于使用Object類的clone方法克隆對(duì)象。讓問題在編譯的時(shí)候暴露出來總是優(yōu)于把問題留到運(yùn)行時(shí)。

以上就是本文關(guān)于Java編程實(shí)現(xiàn)對(duì)象克?。◤?fù)制)代碼詳解的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的來朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。

相關(guān)文章

  • SpringBoot2.x集成Dozer的示例代碼

    SpringBoot2.x集成Dozer的示例代碼

    本文主要介紹了SpringBoot2.x集成Dozer的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問題

    MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問題

    這篇文章主要介紹了MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot整合達(dá)夢(mèng)數(shù)據(jù)庫的教程詳解

    SpringBoot整合達(dá)夢(mèng)數(shù)據(jù)庫的教程詳解

    這篇文章主要給大家介紹了SpringBoot整合達(dá)夢(mèng)數(shù)據(jù)庫的詳細(xì)教程,文章中有詳細(xì)的圖片介紹和代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java使用apache?poi操作excel的方式

    Java使用apache?poi操作excel的方式

    這篇文章主要介紹了Java使用apache?poi進(jìn)行excel相關(guān)操作,本文主要針對(duì)Apache?POI對(duì)excel的操作進(jìn)行介紹,主要包括如何創(chuàng)建一個(gè)excel、錄入數(shù)據(jù)、讀取excel數(shù)據(jù)的方式,需要的朋友可以參考下
    2022-05-05
  • java nio中的ByteBuffer擴(kuò)展問題

    java nio中的ByteBuffer擴(kuò)展問題

    這篇文章主要介紹了java nio中的ByteBuffer擴(kuò)展問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MyBatis-Plus攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的示例

    MyBatis-Plus攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的示例

    本文主要介紹了MyBatis-Plus攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 一文了解Spring中攔截器的原理與使用

    一文了解Spring中攔截器的原理與使用

    在web開發(fā)中,攔截器是經(jīng)常用到的功能。它可以幫我們預(yù)先設(shè)置數(shù)據(jù)以及統(tǒng)計(jì)方法的執(zhí)行效率等等。今天就來詳細(xì)的談一下spring中的攔截器,需要的可以參考一下
    2022-06-06
  • springboot整合RabbitMQ發(fā)送短信的實(shí)現(xiàn)

    springboot整合RabbitMQ發(fā)送短信的實(shí)現(xiàn)

    本文會(huì)和SpringBoot做整合,實(shí)現(xiàn)RabbitMQ發(fā)送短信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 詳解IDEA JUnit5測試套件運(yùn)行錯(cuò)誤的問題

    詳解IDEA JUnit5測試套件運(yùn)行錯(cuò)誤的問題

    這篇文章主要介紹了詳解IDEA JUnit5測試套件運(yùn)行錯(cuò)誤的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Activiti流程文件部署過程解析

    Activiti流程文件部署過程解析

    這篇文章主要介紹了Activiti流程文件部署過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

金阳县| 盖州市| 邳州市| 宁晋县| 吉木萨尔县| 延安市| 金湖县| 屏南县| 壤塘县| 洛川县| 遵义县| 陵川县| 武邑县| 灌南县| 巨野县| 固镇县| 福建省| 陈巴尔虎旗| 师宗县| 彝良县| 洛宁县| 新巴尔虎左旗| 改则县| 苗栗县| 鄂托克旗| 班玛县| 呈贡县| 定襄县| 苍溪县| 土默特左旗| 安国市| 湘潭县| 荃湾区| 锡林郭勒盟| 伊吾县| 湖南省| 晋宁县| 精河县| 南溪县| 高雄县| 沛县|