【秋招冲刺-每日打卡】应届生JAVA岗-每日5道高频面试题【Day4】-基础篇(4)_age shorts

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

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

一: 前言
  • 大家好,这里是IT学习日记,一个非双一流大学毕业的深漂族,年少曾憧憬大厂,面试过许多家公司,也曾踩过无数坑,深知面试技巧和知识广度与深度对一个应届生乃至工作多年的开发者的重要性
  • 故特意收集了各个公司、大厂的面试高频题,通过每天打卡的方式,和大家一起记录和学习,希望能够帮助到应届生和开发者们少走弯路,一起冲向大厂!!!

每日壁纸

二: 面试题目

一: 深拷贝和浅拷贝的区别是什么?

在讲解拷贝知识前,我们先来了解下JAVA中的数据类型,主要分为以下两种:

1、基本类型: 也叫做值类型,主要是值JAVA自带的8种数据类型即:byte、char、short、int、long、float、double、boolean。

2、引用类型: JAVA中除了基本类型,其他的称为引用类型,常见的如:对象、数组、枚举 等。

3、在JAVA中,基本类型是存放在栈中的,而引用类型实际上是存在堆中,然后在栈中存在一个指针指向堆中的实际对象数据。

在这里插入图片描述

拷贝: 实际上就是复制的意思,跟平常我们使用ctrl+c命令的效果一样,但在JAVA中,它是区分为浅拷贝和深拷贝两种。

(一) 浅拷贝:

复制出来的对象跟原来的对象有相同的值,但是如果被复制对象中包含有其他类型对象时,只会复制这个对象的引用

如:A对象中有一个属性叫demo是B类型的对象,那么浅拷贝时,复制出来的C对象里面的demo属性和A对象都是指向同一个对象,如果修改C对象里面的demo属性,那么A对象中的demo属性也会被修改,因为它们指向的是相同的一个对象。

对象想具有拷贝功能,需要满足以下的两个条件(注意:Object提供的clone方法默认只实现浅拷贝):

1、实现Clonable接口

2、重写Clonable接口中的clone方法

浅拷贝样例图和代码:

在这里插入图片描述

在这里插入图片描述

public class CloneDemo {
    public static void main(String[] args) throws Exception{
        Demo1 demo1 = new Demo1("1",2,new Demo2("3",4));
        System.out.println("原来的对象数据:" + demo1);

        // 浅拷贝
        Demo1 cloneDemo = (Demo1) demo1.clone();
        System.out.println("拷贝出来的对象数据:" + cloneDemo);

        // 修改拷贝对象的属性
        cloneDemo.setAge(100);
        cloneDemo.setAgeCone(100);
        cloneDemo.setUserName("test");
        cloneDemo.setS1(Short.valueOf("200"));
        cloneDemo.getDemo2().setDemo2Age(1000);
        System.out.println();
        System.out.println("修改拷贝出来的对象引用类型属性:被拷贝对象的数据" + demo1);
        System.out.println("修改拷贝出来的对象引用类型属性:拷贝出来的对象数据" + cloneDemo);
    }
}


@Data
class Demo1 implements Cloneable{
    private String userName;
    private Integer age;
    private Short s1 = new Short("100");
    private Integer ageCone = new Integer(900);
    private Demo2 demo2;

    public Demo1(String userName, Integer age, Demo2 demo2) {
        this.userName = userName;
        this.age = age;
        this.demo2 = demo2;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Demo1{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", s1=" + s1 +
                ", ageCone=" + ageCone +
                ", demo2=" + demo2 +
                '}';
    }
}

@Data
class Demo2 implements Cloneable{
    private String demo2Username;
    private Integer demo2Age;

    public Demo2(String demo2Username, Integer demo2Age) {
        this.demo2Username = demo2Username;
        this.demo2Age = demo2Age;
    }
}

(二) 深拷贝:

复制出来的对象拥有和原来对象相同的一套属性值,里面的属性和被复制的对象是相互独立的,修改任何一个对象都不会对另外一个对象产生影响,

从上面可以知道Object提供的clone方法只能实现浅拷贝,如果想实现深拷贝,可以采取以来两种方法:

1、每个引用类型内部都实现cloneable接口并重写clone方法即可。

2、使用序列化和反序列化(前提是类需要实现序列化接口Serializable)

注意:序列化是将对象写到流中便于网络传输或者持久化到磁盘,而反序列化则是把对象从流/磁盘中读取出来。这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们通过对象的序列化产生克隆对象,然后通过反序列化获取这个对象。

实现深拷贝方式一: 每个引用类型都实现Cloneable接口并重写clone方法

在这里插入图片描述

在这里插入图片描述

public class CloneDemo {
    public static void main(String[] args) throws Exception{
        Demo1 demo1 = new Demo1("1",2,new Demo2("3",4));
        System.out.println("原来的对象数据:" + demo1);

        // 深拷贝
        Demo1 cloneDemo = (Demo1) demo1.clone();
        System.out.println("拷贝出来的对象数据:" + cloneDemo);

        // 修改拷贝对象的属性
        cloneDemo.setAge(100);
        cloneDemo.setAgeCone(100);
        cloneDemo.setUserName("test");
        cloneDemo.setS1(Short.valueOf("200"));
        cloneDemo.getDemo2().setDemo2Age(1000);
        System.out.println();
        System.out.println("修改拷贝出来的对象引用类型属性:被拷贝对象的数据" + demo1);
        System.out.println("修改拷贝出来的对象引用类型属性:拷贝出来的对象数据" + cloneDemo);
    }
}


@Data
class Demo1 implements Cloneable{
    private String userName;
    private Integer age;
    private Short s1 = new Short("100");
    private Integer ageCone = new Integer(900);
    private Demo2 demo2;

