1. 程式人生 > >java 集合 陣列 的深度複製

java 集合 陣列 的深度複製

一.如果集合或陣列,裡面裝的是:
8種基本型別或者它們的包裝類和String,我們使用普通的淺複製就行了
使用 Arrays.copyOf() 或者 new ArrayList(list) 等方法這裡不做程式碼演示很簡單。

二 如果裡面裝的是物件,上邊的淺複製方法就習行不通了。
通常用兩種方法實現深複製:clone() 和 io流複製
第一種:
1.物件實現Cloneable 介面複寫 clone() 方法
程式碼演示如下:
Student類實現了Cloneable介面並複寫clone()方法

public class Student implements Cloneable {

	private String name;

	public Student() {
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	protected Student clone() {
		Student student = null;
		try {
			student = (Student)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return student;
	}
}

測試程式碼:

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

	//被複制陣列
	ArrayList<Student> studentList = new ArrayList<Student>() {
		{
			add(new Student("AAA"));
			add(new Student("BBB"));
		}
	};

	//目標陣列
	ArrayList<Student> targetStudentList = new ArrayList<Student>();
	//呼叫clone方法賦值
	for (Student stu : studentList) {
		targetStudentList.add(stu.clone());
	}

	//現在改變targerStudentList中物件的狀態
	targetStudentList.get(0).setName("NNN");
	targetStudentList.get(1).setName("MMM");

	//檢視2集合中值的變化
	for (Student stu : studentList) {
		System.out.print(stu.getName()+",");
	}
	System.out.println();
	for (Student stu : targetStudentList) {
		System.out.print(stu.getName()+",");
	}
}

輸出結果:

AAA,BBB,
NNN,MMM,

第二種也是比較常見的方法 使用IO流深度複製:

@SuppressWarnings("all")
public static <T> List<T> deepCopy(List<T> src) {
	ObjectOutputStream oos;
	ByteArrayOutputStream bos;
	ByteArrayInputStream bis;
	List<T> resultData = null;
	try {
		bos = new ByteArrayOutputStream();
		oos = new ObjectOutputStream(bos);
		oos.writeObject(src);

		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
		resultData = (List<T>)ois.readObject();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}

	return resultData;
}

呼叫方法:

public static void main(final String[] args) throws IOException, ClassNotFoundException {

	//被複制陣列
	ArrayList<Student> studentList = new ArrayList<Student>() {
		{
			add(new Student("AAA"));
			add(new Student("BBB"));
		}
	};

	List<Student> targetStudentList = deepCopy(studentList);
	targetStudentList.get(0).setName("NNN");
	targetStudentList.get(1).setName("MMM");
	//檢視2集合中值的變化
	for (Student stu : studentList) {
		System.out.print(stu.getName()+",");
	}
	System.out.println();
	for (Student stu : targetStudentList) {
		System.out.print(stu.getName()+",");
	}
}

列印結果:

AAA,BBB,
NNN,MMM,

相關推薦

java 集合 陣列深度複製

一.如果集合或陣列,裡面裝的是: 8種基本型別或者它們的包裝類和String,我們使用普通的淺複製就行了 使用 Arrays.copyOf() 或者 new ArrayList(list) 等方法這裡不

java 集合深度克隆

想象一下,有兩個list,list和list2(集合中盛的是物件,這裡不討論基礎資料型別),想把list1中的資料完全複製到list2中,但是需要同時滿足list1中的資料改變不會引起list2變化,如果通過直接addall,或者是遍歷進行add,兩者中的資料地址還是一樣的;

java陣列複製System.arraycopy

預設提供的一種陣列複製的方法 System.arraycopy(src, srcPos, dest, destPos, length); src:源陣列 srcPos:源陣列開始位置 dest:目標陣列 destPos:目標陣列開始位置 length:複製的長度 這

Java集合入門深度學習

Java集合可以分為兩大類 分別是 Collection Map 兩者區別 (1) Collection是單列集合,Map是雙列集合。 (2) Collection只有Set系列要求元素唯一,Map鍵要求唯一,值可以重複。 (3) Collect

Java物件深度複製和序列化總結

經常會碰到物件複製的問題,這個問題比較基礎,同時與JVM記憶體模型掛鉤。 1. 實現Cloneable介面預設的clone方法是淺拷貝 Java Cloneable介面實際上是個空介面,沒有任何方法,實際的clone()是object的方法,但是是一個protected的方法,因此需

java 深度複製和淺度複製

Java淺度複製是值引用的複製,而不是值的複製。 java深度複製才是值的複製。  1.其中,Cloneable介面必須實現,且重寫該clone方法,重寫clone方法且改為範圍改成public

java:集合框架(Arrays工具類的asList()方法的使用)-陣列集合互轉

import java.util.ArrayList; import java.util.Arrays; import java.util.List; //陣列轉集合,雖然不能增加或刪除元素,但是可以集

java 深度複製與淺複製 copyOf、arraycopy、copyOfRange

1、copyOf   原型:public static <T> T[] copyOf(T[] original, int newLength)   original:原陣列  newLength:要複製的長度   Arrays.copyof() 2、arraycopy   原型:void

java陣列集合的互相轉換

最近在刷筆試的程式設計題,裡面很多涉及到了陣列與集合的相互轉換 public class ArrayAndList { public static void main(String[] args) { // TODO Auto-generated method

java集合陣列的區別

陣列和集合的定義   一、陣列   陣列是java語言內建的資料型別,他是一個線性的序列,所有可以快速訪問其他的元素,陣列和其他語言不同,當你建立了一個數組時,他的容量是不變的,而且在生命週期也是不能改變的,還有JAVA陣列會做邊界檢查,如果發現有越界現象,會報R

Java——集合陣列並對其進行遍歷

* A:集合的遍歷 * 其實就是以此獲取集合中的每一個元素 * B:案例 * 把集合轉成陣列,可以實現集合的遍歷 * public Object[] toArra

java中將陣列轉換為集合,不能進行增刪操作解惑

</pre>java中我們經常會使用Arrays.asList(陣列);將陣列轉換為List型別,但是卻不能對轉換後的List進行增刪。示例如下:<pre name="code" class="java">import java.util.*; cl

Java集合陣列的轉換

陣列轉化為集合 使用Arrays.asList包裝器可以達到這個目的。 public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 如上所示,函

Java集合物件和陣列物件的轉換

    在開發中,我們經常需要將集合物件(List,Set)轉換為陣列物件,或者將陣列物件轉換為集合物件。Java提供了相互轉換的工具,但是我們使用的時候需要注意,不能亂用濫用。 1、陣列物件轉換為集合物件     最暴力的方式是new一個集合物件,然後遍歷陣列,依次將陣列中的元素放入到新的集合中,但是這樣

java 集合陣列的互轉

在實際工作中,我們經常需要Collection型別與陣列的互相轉換,javaAPI也提供了相應的方法幫我們完成操作。 //集合轉為陣列 Collection.toArray(T[] a) //陣列轉為集合 Arrays.toList

java陣列集合得區別

1.陣列得長度固定不易擴充套件,而集合長度可以伸縮 2.陣列要通過下標來查詢資料,而集合可以通過關鍵字來對映 注意:陣列更像集合框架得collection中得List   集合框架結構 一、cellection 1.List下標整數自增可重複 2.set下標整數

小白的java基礎--------陣列集合

1、陣列 資料型別[ ] 陣列名 = new 資料型別[ ]{}; int[ ] arr1 = new int [ 3 ];代表陣列中有3個元素 //代表陣列中有3個元素,索引從0開始 int[] arr = new int[3]; //向集合中新增元素 arr[1] = 12

遍歷java集合陣列的幾種方式

以陣列為例,基本上有下面4種常見的遍歷方式: public class Test { public static void main(String[] args) { //

java 實現陣列去重(集合轉換)

public static void main(String[] args) { int[] nums = { 5, 6, 6, 6, 8, 8, 7 }; List<Integer> numList = new ArrayList<Integer

JAVA基於陣列實現集合和基於連結串列實現集合

1.定義一個介面MyListpublic interface MyList { //增 void add(int num); //刪 boolean delete(int index2); //改 boolean update(int index2, int n