2024年Java对象的复制四种方式,netty架构原理图

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

private int number;

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

}

public class Test {

public static void main(String args[]) {

Student stu1 = new Student();

stu1.setNumber(12345);

Student stu2 = stu1;

stu1.setNumber(54321);

System.out.println(“学生1:” + stu1.getNumber());

System.out.println(“学生2:” + stu2.getNumber());

}

}

结果:

学生1:54321

学生2:54321

为什么改变学生2的学号,学生1的学号也发生了变化呢?

原因出在(stu2 = stu1) 这一句。该语句的作用是将stu1的引用赋值给stu2,

这样,stu1和stu2指向内存堆中同一个对象。如图:

è¿éå代ç ç

那么,怎么能干干净净清清楚楚地复制一个对象呢。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求有很多途径,

(1)将A对象的值分别通过set方法加入B对象中;

(2)通过重写java.lang.Object类中的方法clone();

(3)通过org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制;

(4)通过序列化实现对象的复制。

2、将A对象的值分别通过set方法加入B对象中

对属性逐个赋值,本实例为了演示简单就设置了一个属性:

Student stu1 = new Student();

stu1.setNumber(12345);

Student stu2 = new Student();

stu2.setNumber(stu1.getNumber());

我们发现,属性少对属性逐个赋值还挺方便,但是属性多时,就需要一直get、set了,非常麻烦。

3、重写java.lang.Object类中的方法clone()

先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。

在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。

3.1 浅克隆

一般步骤:

被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)

class Student implements Cloneable{

private int number;

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

@Override

public Object clone() {

Student stu = null;

try{

stu = (Student)super.clone();

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

return stu;

}

}

public class Test {

public static void main(String args[]) {

Student stu1 = new Student();

stu1.setNumber(12345);

Student stu2 = (Student)stu1.clone();

System.out.println(“学生1:” + stu1.getNumber());

System.out.println(“学生2:” + stu2.getNumber());

stu2.setNumber(54321);

System.out.println(“学生1:” + stu1.getNumber());

System.out.println(“学生2:” + stu2.getNumber());

}

}

结果:

学生1:12345

学生2:12345

学生1:12345

学生2:54321

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。

简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

è¿éåå¾çæè¿°

在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。3.2 深克隆

package abc;

class Address implements Cloneable {

private String add;

public String getAdd() {

return add;

}

public void setAdd(String add) {

this.add = add;

}

@Override

public Object clone() {

Address addr = null;

try{

addr = (Address)super.clone();

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

return addr;

}

}

class Student implements Cloneable{

private int number;

private Address addr;

public Address getAddr() {

return addr;

}

public void setAddr(Address addr) {

this.addr = addr;

}

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

@Override

public Object clone() {

Student stu = null;

try{

stu = (Student)super.clone();   //浅复制

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

stu.addr = (Address)addr.clone();   //深度复制

return stu;

}

}

public class Test {

public static void main(String args[]) {

Address addr = new Address();

addr.setAdd(“杭州市”);

Student stu1 = new Student();

stu1.setNumber(123);

stu1.setAddr(addr);

Student stu2 = (Student)stu1.clone();

System.out.println(“学生1:” + stu1.getNumber() + “,地址:” + stu1.getAddr().getAdd());

System.out.println(“学生2:” + stu2.getNumber() + “,地址:” + stu2.getAddr().getAdd());

addr.setAdd(“西湖区”);

System.out.println(“学生1:” + stu1.getNumber() + “,地址:” + stu1.getAddr().getAdd());

System.out.println(“学生2:” + stu2.getNumber() + “,地址:” + stu2.getAddr().getAdd());

}

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

image.png

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

后端JAVA面试大全

[外链图片转存中…(img-3Wp59HVp-1714844859508)]

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

[外链图片转存中…(img-f92U8546-1714844859509)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

[外链图片转存中…(img-IQcfOKjy-1714844859509)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值