Java对象赋值与引用
当需要创建多个相同类型的对象且有某些字段的值是相同的,如果直接 get,set 的话,属性多的时候代码会很长,于是乎,以下代码产生了( java 基础差没搞清楚赋值与引用)
复制代码
1 User uuu = new User();
2 uuu.setId("888");
3 User u2 = new User();
4 u2 = uuu;
5 u2.setName("222");
6 User u3 = new User();
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 = new User();
2 uuu.setId("888");
3 User u2 = new User();
4 BeanUtils.copyProperties(uuu,u2);
5 u2.setName("222");
6 User u3 = new User();
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 = new User();
2 uuu.setId("888");
3 User u2 = new User();
4 BeanCopier beanCopier = BeanCopier.create(uuu.getClass(),u2.getClass(),false);
5 beanCopier.copy(uuu,u2,null);
当复制 Map 对象时,一样不能用“=”,可以用 putAll 方法:
复制代码
1 Map<String,Object> map0 = new HashMap<>();
2 map0.put("id",1);
3 Map<String,Object> map1 = new HashMap<>();
4 map1.putAll(map0);
5 map1.put("name",11);
6 Map<String,Object> 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}
Java对象赋值与引用的更多相关文章
- java对象Integer不能引用传递
java对象Integer不能引用传递 /** * The value of the <code>Integer</code>. * * @serial */ private ...
- java 对象赋值问题
import java.io.*; class CCircle{ private static double pi = 3.1415; private double radius; public CC ...
- 谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么
整体结构 java提供了4中引用类型,在垃圾回收的时候,都有自己的各自特点. 为什么要区分这么多引用呢,其实这和Java的GC有密切关系. 强引用(默认支持模式) 把一个对象赋给一个引用变量,这个引用 ...
- java对象的强引用,软引用,弱引用和虚引用
1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出Out ...
- Java:对象的强、软、弱、虚引用
转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...
- Java:对象的强、软、弱和虚引用
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...
- Java对象的强、软、弱和虚引用详解
1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
//转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...
- Java:对象的强、软、弱和虚引用[转]
原文链接:http://zhangjunhd.blog.51cto.com/113473/53092/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
随机推荐
- Python的偏函数
import functools def showag(*args,**kwargs): print(args) print(kwargs) p1 = functools.partial(showag ...
- Elasticsearch基本CURD操作语法讲解
当我们的ES集群搭建完成以后,我怎么能看到集群中各个节点状态以及主节点和健康情况呢,如下讲解使用curl命令来与ES集群进行交互.分别有查询主节点情况.集群状态.以及创建索引查看索引.查看分片以及对E ...
- moviepy执行TextClip.search方法时报错TypeError: a bytes-like object is required, not str
☞ ░ 前往老猿Python博文目录 ░ 执行TextClip.search方法时,报错: >>> from moviepy.editor import * >>> ...
- LSB隐写加密MISC
没有做过LSB隐写加密的题目,在buuoj上面做到了就记录一下,估计后面很长的时间都会在这个平台上面训练自己的MISC和WEB,是很好的平台,把很多比赛的原题和安恒的周赛的复现了. 题目是MISC里面 ...
- .NET 面试题汇总(带答案)
1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方式可以保证无论何 ...
- 第 7篇 Scrum 冲刺博客
一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 对职工的查询 3.今天计划完成的工作 继续与同学对接,争取早日完成项目的整个流程 初步对数据库筛选 4.工作中遇到的困难 ①有同学不知道如何远 ...
- 合并EXCEL文件到一个文件的V宏
我建的宏: Sub 合并文件的VBA() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String Dim G As Long Dim ...
- Springboot mini - Solon详解(一)- 快速入门
一.Springboot min -Solon 最近号称 Springboot mini 的 Solon框架,得空搞了一把,发觉Solon确实好用,小巧而快速.那Solon到底是什么,又是怎么好用呢? ...
- Python迭代器&生成器&装饰器
1. 迭代器 1.1 可迭代对象(Iterator) 迭代器协议:某对象必须提供一个__next__()方法,执行方法要么返回迭代中的下一项,要么引起一个Stopiteration异常,以终止迭代(只 ...
- thinkphp thinkphp6 安装JWT
第一步:composer安装 composer require firebase/php-jwt 下图是执行成功 cd 进入项目目录的vendor 找到firebase 看到下面有一个php-jw ...