面试题 | 一道有趣的 Java 基础题

50道Java经典面试题总结 (1)Semaphore 同步器特征:经典的信号量,通过计数器控制对共享资源的访问Semaphore(int count): 创建拥有 count 个许可证的信号量acquire()/acquire(int num) : 获取 1/num 个许可证release/release(int num) : 释放 1/num 个许可证(2)CountDownLatch 同步器特征:必须发生指定数量的事件后才可以继续运行 (比如赛跑比赛,裁判喊出 3,2,1 之后大家才同时跑) 阅读详情

目录

一、问题

二、测试

三、分析

四、小结


一、问题

        在一个 Java 群里有位群友分享了一道关于 Java 的题目,问代码是否抛异常。代码如下:

public class Hello {
    static String a, b;
    public static void main(String[] argc) {
        a = a + b;
        System.out.println(a);
    }
}

        对于该问题,我只知道是不会抛出异常的,但是对于输出的结果我认为是空字符串。不知道大家是怎么考虑的。后来这位群友,给出的答案是不会抛出异常,输出的结果是 nullnull,且计算长度是 8 。感觉比较有意思,就自己分析了一下。

二、测试

        在对这个结果产生兴趣时,我先进行了测试,将代码进行编译并运行,输出情况如下:

PS C:\Users\Administrator\Desktop> java Hello
nullnull

      肉眼直接观察,输出的结果的确是 nullnul,而长度也肯定是 8。那么为什么呢?还是需要从 Java 的内部去进行了解。

三、分析

        分析的最直接的方法应该是看 JDK 的源码,但是 JDK 的代码浩如烟海,不知从何看起。那么就直接看其反汇编代码。其反汇编代码如下:

0: new           #2                  // class java/lang/StringBuilder
 3: dup
 4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
 7: getstatic     #4                  // Field a:Ljava/lang/String;
10: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
13: getstatic     #6                  // Field b:Ljava/lang/String;
16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: putstatic     #4                  // Field a:Ljava/lang/String;
25: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
28: getstatic     #4                  // Field a:Ljava/lang/String;
31: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
34: return

        我没有了解过 JVM 的指令,但是我了解过安卓 Dalvik 的 Smali 指令。两者在设计上虽然有所区别,但是实际还是比较相似的。不过本身这种虚拟机的指令抽象程度较高,也算是比较好理解。那么,这里我们就来看 StringBuilder 的 append 方法的源码(如果不看反汇编代码,我根本想不到这里要看的是 StringBuilder 类的 append 方法)。虽然,StringBuilder 有多个重载的 append 方法,但是根据反汇编指令也能够知道具体调用的是哪个方法。其源码如下:

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

        这里直接调用了其父类的方法,接着往上看它的代码,代码如下:

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

        该代码在 AbstractStringBuilder 类中,通过上面的代码可以知道,当 str 为 null 时,会调用 appendNull 方法,该方法的代码如下:

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}

        从以上代码就不难看出,输出结果为什么是 nullnull 的情况了。

四、小结

        这样的问题意义何在呢?我个人觉得,在项目中总会出现各种奇奇怪怪的问题,而一些奇奇怪怪的问题却是我们平时疏忽的基础或细节造成的,因此也在空闲之余,多多关注基础知识和技术细节,会有助于自己解决很多奇奇怪怪的问题。

图片

最新50万字312道Java经典面试题52道场景题总结(附答案PDF) 最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题;花了3个月的时间将市面上所有的面试题整理总结成了一份50万字的300道Java高频面试题64道场景题,分享给大家,希望大家都能拿到心仪的offer! 阅读详情

相关推荐

一道快速考察 Python 基础的面试题

