31 道 Java 核心面试题,统统打包给你!
01、请说出 Java 14 版本中更新的重要功能。
-
switch表达式; -
instanceof增强表达式,预览功能; -
文本块,第二次预览; -
Records,预览功能。
-
文本块,预览功能; -
switch表达式,预览功能; -
JavaSocket 重新实现; -
FileSystems.newFileSystem() 方法; -
支持Unicode 12.1; -
可伸缩、低延迟的垃圾收集器改进,用于返回未使用的内存。
-
JVM 更新; -
File.mismatch() 方法; -
紧凑型数字格式; -
String类新增了一些方法,比如说 indent()。
-
可以直接使用 java 命令运行 Java 程序,源代码将会隐式编译和运行。 -
String类新增了一些方法,比如说 isBlank()、lines()、strip() 等等; -
Files类新增了两个读写方法,readString() 和 writeString(); -
可以在 Lambda 表达式中使用 var 作为变量类型。
-
局部变量类型推断,举个例子,var list = newArrayList();,可以使用 var 来作为变量类型,Java 编译器知道 list 的类型为字符串的 ArrayList; -
增强 java.util.Locale; -
提供了一组默认的根证书颁发机构(CA)。
-
模块系统; -
不可变的 List、Set、Map 的工厂方法; -
接口中可以有私有方法; -
垃圾收集器改进。
-
函数式编程和 Lambda 表达式; -
Stream 流; -
JavaDate Time API; -
接口中可以使用默认方法和静态方法。
-
抽象 -
封装 -
多态 -
继承
09、Java 声称的平台独立性指的是什么?
-
加载字节码 -
验证字节码 -
执行字节码 -
提供运行时环境
-
存储区 -
类文件格式 -
寄存器组 -
垃圾回收堆 -
致命错误报告等
-
启动类加载器(Bootstrap Class-Loader),加载 jre/lib 包下面的 jar 文件,比如说常见的 rt.jar(包含了 Java 标准库下的所有类文件,比如说 java.lang 包下的类,java.net 包下的类,java.util 包下的类,java.io 包下的类,java.sql 包下的类)。 -
扩展类加载器(Extension or Ext Class-Loader),加载 jre/lib/ext 包下面的 jar 文件。 -
应用类加载器(Application or App Clas-Loader),根据程序的类路径(classpath)来加载 Java 类。
ClassNotFoundException 和 NoClassDefFoundError 等异常。
public class Test {
public static void main(String[] args) {
ClassLoader loader = Test.class.getClassLoader();
while (loader != null) {
System.out.println(loader.toString());
loader = loader.getParent();
}
}
}
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@4617c264
-
PC寄存器(PC Register),也叫程序计数器(Program Counter Register),是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器。 -
JVM 栈(Java Virtual Machine Stack),与 PC 寄存器一样,JVM 栈也是线程私有的。每一个 JVM 线程都有自己的 JVM 栈,这个栈与线程同时创建,它的生命周期与线程相同。 -
本地方法栈(Native Method Stack),JVM 可能会使用到传统的栈来支持 Native 方法(使用 Java 语言以外的其它语言[C语言]编写的方法)的执行,这个栈就是本地方法栈。 -
堆(Heap),在 JVM 中,堆是可供各条线程共享的运行时内存区域,也是供所有类实例和数据对象分配内存的区域。 -
方法区(Method area),在 JVM 中,被加载类型的信息都保存在方法区中。包括类型信息(Type Information)和方法列表(Method Tables)。方法区是所有线程共享的,所以访问方法区信息的方法必须是线程安全的。 -
运行时常量池(Runtime Constant Pool),运行时常量池是每一个类或接口的常量池在运行时的表现形式,它包括了编译器可知的数值字面量,以及运行期解析后才能获得的方法或字段的引用。简而言之,当一个方法或者变量被引用时,JVM 通过运行时常量区来查找方法或者变量在内存里的实际地址。
-
解释器:读取字节码流,然后执行指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢。 -
即时(Just-In-Time,JIT)编译器:即时编译器用来弥补解释器的缺点,提高性能。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码。然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行。执行本地代码比一条一条进行解释执行的速度快很多。编译后的代码可以执行的很快,因为本地代码是保存在缓存里的。
-
标准版(大多数开发人员用的就是这个) -
企业版 -
微型版
17、Java 中 `main()` 方法的重要性是什么?
public static void main(String[] args) {}
-
public关键字是另外一个访问修饰符,除了可以声明方法和变量(所有类可见),还可以声明类。main() 方法必须声明为 public。 -
static关键字表示该变量或方法是静态变量或静态方法,可以直接通过类访问,不需要实例化对象来访问。 -
void关键字用于指定方法没有返回值。
java HelloWorld 沉默王二 沉默王三
public class HelloWorld {
public static void main(String[] args) {
if ("沉默王二".equals(args[0])) {
}
if ("沉默王三".equals(args[1])) {
}
}
}
public static void main(String []args) { }
public static void main(String args[]) { }
public static void main(String...args) { }
public strictfp static void main(String[] args) { }
public static void main(final String[] args) { }
final static synchronized strictfp void main(final String[] args) { }
class LaoWang{
public void write() {
System.out.println("老王写了一本《基督山伯爵》");
}
}
public class XiaoWang extends LaoWang {
@Override
public void write() {
System.out.println("小王写了一本《茶花女》");
}
}
public class OverridingTest {
public static void main(String[] args) {
LaoWang wang = new XiaoWang();
wang.write();
}
}
小王写了一本《茶花女》
class LaoWang{
public void read() {
System.out.println("老王读了一本《Web全栈开发进阶之路》");
}
public void read(String bookname) {
System.out.println("老王读了一本《" + bookname + "》");
}
}
public class OverloadingTest {
public static void main(String[] args) {
LaoWang wang = new LaoWang();
wang.read();
wang.read("金瓶梅");
}
}
如果在一个类中有多个相同名字的方法,但参数不同,则称为方法重载。
父类中有一个方法,子类中有另外一个和它有相同签名(方法名相同,参数相同、修饰符相同)的方法时,则称为方法重写。子类在重写父类方法的时候可以加一个@Override 注解。
public class MainTest {
public static void main(String[] args) {
System.out.println("main(String[] args)");
}
public static void main(String[] args,String arg) {
System.out.println("(String[] args,String arg");
}
}
-
使相关类型更容易查找; -
避免命名冲突,比如说 com.itwanger.Hello 和 com.itwangsan.Hello 不同; -
通过包和访问权限控制符来限定类的可见性。
-
应该全部是小写字母; -
可以包含多个单词,单词之间使用“.”连接,比如说 java.lang; -
名称由公司名或者组织名确定,采用倒序的方式,比如说,我个人博客的域名是 www.itwanger.com,所以我创建的包名是就是 com.itwanger.xxxx。
package com.cmower.bb;
public class PackageTest {
public static void main(String[] args) {
Boolean.toString(true);
}
}
class Dog {
}
-
同一个类中,不管是哪种权限修饰符,都可以访问; -
同一个包下,private 修饰的无法访问; -
子类可以访问 public 和 protected 修饰的; -
public修饰符面向世界,哈哈,可以被所有的地方访问到。
25、finally 和 finalize 有什么区别?
import java.lang.Math;
double test = Math.PI * 5;
import static java.lang.Math.PI;
double test = PI * 5;
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
更多精彩推荐
☞
点分享 点点赞 点在看