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/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
随机推荐
- 数据库:Flask-SQLAlchemy
一.安装以及使用 1.安装 安装 flask-sqlalchemy pip install flask-sqlalchemy 如果连接的是 mysql 数据库,需要安装 mysqldb pip ins ...
- SLR(1)语法分析(JAVA实现)
要求 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util. ...
- JAVA课堂题目--递归来判断回数
package class20190923; import java.util.Scanner; public class Classtext { private static int n=0; pr ...
- PHP代码审计分段讲解(7)
17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...
- django 删除数据库表后重新同步的方法
python manage.py sqlmigrate your_app_name 0001 把your_app_name换成自己的app名字即可看到框架自动生成的创建表sql语句,于是我就这样看到了 ...
- k8s之yaml文件书写格式
k8s之yaml文件书写格式 1 # yaml格式的pod定义文件完整内容: 2 apiVersion: v1 #必选,版本号,例如v1 3 kind: Pod #必选,Pod 4 metadata: ...
- sql server如何把退款总金额拆分到尽量少的多个订单中
一.问题 原来有三个充值订单,现在要退款450元,如何分配才能让本次退款涉及的充值订单数量最少?具体数据参考下图: 二.解决方案 Step 1:对可退金额进行降序排列,以便优先使用可退金额比较大的订单 ...
- mysql主从双机keepalived配置
1.关闭selinux SELINUX=disabled 2.yum安装keepalived yum install -y keepalived 3.修改配置文件 主库配置文件: ! Configur ...
- SpringBoot + Layui +Mybatis-plus实现简单后台管理系统(内置安全过滤器)
1. 简介 layui(谐音:类UI)是一款采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体积轻盈,组件丰 ...
- DRF框架笔记
序列化器类的定义格式? 继承serializers.Serializer:字段 = serializers.字段类型(选项参数) 序列化器类的基本使用? 序列化器类(instance=None, da ...