Java基础常见面试问题汇总
1、 一个.java源文件中可以包含多个类,但仅允许一个类被声明为 public,且该 public 类的名称必须与文件名完全相同。此外,Java 语言中确实存在 goto 这个关键字,但它属于保留字,并未实际启用,因此在当前版本的 Java 中并不具备功能,不能用于程序控制流程。
2、 &和&&都可作为逻辑与运算符,用于判断两个表达式是否同时为真,只有当两边结果均为true时,整体结果才为true,否则为false。两者的区别在于,&&具有短路特性,若第一个表达式已为false,则不再执行第二个表达式的计算;而&无论第一个表达式结果如何,都会对第二个表达式进行求值。因此,在条件判断中使用&&可以提高效率并避免不必要的错误。
3、 在表达式 if(str != null && !str.equals()) 中,若 str 为 null,由于采用了短路与(&&),后半部分的判断不会执行,因此不会抛出空指针异常。然而,若将 && 替换为 &,则不论 str 是否为 null,整个表达式都会被求值,此时访问 null 对象的方法会引发 NullPointerException。类似地,在条件判断 if(x == 33 & ++y > 0) 中,无论 x 是否等于 33,y 都会自增;而使用 if(x == 33 && ++y > 0) 时,只有当 x 确实等于 33 时才会计算后半部分,y 才会增加。此外,& 还可作为位运算符使用。当操作数并非布尔类型时,& 表示按位与运算,用于对二进制位进行逐位操作,这使其在逻辑运算和数值处理中具有双重用途。
4、 我们常用0x0f与整数进行按位与运算,提取其低4位bit值,例如0x31 & 0x0f结果为0x01。两者都可用于条件判断,但&&是逻辑运算符,支持短路求值,常用于布尔表达式;&是位运算符,对二进制位逐位操作,适用于掩码处理。典型应用如空指针检查用&&避免异常,用&实现权限控制或数据提取,体现对底层操作的熟练掌握。
5、 在 Java 中,若需跳出多层嵌套循环,可采用带标签的 break 语句实现。具体方法是在外层循环前设置一个标签,例如使用ok:标记外层 for 循环。当程序执行到内层循环时,若满足特定条件,便可使用break 标签名的方式直接终止对应的外层循环,从而跳出多层嵌套结构。例如,在外层循环前标注 ok:,进入内层循环后,当某个变量达到指定值(如 j 等于 5)时,执行 break ok;,此时不仅结束内层循环,同时跳出整个外层循环,避免了继续遍历不必要的数据。这种方式简洁有效,适用于需要从深层循环中快速退出的场景,提高了代码的控制灵活性和执行效率。
6、 在实际编程中,我一般不采用标签来控制循环流程,而是通过调整外层循环的条件判断,使其能够受到内层循环执行过程的影响。比如,在一个二维数组中查找特定元素时,可以定义一个布尔变量作为查找状态的标记。以寻找数值5为例,声明一个二维数组 int arr = {{1, 2, 3}, {4, 5, 6, 7}, {9}}; 并设置 boolean found = false; 作为查找成功的标志。外层循环遍历行,其继续执行的前提是当前行索引小于数组长度且尚未找到目标值,即 i < arr.length && !found。进入内层循环后,逐个遍历当前行的元素,同时输出当前的行列下标。一旦发现某个元素等于5,就将 found 设为 true,此时外层循环的条件不再满足,循环整体终止,从而实现提前退出双重循环的效果。这种方法避免了使用 break 标签,使代码结构更清晰、易于理解,同时也保持了良好的可读性和逻辑性。
评论
更多评论