总结对象属性拷贝的方法及效率比较(一)

  • Post author:
  • Post category:其他


针对不同类型的对象,但有相同名称的属性,对象属性拷贝方法:

1)org.apache.commons.beanutils.BeanUtils属性拷贝的本质使用反射。

2)org.springframework.beans.BeanUtils属性拷贝本质使用反射。

3)自己写的反射进行对象复制。

4)直接使用get、set方法复制。

5)cglib的BeanCopier。

效率对比:

属性拷贝方式

次数

10

100

1000

10000

100000

1000000

10000000

ApacheBeanUtilsCopyService

总耗时

143

167

398

969

4029

18037

152364

单次耗时

14.3

1.67

0.398

0.0969

0.04029

0.018037

0.0152364

SpringBeanUtilsCopyService

总耗时

239

222

503

434

340

427

2257

单次耗时

23.9

2.22

0.503

0.0434

0.00340

0.000427

0.0002257

SelfReflectCopyService

总耗时

1

9

62

190

428

2377

26648

单次耗时

0.1

0.09

0.062

0.0190

0.00428

0.002377

0.0026648

SelfGetSetCopyService

总耗时

0

0

1

2

12

22

109

单次耗时

0

0

0.001

0.0002

0.00012

0.000022

0.0000109

CglibBeanCopyService

总耗时

142

128

179

195

297

475

1856

单次耗时

14.2

1.28

0.179

0.0195

0.00297

0.000475

0.0001856

这么看自己通过get/set方法(SelfGetSetCopyService)拷贝对象效率是最高的,但是开发效率比较低,因为相当于为具体的对象写的定制方法,不通用是硬伤。

如果不想手写那么多的get/set,推荐使用spring的BeanUtils.copyProperteis方法或者Cglib的BeanCopier,效率不错。

效率最低的是common包里的BeanUtils.copyProperteis方法。

现有工具类中对象属性拷贝都是浅拷贝,意味着引用类型的属性值的变更会引起其他对象值的变更。


关联代码:https://blog.csdn.net/SJZYLC/article/details/81203392

Apache和spring的底层都是用的反射。cglib是修改字节码。



版权声明:本文为SJZYLC原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。