当前位置: 首页 > news >正文

森东网站建设/重庆公司网站seo

森东网站建设,重庆公司网站seo,移动网站登录入口,网站公司架构1、java中深浅拷贝的区别? 浅拷贝:只对基本数据类型进行拷贝,对于引用数据类型只是进行了引用的传递,没有真实的创建一个新的对象,则是浅拷贝;(参数引用传递中的改变源对象情况) 深拷贝&#…

1、java中深浅拷贝的区别?

  • 浅拷贝:只对基本数据类型进行拷贝,对于引用数据类型只是进行了引用的传递,没有真实的创建一个新的对象,则是浅拷贝;(参数引用传递中的改变源对象情况)
    在这里插入图片描述

  • 深拷贝:在对引用数据类型拷贝过程中,创建了一个新的对象,并且复制了对象内的所有成员变量,则是深拷贝(参数引用传递中的不改变源对象情况)

在这里插入图片描述

1.1 java浅拷贝的实现?

Cloneable 接口,并覆写 clone() 方法,clone()方法实现的是对当前对象进行拷贝。

1.2 java深拷贝的实现

  • Cloneable 接口,并覆写 clone() 方法
    需要拿到拷贝自己后产生的新的对象,然后对新的对象的引用类型再调用拷贝操作,实现对引用类型成员变量的深拷贝。
    实现两次clone,第一次得到当前对象浅拷贝,然后再对新的对象引用类型调用拷贝实现深拷贝
  • 序列化对象,再反序列化回来,然后就可以得到一个新的对象,

1.3 什么是序列化?(serialization涉及到IO部分)

将对象写入到io流中,反序列化是从io流中恢复对象;

2、java方法中的参数传递?(都是传递副本,值传递,java中没有引用传递)

问:当一个对象当作参数传递到一个方法之后,此方法可以改变对象属性,并且可以返回变化后的对象,那么这里是值传递还是对象传递。。
答:java中只有值传递参数

  • 如果参数类型是基本数据类型,值传递,改变副本的值不会改变原始数据的值;
  • 如果参数类型是引用数据类型,传过来的是对象地址副本,如果方法中没有改变地址的值,方法内针对对象的改变会影响到传入的参数;(浅拷贝)
  • 如果参数类型是引用数据类型,函数中改变了副本的地址,比如new一个,也就是副本指向一个新的地址,此时方法中针对对象的改变不会影响到传入参数对象;(深拷贝)

3. 开发中遇到的数据拷贝问题

刚工作的时候,业务代码开发过程中遇到过这种直接修改了引用数据类型参数导致的数据异常问题。

