首页 > 编程语言 >牛客网刷Java记录第一天

牛客网刷Java记录第一天

时间:2023-09-28 13:11:39浏览次数:28  
标签:setValue Java String 网刷 value 牛客 finally MESSAGE public

第一题

下列程序输出啥?

public class StringDemo{
  private static final String MESSAGE="taobao";
  public static void main(String [] args) {
    String a ="tao"+"bao";
    String b="tao";
    String c="bao";
    System.out.println(a==MESSAGE);
    System.out.println((b+c)==MESSAGE);
  }
}

解析:
做这道题之前,需要明白三个知识点:

  1. ==符号比较引用类型时,比较的是双方的地址。
  2. String s = "xxx"或者,String s = "xxx" + "yyy",这种创建String类型变量的情况,都是把变量存到常量池中。
  3. new 类名()会在堆中创建一个对象,堆中地址当然和常量池的地址不一样。两个一模一样的玩具,一个在客厅,一个在卧室。

我在做这道题的时候,在想这样一个问题:静态常量的字符串也是存在常量池中的吗?通过在idea中debug,验证了我的猜想:静态常量的字符串也是存在常量池中的。
于是,a==MESSAGE就是对的。
那么,b+c==MESSAGE呢?通过追踪源码可知,因为b+c变量相加,所以在底层会创建一个StringBuilder类型的变量来存储b+c的结果,存好之后,又转换为String类型,这个String类型是由StringBuilder转化过来的,但是地址还是在堆中,所以它的地址也就和MESSAGE不同,那么结果也就是false。

答案:
true false

第二题

下列程序输出啥

class Test {
    public static void main(String[] args) {
        System.out.println(new B().getValue());
    }

    static class A {
        protected int value;

        public A(int v) {
            setValue(v);
        }

        public void setValue(int value) {
            this.value = value;
        }

        public int getValue() {
            try {
                value++;
                return value;
            } finally {
                this.setValue(value);
                System.out.println(value);
            }
        }
    }

    static class B extends A {
        public B() {
            super(5);
            setValue(getValue() - 3);
        }

        public void setValue(int value) {
            super.setValue(2 * value);
        }
    }
}

解析:
这题考察try-catch和多态的动态绑定机制,还涉及了一点静态内部类。
必备知识:

  • 学会idea的debug功能
  • try-catch中如果有return语句
    • finally没有返回值,先把return的值保存起来。执行完finally后,执行return,返回的是保存起来的值,而不是finally中改变的值!
    • finally有返回值,会覆盖掉try-catch中的return语句。
  • 执行一个对象的方法时,是看这个对象的运行类型,啥是运行类型?就是new一个对象时,new后面那个类型。如果这个运行类型的类中没有调用的方法,就一层一层地去父类中找。如果用super.方法名(),那么直接去父类中找方法。再提一嘴,方法名()等价于this.方法名()this是啥?就是程序当前执行的方法的调用者

回到题目,这道题用语言来描述会有点麻烦,大家可以了解一下我前面所说的必备知识,然后自己思考一下执行流程,一定要在idea中debug一下,只需要在main方法中打一个断点即可,看看整个程序的执行流程,以后再遇到类似的题目,基本没啥问题。

答案:
22 34 17

标签:setValue,Java,String,网刷,value,牛客,finally,MESSAGE,public
From: https://www.cnblogs.com/yx-study/p/17735510.html

相关文章

  • 基于Java开发的企事业移动培训考学系统
    一、前言:随着移动技术的飞速发展,企事业培训考试系统也面临着不断的升级和改进。为了更好地满足用户的需求,本文将介绍一款企事业移动培训考学系统,并围绕该系统的功能、特点、应用场景等方面进行详细阐述。二、系统功能企事业移动培训考学系统具有丰富多样的功能,可以满足不同用......
  • JavaScript——小数精度丢失问题
    JavaScript小数进行数值运算时出现精度丢失问题1.原因:JavaScript的number类型在进行运算时都先将十进制转二进制,此时,小数点后面的数字转二进制时会出现无限循环的问题。为了避免这一个情况,要舍0进1,此时就会导致精度丢失问题。2.如何解决:(1)保留小数位数toFixed()constnumObj=......
  • java用Stream一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计
    getAverage():它返回所有接受值的平均值。getCount():它计算所有元素的总数。getMax():它返回最大值。getMin():它返回最小值。getSum():它返回所有元素的总和。示例:@GetMapping("/list")publicvoidlist(){List<InputForm>inputForms=inputFormMapper.se......
  • Java 21 新特性:虚拟线程(Virtual Threads)
    在Java21中,引入了虚拟线程(VirtualThreads)来简化和增强并发性,这使得在Java中编程并发程序更容易、更高效。虚拟线程,也称为“用户模式线程(user-modethreads)”或“纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它们可以比传统线程创建......
  • java.lang.IllegalStateException: javax.websocket.server.ServerContainer not avai
    spring项目能正常运行,但是单元测试报错错误原因注册WebSocket的Bean与springboot内带tomcat冲突解决办法1.注释该类里面的代码(不推荐)2.@springBootTest注解添加webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT@SpringBootTest注解中,给出了webEnvironment参......
  • Java的类加载顺序
    1.类加载器Java虚拟机的类加载过程是由类加载器(ClassLoader)来实现的。类加载器负责将类装载到内存中,并为其创建一个Class对象。Java虚拟机定义了三种类加载器,分别为BootstrapClassLoader、ExtensionClassLoader、SystemClassLoader,它们按照层次关系进行组织,而且每个类加载器......
  • Java基础之变量
    一、Java中的变量1、什么是变量:变量就是存储数据的容器,是在内存中的一块存储空间,用来临时存储一个经常发生改变的数据。之所以是临时存储,是因为所有的计算机设备运行时的内存资源是非常有限的,所以需要不断的将不使用的数据清理。2、Java种数据的类型:变量是用来存储数据的,而数......
  • Java序列serialVersionUID字段
    Spring框架默认使用Java的序列化机制,也就是说,Spring默认使用Java的内置序列化器。Java的序列化机制中,每个序列化的对象都有一个serialVersionUID字段,这个字段用来标识序列化对象的版本。Java的序列化机制是这样的:当一个对象被序列化时,Java会先检查对象的类是否有一个名为"serialV......
  • 一文搞懂Java异步编程之FutureTask(转)
    背景Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。一、Thread狭隘的讲Java创建线程的方式只有一种,就是newThread实例。Thread本身是Runnable的实现并且它定义了Runna......
  • JAVA代码使用JNI的方式调用C/C++动态库
    JNI(javanativeinterface),通过JNI的方式调用动态库步骤比较麻烦,不用额外引入依赖,对java项目工程依赖侵入为0,类中含有native描述的方法都会与动态库去一一映射,能通过System.load()函数去加载动态库,这种方式主要使用的场景是java写好类(一般不是接口),让C或者C++去实现......