java对象的复制(java对象复制工具类)

今天给各位分享java对象的复制的知识,其中也会对java对象复制工具类进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、java复制对象时字段新增前缀2、Java中,复制一个对象,有什么好的方法3、如何复制一个java对象

java复制对象时字段新增前缀

Java 对象的一共有 3 种复制对象的方式。

1.直接赋值 (引用复制 ),此种复制方式比较常用。

诸如 A a = b ; a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象。 此时 a == b [ true ] 。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 classA{2 privateString string;3 A(){string = new String(“original state”);}4 public void set(String string) {this.string =string;}5 public String get() {returnstring;}6 }7

8 public classB{9 public static voidmain(String[] args) {10 //TODO 自动生成的方法存根

11 A a = newA();12 A b =a;13 System.out.println(a ==b);14 a.set(“state has changed”);15 System.out.println(a ==b);16 }17 }

View Code

2.浅拷贝 ——- 复制当前对象的非静态字段【静态字段只在类加载的时候加载一次】,如果当前字段为 值类型 字段,那么直接复制该字段,如果是 引用类型 的,则对其复制引用。

所谓的值类型就是指Java中的8种基本类型,那么什么是值类型的复制呢?

举个例子 int A = 0; int B = A; 那么这样B拷贝的是A指向的常量对象,而非A的引用,当A改变时,并不会影响B的指向。【Ps: A =1; 则B = 0 ,而非 1 , 这就是值类型的复制】

所谓的引用类型就是一些你自己构建的类和库中的一些类实例化出来的对象,引用复制又指的啥呢?

举个例子

class A {public int value = 0 ; } ==== A a = new A(); A b = a; ===== a.value = 1; 那么 == b.value = 1; 因为它们指向的是同一个对象【复制的是引用】

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 class B implementsCloneable{2

3 privateC c;4

5 privateString string ;6 public B() {string = new String(“Init string”); c = newC();}7 public void set(String string) {this.string =string;}8 public String get() {returnstring;}9

10 //setC()方法中添加一句 c = new C() ,就变为深拷贝了,因为添加了 这句代码, 拷贝 引用类型时,就变成拷贝其对象,而不是引用了

11 public voidsetC(String string) {c.set(string);}12 public String getC() {returnc.get();}13

14

15 @Override16 publicObject clone() {17 B sCopy = null;18 try{19 sCopy = (B)super.clone();20 }catch(Exception e) {21 e.printStackTrace();22 }23 returnsCopy;24 }25 }26 public static voidmain(String[] args) {27 //TODO 自动生成的方法存根

28

29

30 B sCopyA = newB();31 B sCopyB =(B) sCopyA.clone();32

33 sCopyA.set(“hava changed !”);34 //sCopyA.string = hava changed ! ——- sCopyA.string = Init string35 //改变了 sCopyA 并没有改变 sCopyB。 因为 B.string 是一个值类型

36 System.out.println(“sCopyA.string = “+ sCopyA.get()+” ——- sCopyA.string = “+sCopyB.get());37

38 sCopyB.setC(“C have Changed !”);39 //C.string = C have Changed ! ——- C.string = C have Changed !40 //改变了 sCopyA 同时也改变 sCopyB。因为 B.string 是一个引用类型

41 System.out.println(“C.string = “+ sCopyA.getC()+” ——- C.string = “+sCopyB.getC());42 }

View Code

3.深拷贝 ——- 和浅拷贝的区别就在于,其不管字段类型是什么,统统的全给拷贝过去【即使相对与 非基本类型而言 拷贝的也是对象而不是引用 ,深拷贝之后将会产生2个对象 ,浅拷贝只是一个对象的2个引用而已(相当于1个人的2个名字)】。

我们只要在 2的基础上添加一行代码就行, 因为只要将 引用字段,也进行复制 ,就是深拷贝了。

附:1.clone()方法 需要覆写。 2.覆写clone()方法需要实现Cloneable 接口, 未实现的话会抛出异常。 3 .clone()是本地方法,其内部实现如下图。

2708f3cdcfe8a632a43a58352302c9b8.png

java对象的复制(java对象复制工具类)

Java中,复制一个对象,有什么好的方法