有问题的代码如下:

  public SettingsExtVo filterRateByCity(SettingsExtVo settingsExtVo,String cityCode){if (cityCode == null){return settingsExtVo;}List<GroupExtVO> groups = settingsExtVo.getGroups();//    SettingsExtVo settingsExtVoNew = new SettingsExtVo();// 定义一个新的List<GroupExtVO>List<GroupExtVO> groupExtVOList = com.google.api.client.util.Lists.newArrayList();// 遍历groups筛选出满足城市条件的groupgroups.forEach(groupExtVO -> {if (groupExtVO.getCondition() != null){Map<String,String> condition = groupExtVO.getCondition();if (condition.get("cityGuid") != null){List<String> cityList = Arrays.asList(condition.get("cityGuid").split(","));if (cityList.contains(cityCode)){groupExtVOList.add(groupExtVO);}}}});if (CollectionUtils.isEmpty(groupExtVOList)){groups.forEach(groupExtVO1 -> {if (groupExtVO1.getCondition() == null){groupExtVOList.add(groupExtVO1);}});}// 修改引用传参数,值传递传的是对象地址值,此时对地址对应的对象进行了修改。settingsExtVo.setGroups(groupExtVOList);return settingsExtVo;}

上述代码功能主要是对一个对象中的list列表数据进行筛选,并且返回筛选后的数据。

代码中对SettingsExtVo的实例对象进行了修改,而该对象是本地缓存的数据对象,通过该方法对本地缓存的对象进行修改,这就导致后续程序使用该缓存对象的时候出现数据丢失的问题。

修复后的代码逻辑(使用json序列化,深拷贝出一个全新的对象)

  /*** 根据头盔城市筛选出对应的评价问题** @param settingsExtVo* @param cityCode* @return SettingsExtVo*/public SettingsExtVo filterRateByCity(SettingsExtVo settingsExtVo,String cityCode){// 利用Json序列化实现对象深拷贝String jsonString = JsonUtils.json2String(settingsExtVo);SettingsExtVo settingsExtVoNew = JsonUtils.json2Object(jsonString,SettingsExtVo.class);List<GroupExtVO> groups = settingsExtVo.getGroups();// 定义一个新的List<GroupExtVO>List<GroupExtVO> groupExtVOList = Lists.newArrayList();// 遍历groups筛选出满足城市条件的groupgroups.forEach(groupExtVO -> {if (groupExtVO.getCondition() != null && cityCode != null){Map<String,String> condition = groupExtVO.getCondition();if (condition.get("cityGuid") != null){List<String> cityList = Arrays.asList(condition.get("cityGuid").split(","));if (cityList.contains(cityCode)){groupExtVOList.add(groupExtVO);}}}});if (CollectionUtils.isEmpty(groupExtVOList)){groups.forEach(groupExtVO1 -> {if (groupExtVO1.getCondition() == null){groupExtVOList.add(groupExtVO1);}});}settingsExtVoNew.setGroups(groupExtVOList);return settingsExtVoNew;}

第二种修复方案是不修改引用参数对象,利用参数对象做筛选,但是新建一个对象来存储筛选的数据,并且也返回这个新创建的对象;

  /*** 按照group的匹配规则来筛选评价问题* @param settingsExtVo* @param cityCode* @return*/public List<GroupExtVO> filterRateByCondition(SettingsExtVo settingsExtVo,String cityCode,String npsType){List<GroupExtVO> groups = settingsExtVo.getGroups();// 定义一个新的List<GroupExtVO>List<GroupExtVO> groupExtVOList = Lists.newArrayList();//遍历groups筛选出满足头盔城市条件的groupgroups.forEach(groupExtVO -> {if (groupExtVO.getCondition() != null && cityCode != null){Map<String,String> condition = groupExtVO.getCondition();if (condition.get("cityGuid") != null){List<String> cityList = Arrays.asList(condition.get("cityGuid").split(","));if (cityList.contains(cityCode) && groupExtVO.getDisplay().equals(true)){groupExtVOList.add(groupExtVO);}}}});// 按头盔城市筛选为空,则再次按照nps模式进行筛选if (CollectionUtils.isEmpty(groupExtVOList)){groups.forEach(groupExtVO -> {if (groupExtVO.getCondition() != null && Objects.nonNull(npsType)){if (groupExtVO.getCondition().get("npsType").equals(npsType)){groupExtVOList.add(groupExtVO);}}});}//  如果按照已有规则筛选都为空,则筛选无规则groupif (CollectionUtils.isEmpty(groupExtVOList)){groups.forEach(groupExtVO1 -> {if (Objects.isNull(groupExtVO1.getCondition())){groupExtVOList.add(groupExtVO1);}});}return groupExtVOList;}
http://www.jmfq.cn/news/5115637.html

相关文章:

  • 为何网站不被百度收录/搜索引擎技术
  • 快递网站建设日程表/简短的软文范例
  • 简述企业网站建设的目的有哪些/网站设计流程
  • 有专门做英文字幕的网站吗/搭建网站需要哪些步骤
  • 色91Av做爰网站/电子商务营销策划方案
  • 网络营销方案分析/seo项目经理
  • 做预售的网站/店铺推广方法
  • 成都网站建设兴田德润实力强/百度服务热线
  • 广告素材网站/昆明网络推广方式有哪些
  • app开发的网站/山东进一步优化
  • 发软文提高网站权重/外贸营销网站制作
  • wordpress 加速版/seo平台是什么
  • 手机网站建设公司联系电话/域名被墙检测
  • wordpress隐藏站点身份/爱站seo综合查询
  • 帮客户做插边球网站/中国新闻网发稿
  • 深圳有哪些网站公司/店铺引流的30种方法
  • 电子商务网站建设实训心得体会/谷歌网站网址
  • 东台网站网站建设/推广普通话手抄报句子
  • 番禺区大石做网站/b2b外贸平台
  • 腾讯云做网站需要报备/泰安百度推广代理
  • 网站排名外包/什么样的人适合做策划
  • 杭州专业的网站制作公司/如何做互联网营销推广
  • 北京顺义住房和城乡建设委员会网站/新闻热点事件
  • 保洁公司网站源码/海外网站
  • 安平做网站/上海网站推广排名公司
  • 内蒙古乌海建设局网站/seo优化专员工作内容
  • 做交友网站多少钱/中国十大小说网站排名
  • by开头的网络黄页平台/seo的优化步骤
  • wordpress函数源码/网站seo排名优化工具
  • 浦东新区办营业执照哪里办/夫唯seo视频教程