java 对象赋值 引用_Java对象赋值与引用

当需要创建多个相同类型的对象且有某些字段的值是相同的,如果直接 get,set 的话,属性多的时候代码会很长,于是乎,以下代码产生了( java 基础差没搞清楚赋值与引用)

1 User uuu = newUser();2 uuu.setId("888");3 User u2 = newUser();4 u2 =uuu;5 u2.setName("222");6 User u3 = newUser();7 u3 =uuu;8 u3.setName("333");9 System.out.println(uuu+"---"+u2+"---"+u3);

输出结果:

com.hmbb.demo.entity.User@34136bd1---com.hmbb.demo.entity.User@34136bd1---com.hmbb.demo.entity.User@34136bd1

其实这样并没有创建3个对象,而是同一个对象;“=” 表示使对象引用 u2,u3 指向刚创建的 User 对象 uuu。一个对象引用可以指向0个或者1个对象;一个对象可以有N个引用指向它。(个人理解:一个人可以不住房子,或者同时只能住在一栋房子,一栋房子可以住多个人;且人可以改变房子的属性)

解决办法:

利用反射机制对JavaBean的属性进行处理

1 User uuu = newUser();2 uuu.setId("888");3 User u2 = newUser();4 BeanUtils.copyProperties(uuu,u2);5 u2.setName("222");6 User u3 = newUser();7 BeanUtils.copyProperties(uuu,u3);8 u3.setName("333");9 System.out.println(uuu+"---"+u2+"---"+u3);

输出结果:

com.hmbb.demo.entity.User@28ee0a3c---com.hmbb.demo.entity.User@2dd1086---com.hmbb.demo.entity.User@6b8d54da

但是,当需要拷贝的对象数量多的时候,BeanUtils.copyProperties 性能很差。对性能要求高的时候就直接手动 get,set。

BeanUtils 有两个包,一个是 apache,一个是spring,他们使用时参数位置刚好相反,spring 是从左复制到右,且 apache.BeanUtils 会比 spring.BeanUtils更慢。还可以用 BeanCopier > org.springframework.cglib.beans ;这个相对前两个会快一点,但是频繁 create也是会占用服务器资源,有利有弊。

1 User uuu = newUser();2 uuu.setId("888");3 User u2 = newUser();4 BeanCopier beanCopier = BeanCopier.create(uuu.getClass(),u2.getClass(),false);5 beanCopier.copy(uuu,u2,null);

当复制 Map 对象时,一样不能用“=”,可以用 putAll 方法:

1 Map map0 = new HashMap<>();2 map0.put("id",1);3 Map map1 = new HashMap<>();4 map1.putAll(map0);5 map1.put("name",11);6 Map map2 = new HashMap<>();7 map2.putAll(map0);8 map2.put("name",22);9 System.out.println(map0+"---"+map1+"---"+map2);

输出结果:

{id=1}---{name=11, id=1}---{name=22, id=1}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值