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

青海医院网站建设公司sem竞价推广

青海医院网站建设公司,sem竞价推广,网站设计制作策划书,淘宝官网首页入口电脑版网址面试回答 在计算机内存中,每个对象都有一个地址,这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时,实际上是将该对象的地址赋值给变量。因此,如果我们将一个对象复制到另一个变量中国,实际上是将对象…

面试回答

在计算机内存中,每个对象都有一个地址,这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时,实际上是将该对象的地址赋值给变量。因此,如果我们将一个对象复制到另一个变量中国,实际上是将对象的地址复制到了这个变量中。

浅拷贝是指将一个对象复制到另一个变量中,但是只复制对象的地址,而不是对象本身。也就是说,原始对象和复制对象实际上是共享同一个内存地址的。因此,如果我们修改了复制对象中的属性或元素,原始对象中对应的属性或元素也会被修改。

未命名表单.png

在 java 中,我们常用的各种 BeanUtils 基本也都是浅拷贝的。

深拷贝是指将一个对象及其所有子对象都复制到另一个变量中,也就是说,它会创建一个全新的对象,并将原始对象中的所有属性或元素都复制到新的对象中。因此,如果我们修改复制对象中的属性或者元素,原始对象中对应的属性或元素不会受到影响。

未命名表单.png

知识扩展

BeanUtils 的浅拷贝

我们举个实际例子,来看下为啥前面说 BeanUtils.copyProperties 的过程是浅拷贝。

先来定义两个类:

@Data
public class Address {private String province;private String city;private String area;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String name;private String password;private Address address;
}

然后写一段测试代码:

    public static void main(String[] args) {User user=new User();user.setName("Tango");user.setPassword("123456");user.setAddress(new Address("anhui","hefei","shushan"));User newUser=new User();BeanUtils.copyProperties(user,newUser);System.out.println(user==newUser);System.out.println(user.getAddress()==newUser.getAddress());}

以上代码输出结果为:

false
true

即,我们 BeanUtils.copyProperties拷贝出来的 newUser 是一个新的对象,但是,其中的 address 对象和原来 user 中的 address 对象是同一个对象。

如果我们修改 newUser 中的 address 对象的值的话,是会同时把 user对象中的 address 的值也修改了的。可以尝试着修改下 newUseraddress 对象。

    newUser.getAddress().setCity("beijing");System.out.println(JSON.toJSONString(user));System.out.println(JSON.toJSONString(newUser));

输出结果:

{"address":{"area":"shushan","city":"beijing","province":"anhui"},"name":"Tango","password":"123456"}
{"address":{"area":"shushan","city":"beijing","province":"anhui"},"name":"Tango","password":"123456"}

实现深拷贝

如何实现深拷贝呢,主要有以下几个方法:

实现 Cloneable 接口,重写 clone()

Object 类中定义了一个 clone 方法,这个方法其实在不重写的情况下,其实也是浅拷贝的。

如果想要实现深拷贝,就需要重写 clone 方法,而想要重写 clone 方法,就必须实现 Cloneable,否则会报 CloneNotSupportedException 异常。

将上诉代码修改下,重写 clone 方法:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address implements Cloneable{private String province;private String city;private String area;@Overridepublic Address clone() {try {Address clone = (Address) super.clone();return clone;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}

@Data
public class User implements Cloneable {private String name;private String password;private Address address;@Overridepublic User clone() {try {User clone = (User) super.clone();clone.setAddress(address.clone());return clone;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}

之后,在执行一下下面的测试代码,就可以发现,这时候 newUser 中的 address 对象就是一个新的对象了。如果我们修改 newUser 中的 address 对象的值的话, user对象中的 address 的值是不会被修改的。

    public static void main(String[] args) {User user=new User();user.setName("Tango");user.setPassword("123456");user.setAddress(new Address("anhui","hefei","shushan"));User newUser=user.clone();System.out.println(user==newUser);System.out.println(user.getAddress()==newUser.getAddress());newUser.getAddress().setCity("beijing");System.out.println(JSON.toJSONString(user));System.out.println(JSON.toJSONString(newUser));}

输出结果:

false
false
{"address":{"area":"shushan","city":"hefei","province":"anhui"},"name":"Tango","password":"123456"}
{"address":{"area":"shushan","city":"beijing","province":"anhui"},"name":"Tango","password":"123456"}

这种方式就能实现深拷贝,但是问题是如果我们在 User 中有很多个对象,那么 clone 方法就写的很长,而且如果后面有修改,在 User 中新增属性,这个地方也要修改。

那么,有没有什么办法可以不需要修改,一劳永逸呢?

序列化实现深拷贝

我们可以借助序列化来实现深拷贝。先把对象序列化成流,再从流中反序列化成对象,这样就一定是新的对象了。序列化的方式有很多,比如我们可以使用各种 JSON 工具,把对象序列化成 JSON 对象,然后再从字符串中反序序列化成对象。

如果使用 fastjson 实现:

User newUser =JSON.parseObject(JSON.toJSONString(user),User.class);

也可以实现深拷贝。

除此之外,还可以使用 org.springframework.util 中提供的 SerializationUtils 工具实现。

我们需要修改下上面的 User 和 Address 类,使他们实现 Serializable接口,否则是无法进行序列化的。

public class Address implements Serializable
public class User  implements Serializable

然后再需要拷贝的时候:

User newUser = (User) SerializationUtils.deserialize(SerializationUtils.serialize(user));

同样,也可以实现深拷贝啦~!

http://www.15wanjia.com/news/223.html

相关文章:

  • 网站优化推广 视屏百度公司网站推广怎么做
  • 浙江省网站建设公司排名销售人员培训课程有哪些
  • 网站banner规格惠东seo公司
  • 长沙环路建设开发有限公司网站网络广告策划书案例
  • WordPress阿里ossseo推广哪家公司好
  • 沈阳网络科技公司排名seo裤子的关键词首页排名有哪些
  • 专业网站建设特点分析推广引流网站
  • 成都装修公司哪家实惠seo技术有哪些
  • 做国外网站收款怎么收武汉seo学徒
  • 什么是网站优化主要包括那几个百度收录关键词查询
  • 企石网站建设天津疫情最新情况
  • 东莞凤岗网站建设制作搭建一个网站需要多少钱?
  • 南软科技网站开发谷歌广告平台
  • 萍乡网站制作公司网站模板图片
  • 网站开发的选题依据保定seo外包服务商
  • 做软件项目需不需要有网站网络媒体广告代理
  • 关于网站建设的知识制作一个网站需要多少费用
  • 蓝田县住房与城乡建设局网站抖音视频排名优化
  • 青岛建网站公司seo中介平台
  • 在哪里可以学做网站百度知道下载安装
  • 新闻网站建设条件公关公司的主要业务
  • 设计做网站通用cms的源代码pc端百度
  • 没有网站可以做cpa广告么培训心得体会100字
  • 牌具做网站可以吗seo职位描述
  • 杭州 专业网站建设 网络服务seo优化个人博客
  • 金科科技 做网站社交网络推广方法
  • 建设视频网站流量百度推广一个点击多少钱
  • 网站大全下载软件安装营销型网站建设题库
  • 遵义做网站竞价排名是什么意思
  • 合肥seo外包平台引擎优化seo是什么