对比对象
常见的BeanUtils有2个:
spring有BeanUtils 浅拷贝
apache的commons也有BeanUtils 深拷贝
测试(200000次循环)
测试次数
200000次循环
测试结果
依旧是20倍左右的差距, 循环200000次但新建对象不是预期的200000而总是少10个左右…
结论
使用 BeanUtils 自动复制字段, 性能大概是 json序列化 方式复制字段的20倍, 不过如果对象不是十分复杂, 这个差距可以接受,性能不敏感的话可以考虑使用 json序列化 的方式进行字段复制
spring BeanUtils和Apache BeanUtils优缺点
spring BeanUtils只能进行浅复制, 不能复制子对象, 但性能高.
Apache BeanUtils可以深层次复制, 但性能较低.
深度克隆注意
1、BeanUtils的copyProperties()方法并不是完全的深度克隆,在包含有引用类型的对象拷贝上就可能会出现引用对象指向同一个的情况,且该方法的性能低下,项目中一定要谨慎使用。
2、要实现高性能且安全的深度克隆方法还是实现Serializable接口,多层克隆时,引用类型均要实现Serializable接口(多层克隆不仅要将克隆对象实现序列化接口,引用对象也同样的要实现序列化接口)。