使用Java的反射机制实现:为了能更好的区分,写成了两个类,可以运行下面的代码看看效果

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class Test {

public static void main(String[] args) throws Exception {

Customer1 c1 = new Customer1();

c1.setName(“c1”);

ListString list = new ArrayListString();

list.add(“1”);

list.add(“2”);

c1.setList(list);

MapString,String map = new HashMapString, String();

map.put(“map1”, “map1”);

map.put(“map2”, “map2”);

c1.setMap(map);

Customer2 c2 = new Customer2();

//

Class c = c1.getClass();

Class class2 = c2.getClass();

Field fields[] = c.getDeclaredFields();

for (int i = 0; i fields.length; i++) {

Field field = fields[i];

String fieldName = field.getName();

String firstLetter = fieldName.substring(0, 1).toUpperCase();

String getMethodName = “get” + firstLetter + fieldName.substring(1);

String setMethodName = “set” + firstLetter + fieldName.substring(1);

Method getMethod = c.getMethod(getMethodName, new Class[] {});

Method setMethod = class2.getMethod(setMethodName,

new Class[] { field.getType() });

Object value = getMethod.invoke(c1, new Object[] {});

setMethod.invoke(c2, new Object[] { value });

}

System.out.println(c2.getName());

System.out.println(c2.getList());

System.out.println(c2.getMap());

}

}

class Customer1 {

private String name;

private ListString list;

private MapString, String map;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public ListString getList() {

return list;

}

public void setList(ListString list) {

this.list = list;

}

public MapString, String getMap() {

return map;

}

public void setMap(MapString, String map) {

this.map = map;

}

}

class Customer2 {

private String name;

private ListString list;

private MapString, String map;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public ListString getList() {

return list;

}

public void setList(ListString list) {

this.list = list;

}

public MapString, String getMap() {

return map;

}

public void setMap(MapString, String map) {

this.map = map;

}

}

如何复制一个java对象

/**

     * 复制对象

     *

     * @param srcObj

     * @return

     */

    public static Object depthClone(Object srcObj) {

        if (srcObj == null) {

            return null;

        }

        Object cloneObj = null;

        ByteArrayOutputStream out = null;

        ObjectOutputStream oo = null;

        ByteArrayInputStream in = null;

        ObjectInputStream oi = null;

        try {

            out = new ByteArrayOutputStream();

            oo = new ObjectOutputStream(out);

            oo.writeObject(srcObj);

            in = new ByteArrayInputStream(out.toByteArray());

            oi = new ObjectInputStream(in);

            cloneObj = oi.readObject();

        } catch (IOException e) {

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } finally {

            if (out != null) {

                try {

                    out.close();

                } catch (IOException ex) {

                    ex.printStackTrace();

                }

            }

            if (oo != null) {

                try {

                    oo.close();

                } catch (IOException ex) {

                    ex.printStackTrace();

                }

            }

            if (in != null) {

                try {

                    in.close();

                } catch (IOException ex) {

                    ex.printStackTrace();

                }

            }

            if (oi != null) {

                try {

                    oi.close();

                } catch (IOException ex) {

                    ex.printStackTrace();

                }

            }

        }

        return cloneObj;

    }

关于java对象的复制和java对象复制工具类的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 21:11:26
下一篇 2024年3月28日 21:19:51

