对象拷贝的几种方式,区别优缺点,总结最佳方式

在业务中,5000次的循环中复制对象(29个属性)223次,即111.5万次的复制。几种方式的耗时开销对比如下:

序号

方式

耗时

代码

备注

1

原始方式

/

繁琐

未测试,参考其他数据和高效相当

2

优雅方式

60

简洁

/

3

高效方式

3S

简洁

普通和封装方式有个不到1S的差距

4

最佳方式

3S

简洁

/

备注:业务中除复制对象也存在其他业务逻辑,但产生的耗时影响是相同的,不影响对比结果。

1原始方式

source对象getter + target对象setter

实现代码较为繁琐,性能较高。

2优雅方式

Hutool工具类

语法简洁,性能较低。

BeanUtil.copyProperties(source, target, false);
// ignoreCase:false表示当源对象的值为null时仍然注入,true表示当源对象的值为null时停止注入

3高效方式

使用Cglib

或对

Cglib自行封装工具类

性能较高。

BeanCopier copier = BeanCopier.create(TestItemConfig.class, CustomerTestData.class, false);
copier.copy(testItemConfig, customerTestData, null);

BeanCopierUtil.copy(testItemConfig, customerTestData);
public class BeanCopierUtil {
    /**
     * BeanCopier的缓存
     */
    static final ConcurrentHashMap<String, BeanCopier> BEAN_COPIER_CACHE = new ConcurrentHashMap<>();

    /**
     * BeanCopier的copy
     * @param source 源文件的
     * @param target 目标文件
     */
    public static void copy(Object source, Object target) {
        String key = genKey(source.getClass(), target.getClass());
        BeanCopier beanCopier;
        if (BEAN_COPIER_CACHE.containsKey(key)) {
            beanCopier = BEAN_COPIER_CACHE.get(key);
        } else {
            beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
            BEAN_COPIER_CACHE.put(key, beanCopier);
        }
        beanCopier.copy(source, target, null);
    }

    /**
     * 生成key
     * @param srcClazz 源文件的class
     * @param tgtClazz 目标文件的class
     * @return string
     */
    private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
        return srcClazz.getName() + tgtClazz.getName();
    }
}
<!-- CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>

4最佳方式

Hutool封装Cglib的工具类CglibUti

性能较高。

// 对象拷贝
CglibUtil.copy(source, target);
// 集合拷贝
List<UserVO> userVOList = CglibUtil.copyList(userList, UserVO::new);
// 注意对象和集合不同的语法结构
<!-- CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!-- hutool util-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值