    public Demo1(String userName, Integer age, Demo2 demo2) {
        this.userName = userName;
        this.age = age;
        this.demo2 = demo2;
    }

    @Override
    public String toString() {
        return "Demo1{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", s1=" + s1 +
                ", ageCone=" + ageCone +
                ", demo2=" + demo2 +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Demo1 demo1 = (Demo1) super.clone();
        Demo2 demo2 = (Demo2) demo1.getDemo2().clone();
        demo1.setDemo2(demo2);
        return demo1;
    }
}
@Data
class Demo2 implements Cloneable{
    private String demo2Username;
    private Integer demo2Age;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Demo2(String demo2Username, Integer demo2Age) {
        this.demo2Username = demo2Username;
        this.demo2Age = demo2Age;
    }

}

实现深拷贝方式二: 使用序列化和反序列化方式达到深拷贝
在这里插入图片描述

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

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

.(img-2iBneTEs-1715008040292)]
[外链图片转存中…(img-6nKTz4Qr-1715008040292)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

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

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 包含风险分析的软件工程模型是瀑布模型。 瀑布模型是软件开发过程中的一种传统模型。它按照严格的阶段性流程进行软件开发,包括需求分析、系统设计、编码、测试和运维等多个阶段。其特点在于每个阶段的输出作为下一个阶段的输入,流程严格按照顺序进行。 在瀑布模型中,风险分析是一个重要的环节。在需求分析阶段,软件团队会对项目进行风险评估,识别出可能存在的风险因素。然后,在系统设计阶段,根据识别的风险因素,制定相应的风险应对措施。在编码和测试阶段,会根据风险评估结果,针对性地进行代码检查和测试,以降低风险产生的可能性。最后,在运维阶段,会持续监控和评估项目的风险,及时采取措施进行调整。 风险分析在瀑布模型中的应用,有助于提前发现和解决问题,减少项目风险。它可以帮助软件团队在项目开始前,全面了解可能存在的风险,并制定针对性的风险应对策略。这样可以有效地提高项目管理的可控性,降低项目失败的风险,确保软件开发过程的顺利进行。所以,包含风险分析的软件工程模型是瀑布模型。 ### 回答2: 包含风险分析的软件工程模型是敏捷开发模型。 敏捷开发模型是一种灵活的软件开发方法,强调快速反馈和快速适应变化。与传统的瀑布模型不同,敏捷开发模型将软件开发过程划分为短周期的迭代,每个迭代称为一个“冲刺”。在冲刺开始前,团队根据需求列表选择开发的功能点,并制定对应的开发计划。 在敏捷开发模型中,风险分析是非常重要的一部分。在每个冲刺的规划阶段,团队将识别和评估潜在的风险因素,并制定相应的风险管理策略。风险分析的目的是为了预测可能出现的问题,并采取相应的措施来降低风险,以确保软件开发过程能够按时、按质完成。 风险分析的过程包括以下几个步骤: 1. 风险识别:团队会通过讨论、头脑风暴等方式,识别可能存在的风险因素,包括技术风险、需求风险、资源风险等。 2. 风险评估:对于已经识别出的风险因素,团队会评估其可能性和影响程度,以确定哪些风险是最关键的。 3. 风险规划:根据风险评估的结果,团队会制定相应的风险管理策略和应对措施,包括风险的防范、缓解、转移等。 4. 风险监控:在软件开发过程中,团队会不断监控风险的变化和进展,并及时调整风险管理策略。 通过风险分析,敏捷开发模型可以帮助团队更好地理解项目中可能面临的挑战和风险,并提前采取相应的措施,从而降低项目失败的概率。同时,敏捷开发模型也强调团队的协作和迭代反馈,能够更好地适应需求的变化和客户的反馈,提高软件开发的成功率。 ### 回答3: 包含风险分析的软件工程模型是瀑布模型。 瀑布模型是一种线性顺序的软件开发模型,它将软件开发过程划分为不同的阶段,包括需求分析、系统设计、编码、测试和维护等。瀑布模型有明确的阶段顺序和阶段之间的输入输出关系,每个阶段的输出成果作为下一个阶段的输入。 瀑布模型的特点之一就是风险管理和分析。在每个阶段结束前,开发团队需要进行风险分析,并采取相应的措施来降低风险。风险可以包括技术风险、需求风险、进度风险等等。通过风险分析,开发团队可以及时发现问题并采取相应的措施,以避免项目进展受阻或者出现严重的质量问题。 在瀑布模型中,风险分析主要包括以下几个步骤:确定风险来源、评估风险的概率和影响、制定相应的风险应对策略。通过这些步骤,可以帮助开发团队及时识别并应对潜在的风险,保证项目顺利进行。 总之,瀑布模型是包含风险分析的软件工程模型。通过风险分析,可以帮助开发团队识别和应对潜在的风险,确保软件项目的成功实施。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值