相关推荐

  • 为什么很多美女选择的对象让人大跌眼镜

    女生是最靓丽的风景线:要弄懂这个问题,或许看一组数据,大家就会恍然大悟,前段时间;现在楚楚动人的女孩越来越多;女孩的成熟先从思想开始 有朋友疑问,为什么大街上的美女大部分跟的对象长得都不咋地?更有甚者说周围认识的美女发小,怎么找的老公一个比一个丑,根本就不般配,帅哥靓妹这种组合,显然属于极少数,关键周围的帅哥带的女友也是丑的居多,看来男的女的两组世界,都符合…

    2024年4月22日
    4400
  • 盘点明星与吸血鬼父母:张韶涵,妥妥的赚钱工具

    要说起“娱乐圈最坑子女”的父母,一定会想到张韶涵的母亲,真是妥妥地把女儿当成了“赚钱工具”,张韶涵从小跟随父母在加拿大生活,17岁时拿到冠军 娱乐圈是个名利场,就算再清纯的人,在里面呆久了也会有所改变,进而影响自己的一生。 而有些明星父母,也早早就看中了这个名利场,纷纷将子女送进去,希望能一夜成名,进而改换门庭。 比如郑爽的父母,从小就对孩子说“以后要当明星…

    2024年4月21日 用户投稿
    4300
  • 梅西对于巴萨来说就是一个赚钱工具

    著名经济学家marc Ciria研究了梅西每年为巴萨创造的财富,他在研究以后给出了一个大概的数字,梅西每年为巴萨创造的财富有2.5亿到3亿欧元之间 西甲联赛第20轮,巴萨主场面对毕尔巴鄂,最近几轮联赛中的第三次相遇,复仇心切的巴萨全队众志成城,凭借梅西的任意球射门和格里兹曼的反超,巴萨2-1双杀毕尔巴鄂竞技,梅西这场比赛的表现依然完美,只是场下的纷纷扰扰,或…

    2024年4月21日
    4500
  • 美国的抗疫工作成为资本家赚钱的工具

    有美国民众接受完新冠病毒检测后就收到了天价账单。一名得州的居民表示,他做了一次新冠检测后收到了两张账单,两张加起来大约有4000美元 美国的抗疫工作一直非常混乱,每个环节都存在严重的问题,包括最基本的检测工作,美国至今仍然没整明白,检测效率极低。之所以会这样,是因为新冠检测是一个巨大的利益链,资本需要赚钱,在利益至上的美国,是否能够应对新冠疫情不是第一位的,…

    2024年4月21日
    4400
  • 产品是赚钱工具而不是解决问题的工具

    现在很多人都抱怨生意不好做,其实不是生意不好做,而是今天的消费者变聪明了。以前的消费者是两眼一抹黑,什么都不知道全听商家忽悠,被营销广告洗脑 现在大家都说生意不好做,赚不到钱了!其实大多数人做生意的初心就错了!先问大家一个问题,做生意是为了什么?90%的人都会说做生意就是为了赚钱!这个目的就错了,谁的钱平白无故地让你赚啊?人家傻吗?记住,做生意是用…

    2024年4月20日
    5100
  • 结婚后没有享受到爱情,却成为了赚钱工具人

    我不是说了我今晚回家吃饭吗?你就不能等等我吗?”,“有什么可等的,桌上不是还有菜吗,我又没有倒了不让你吃。”,“你就不能对我好点尊重我一点吗 “每个月就只有发工资的这天,我才算是个男人。她拿到钱会给我点甜头,让我享受一下一家之主的感觉。其他时间我在这个家得不到一点尊重。每天回家就和我吵架,嫌弃我赚钱少,是个废物。可是不管我挣多少都不能让她满足。这婚姻生活真的…

    2024年4月20日
    3700
  • 基金成为不少理财小白的亏钱工具,如何稳健赚钱

    所以,“FOF固收 ”兼具FOF基金和“固收 ”基金的优势,特别适合震荡市,力争为投资者提供稳定舒适的持有体验,是理财替代和养老投资的优选 对于大多数投资者而言,基金是入门的理财工具,但是从这两年的基金热搜来看,基金也很容易成为理财小白们入门级的亏钱工具。 就拿2022年来举例,来自各方面的风险,太不可控了。 2022年1月,年初市场回调;2月俄乌冲突升级,…

    2024年4月20日
    5100
  • 一男子让两个对象去夜店打工赚钱供养自己

    陈挺自知自己难逃法律制裁,告诉妻子不用等他了,找个好人重新嫁了吧。对于两位“女友”,陈挺甚至连道歉都没有,一句话都没说,故事就到此结束了 相信有很多男同胞在看一些古装剧的时候,很羡慕里面的主角可以三妻四妾,好不威风。但现在是现代社会,这种陋习早就被取消了,男同胞们恨不得早生个几百年。但就在现代社会,也有人能同时处多个对象,甚至让两个对象去夜店打工供养自己,堪…

    2024年4月19日
    4400
  • 3个大学生创业补贴项目介绍,补贴对象、补贴标准等

    次性创业资助:补贴对象,补贴标准;租金补贴:实体经营。 (公司租上租不能申请该补贴),创业主体登记注册3年内提出;创业带动就业补贴 一、一次性创业资助 1、补贴对象:普通高等学校、职业学校、技工院校学生(在校及毕业5年内);2、出国(境)留学回国人员(领取毕业证5年内);3、军转干部、复退军人;4、登记失业人员;就业困难人员;在本市乡村经营驿道客栈、民宿、农…

    2024年4月19日
    4500
  • 把直播看成是收割工具,而不是卖货工具

    是主要直播电商平台的行业份额;是直播占具体品牌双11业绩的比例:为什么这三个行业直播渗透率这么高,相比全行业7.6 的平均水平,高了几倍 前几天看到一个讨论,哪些产品容易在直播卖爆? 有人总结是10秒内可以看到效果的“魔术型产品”。 而据操盘手爆料,很多积极拥抱直播的新消费品牌,ROI做到1:1一点不稀奇,甚至有品牌把ROI1:0.7解读成“三倍回报的生意”…

    2024年4月18日 用户投稿
    4800

发表回复

登录后才能评论



关注微信