这是前一阵子群友发在群里的一道面试题,利用 Python 字典的特性,可以巧妙地使用精简代码达成完美解。 题目 将 data 转换成 new_data 这种形式,写出转换过程。 data = { 'a_b_h':1, 'a_b_i':2, 'a_c_j':3, 'a_d':4, 'a_c_k':5, 'a_e':6 } new_data = {...

面向人生编程 2033

最近找工作,搜刮了一些Java面试题,涨涨知识

Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的...

chuyijun0137的博客 534

关于java的一个有趣的问题

帮助你了解Java的string类的创建原理

Java面试八股文必备闯关秘籍:第一章-Java基础篇

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。装箱:将基本类型转换成包装类对象拆箱:将包装类对象转换成基本类型的值java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List list=new ArrayList();list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。

qq_46053741的博客 1653

java面试趣味题目(含答案)

面试趣味题目(含答案)

《Sigrity SystemSI 2023+LPDDR4仿真自学笔记》(一)创建工程(Part1)

为了加强SystemSI 2023软件的熟悉度,咱们完整的走一个仿真全流程。

weixin_45199544的博客 6334

String的一些面试题

String的一些面试题

weixin_54398380的博客 1209

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1450

Java练习题(经典8题)

Java经典题(硬币,鸡兔,质数,公约数,公倍数,乘法表,二维数组,水仙花数)

weixin_60629460的博客 9331

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

从零到一:基于Blazor和Elsa Workflows的工作流系统开发实战

本文详细介绍了如何利用Blazor和Elsa Workflows构建高效的工作流系统,从技术选型到生产环境部署,涵盖动态工作流建模、Blazor前端集成及性能优化等核心内容。通过实战案例,展示如何实现订单处理系统的自动化与灵活性,提升企业流程效率。

weixin_26875109的博客 429

Java基础面试题50题

1,""空字符串的作用 package com.neuedu.nineteen; public class Test { public static void main(String[] args) { String s=""; for (char i = 'a'; i < 'd'; i++) { s=s+i;//输出...

渣渣的成长之路 6万+

块坐标下降法实战:如何用Python一步步优化无人机通信网络?

本文通过Python实战案例,详细介绍了块坐标下降法在优化无人机通信网络中的应用。文章以最大化网络吞吐量为目标,将复杂的非凸问题拆解为功率分配和轨迹规划两个子问题,并提供了完整的算法实现、代码示例及调参指南,为机器学习工程师解决类似优化问题提供了实用参考。

sat99的博客 975

Java面试题火了:这可能是历史上最简单的一道面试题了

来自:知乎 这可能是历史上最简单的一道Java面试题了。 题目很简单,完成代码,判断一个整数是否是奇数: public boolean isOdd(int i) 相信相当数量的人都已经在准备吐槽了,只要看过《编程珠玑》的人都知道这道题的答案和其中极为简单的道理。不过别着急骂街,不管你信不信,这道笔试题我拿到的答案好多都长这样: public boolean isOdd(int i) ...

优快云头条 1万+

IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT

摘要:启动EtherCAT主站实践指南 本章详细介绍了如何配置和启动EtherCAT主站系统,主要内容包括: 配置文件详解:讲解/etc/ethercat.conf中的关键配置项,包括主网卡指定、冗余备份设置和网卡驱动选择。 启动流程:说明通过systemd服务和手动命令两种方式加载内核模块,重点介绍了ec_master和ec_generic模块的加载顺序及验证方法。 命令行工具:列举ethercat工具的常用命令,如查看主站状态、扫描从站设备、读取PDO/SDO数据等。 示例程序:简要介绍内核态示例min

从事嵌入式linux android驱动开发,拥有全栈能力 311

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3192

一道有意思的“初始化”面试题

关于初始化,可能你并没有完全了解

程序员囧辉 2万+

DeepSeek + 微信:手把手教你把 AI 接入个人微信,秒变“高情商”聊天助手(防封指南)

将 DeepSeek 接入微信,本质上是给你的微信装了一个**“最强外挂”**。它不仅能帮你回消息,还能帮你写周报、查资料、甚至陪聊解闷。工具是服务于人的,不要让 AI 完全替代了你的真情实感。毕竟,真正的高情商,是屏幕背后那个在乎对方的你。先申请一个小号,按照步骤跑通流程。然后试着调整 Prompt,训练一个属于你自己的“嘴替”吧!

BUG猿的博客 959

一道Java基础题

public static void main(String[] args) { int a = Integer.MAX_VALUE -100; int b = Integer.MAX_VALUE; int count = 0; for (int i = a; i <= b ; i++) { count+...

搬砖的孟达的博客 261

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java基础常见面试题及详细答案(总结40个)

最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案。 为此我业余时间整理了40道Java基础常见的面试题及详细答案,望各路大牛发现不对的地方不吝赐教,留言即可。 八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动装箱,常量池 Object有哪些公用方法 Java的四种引用,强弱软虚,用到的场景 Hashcode的作用 HashMap的hashcode的作用 为什么重载hashCod

ayouki123456的博客 4万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多新的框架,比如 Spring Boot、Spring Cloud 等,但类似的面试题却极少。 相比与这些问题,我的这 208 道面试题,包含了以下 4 个特点: 披沙拣金提炼出每个 Java 模块中...

磊哥聊Java 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java面试(Java基础题)附带找题刷题方法!!

博主是一名软件工程专业的大三学生,最近也是在找实习,博主是简历没少投但是回应却较少,步过话又说回来,若是投中了去面试却没有过那可盖了帽了(完了的意思)。所以我会分享一些Java的面试题大部分都是博主遇到过的。没有什么顺序就是想到哪题说那题。

m0_73785825的博客 808

挑战一道Java基础的面试题

最近面试了一些应聘者,错误率最高的就是这道Java基础题了,大家一起看看吧。 题目是这样设计的: 父类有一个方法,子类重写了该方法;那么使用多态调用该方法时,调用的是父类的还是子类的? 父类有一个属性,子类也定义了这个属性;那么使用多态调用该属性时,调用的是父类的还是子类的? 先看第一个,如下 public class Father { public void method(){ System.out.println("father..."); } } //子类重写了父

weixin_49527334的博客 1571

转自知乎 知乎ID@方志宏 记一道简单的Java面试题

转自知乎 知乎ID@方志宏 记一道简单的Java面试题 这可能是历史上最简单的一道Java面试题 题目很简单,完成代码,判断一个整数是否是奇数 public boolean isOdd(int t) ...

qq_41917701的博客 1083

最简单的一道Java面试题,却让很多大牛踩了坑

这可能是历史上最简单的一道 java 面试题了。最简单的一道Java面试题,却让很多大牛踩了坑 整理了最新2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含微服务、netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需:点击、点击这里领取!!! 暗号:优快云 简单的Java面试题目 题目很简单,完成代码,判断一个整数是否是奇数: public boolean isOdd(int i)

a3961401的博客 4752

Java基础面试题

Java基础 必知必会面试题 Java基础,面向对象,String,IO 其他内容面试题文章中有链接... 持续更新中...

weixin_46030002的博客 4159
上一篇: 大数据 | Java 操作 HDFS 常用 API
下一篇: Redis | 源码阅读 —— 字符串
码农UP2U
博客等级 码龄14年 6276粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农UP2U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值