美文网首页
详解Java对象赋值与引用

详解Java对象赋值与引用

作者: 平凡的柚子 | 来源:发表于2021-01-05 17:23 被阅读0次

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

    User uuu = new User();
    uuu.setId("888");
    User u2 = new User();
    u2 = uuu;
    u2.setName("222");
    User u3 = new User();
    u3 = uuu;
    u3.setName("333");
    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的属性进行处理

    User uuu = new User();
     uuu.setId("888");
     User u2 = new User();
     BeanUtils.copyProperties(uuu,u2);
     u2.setName("222");
     User u3 = new User();
     BeanUtils.copyProperties(uuu,u3);
     u3.setName("333");
     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也是会占用服务器资源,有利有弊。

    User uuu = new User();
    uuu.setId("888");
    User u2 = new User();
    BeanCopier beanCopier = BeanCopier.create(uuu.getClass(),u2.getClass(),false);
    beanCopier.copy(uuu,u2,null);
    

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

    Map<String,Object> map0 = new HashMap<>();
     map0.put("id",1);
     Map<String,Object> map1 = new HashMap<>();
     map1.putAll(map0);
     map1.put("name",11);
     Map<String,Object> map2 = new HashMap<>();
     map2.putAll(map0);
     map2.put("name",22);
     System.out.println(map0+"---"+map1+"---"+map2);
    

    输出结果:

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

    最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:11604713672

    相关文章

      网友评论

          本文标题:详解Java对象赋值与引用

          本文链接:https://www.haomeiwen.com/subject/exuboktx.html