8、clone使用和数组列表的copy
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一:需求背景
有時(shí)候在寫(xiě)工程的時(shí)候,已經(jīng)有一個(gè)對(duì)象了,但是需要重新生成一個(gè)對(duì)象,并且想把之前對(duì)象的部分字段信息或者全部信息copy過(guò)來(lái),這個(gè)時(shí)候可以使用new 對(duì)象,然后一行行copy的方式。這樣子會(huì)很麻煩如果這個(gè)類(lèi)有100個(gè)字段,那得要寫(xiě)101代碼才行。此時(shí)可以選擇使用clone的方法 clone方法是在Object對(duì)象中的,也就是所有類(lèi)默認(rèn)都繼承了此方法,但是如果想要使用clone功能必須還要implements Clonnable接口,表示此類(lèi)可以clone,同時(shí)默認(rèn)的clone是“淺clone”,他只會(huì)把對(duì)象的一些基本數(shù)據(jù)類(lèi)型clone,而一些對(duì)象屬性無(wú)法做深度clone,回和上一個(gè)對(duì)象共用,這樣就會(huì)導(dǎo)致修改時(shí)相互影響,如果想要實(shí)現(xiàn)“深度clone”,需要自己@override clone方法,先clone,然后在創(chuàng)建那些屬性對(duì)應(yīng)的對(duì)象,在把原來(lái)的值copy過(guò)來(lái)。
二:代碼實(shí)現(xiàn)
-
1、實(shí)體類(lèi)Student.java
package com.surfilter;import java.util.ArrayList;import java.util.Collections;import java.util.List;/*** 實(shí)體類(lèi)實(shí)現(xiàn)Cloneable接口,此接口沒(méi)有任何抽象方法,只是一個(gè)標(biāo)記而已* 真正的clone方法是在Object類(lèi)中, 但是clone方法是protected的,所以不能再外面使用* 只能在本類(lèi)中創(chuàng)建一個(gè)方法來(lái)間接調(diào)用clone方法* 默認(rèn)是“淺clone”,如果需要實(shí)現(xiàn)“深度clone”,則需要先supper.clone(),然后在創(chuàng)建屬性對(duì)象。** [@Author](https://my.oschina.net/arthor) liufu* [@Company](https://my.oschina.net/u/3478402) 任子行網(wǎng)絡(luò)技術(shù)股份有限公司* @CreateTime 2018/1/7 14:01*/public class Student implements Cloneable {private String userName;private String age;private List<String> project;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public List<String> getProject() {return project;}public void setProject(List<String> project) {this.project = project;}/*** 創(chuàng)建一個(gè)方法間接調(diào)用clone,因?yàn)閏lone是protected的,外面無(wú)法調(diào)用** [@return](https://my.oschina.net/u/556800)*/public Student newInstance() {try {//這樣是淺copy,如果想要深度copy則需要重寫(xiě)clone方法return (Student) this.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}/*** 深度clone實(shí)現(xiàn)** @return* @throws CloneNotSupportedException*/@Overrideprotected Object clone() throws CloneNotSupportedException {//這里只是copy了userName和age,// 那個(gè)project還是指向了之前的地址,和之前的student使用同一個(gè)對(duì)象,這樣修改的話會(huì)相互影響Student clone = (Student) super.clone();List<String> p1 = clone.getProject();if (p1 != null) {ArrayList<String> p2 = new ArrayList<>(p1.size());Collections.copy(p1, p2);clone.setProject(p2);}return clone;}} -
2、主類(lèi)CloneTest.java
package com.surfilter;import java.util.ArrayList;/*** @Author liufu* @Company 任子行網(wǎng)絡(luò)技術(shù)股份有限公司* @CreateTime 2018/1/7 14:00*/public class CloneTest {public static void main(String[] args) {Student s1 = new Student();ArrayList<String> p1 = new ArrayList<>();s1.setUserName("zhangsan");s1.setAge("23");s1.setProject(p1);Student s2 = s1.newInstance();s2.setUserName("lisi");s2.setAge("53");System.out.println(s1.getUserName() + ":" + s1.getAge());System.out.println(s2.getUserName() + ":" + s2.getAge());//淺clone,對(duì)象屬性測(cè)試(沒(méi)有重寫(xiě)clone方法)System.out.println(s1.getProject() == s2.getProject()); //輸出true//深度clone,對(duì)象屬性測(cè)試(重寫(xiě)clone方法)System.out.println(s1.getProject() != s2.getProject()); //輸出true}} -
3、數(shù)組,集合copy
String[] src = new String[1024];src[0] = "0";src[1] = "1";src[2] = "2";src[3] = "3";src[7] = "4";src[8] = "5";String[] dest = new String[1024];System.arraycopy(src, 0, dest, 0, src.length);ArrayList<String> srcList = new ArrayList<>(1024);srcList.add("");srcList.add("");srcList.add("");srcList.add("");srcList.add("");ArrayList<String> destList = new ArrayList<>(srcList.size());Collections.copy(destList, srcList);
轉(zhuǎn)載于:https://my.oschina.net/liufukin/blog/2221976
總結(jié)
以上是生活随笔為你收集整理的8、clone使用和数组列表的copy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css3的动画详解 html直接可以运行
- 下一篇: PostgreSQL 10.1 手册_部