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