Java基础面试题

Java 基础

Java 语言有哪些特点?

  • 面向对象
  • 跨平台,平台无关性(JVM)一次编写,随处运行
  • 支持多线程
  • 编译与解释并存

JVM vs JDK vs JRE

JVM

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM。

JDK

JDK 是 Java Development Kit 缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序 JDK包含了JRE

JRE

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序

什么是字节码?采用字节码的好处是什么?

  • JVM可以理解的代码就叫字节码(.class)

  • 好处就是解决传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点

为什么说 Java 语言“编译与解释并存”?

编译与解释语言的区别

java文件通过编译器转成class文件具有编译语言的特点,但同时class文件在jvm中运行是一句一句解释,有解释语言的特点

Java和C++的区别

  • java不提供指针来直接访问内存
  • java的类是单继承的,C++支持多继承
  • java有垃圾回收机制,不需要手动释放内存

Java注释

  • 单行注释 //
  • 多行注释 /* */
  • 文档注释 /**

标识符和关键字的区别是什么?

  • 标识符就是一个名字
  • 关键字是被赋予特殊含义的标识符

自增自减运算符

例如,当 b = ++a 时,先自增(自己增加 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。

continue、break 和 return 的区别是什么?

  1. continue :指跳出当前的这一次循环,继续下一次循环。
  2. continue :指跳出当前的这一次循环,继续下一次循环。
  3. return 用于跳出所在方法,结束该方法的运行。

成员变量与局部变量的区别?

  • 成员变量可以被修饰符修饰(public,private,static)
  • 成员变量属于实例,存在堆中,局部变量存储在栈中
  • 成员变量属于实例,随着实例的创建而创建;局部变量随着方法调用而生成,随着方法的结束而消亡

静态变量有什么作用?

静态变量可以被类的所有实例共享。

字符型常量和字符串常量的区别?

  • 字符串是单引号的一个字符,字符串是双引号引起的若干个字符
  • 字符型对一个整数值,字符串对应一个地址值
  • 字符占2个字节,字符串占若干个字节

静态方法为什么不能调用非静态成员?

静态方法属于类的,类加载的时候就会分配内存,而非静态成员属于实例对象的,只有对象实例化后才存在,需要通过类的实例对象访问

静态方法和实例方法有何不同?

  • 调用方式:调用静态方法通过类名调用,实例方法需要创建实例才能调用
  • 访问类成员是否存在限制:静态方法只能访问静态成员,而实例方法没有限制

重载和重写有什么区别?

  • 重载:同样的方法名,入参不同,不同的实现
  • 重写:子类继承父类的方法,但实现不同

Java 中的几种基本数据类型了解么?

  • 6种数字类型:short、int 、long、double、float、byte
  • 1种字符类型:char
  • 1种布尔型:boolean

这 8 种基本数据类型的默认值以及所占空间的大小如下:

基本类型位数字节默认值取值范围
byte810-128 ~ 127
short1620-32768 ~ 32767
int3240-2147483648 ~ 2147483647
long6480L-9223372036854775808 ~ 9223372036854775807
char162‘u0000’0 ~ 65535
float3240f1.4E-45 ~ 3.4028235E38
double6480d4.9E-324 ~ 1.7976931348623157E308
boolean1falsetrue、false

基本类型和包装类型的区别?

  • 包装类型不赋值就是null,而基本类型有默认值
  • 包装类属于对象类型,存储在堆中
  • 基本类占用的空间非常小

包装类型的缓存机制了解么?

Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False源码

自动装箱与拆箱了解吗?原理是什么?

什么是自动拆装箱?

  • 装箱:将基本类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本数据类型;

我们发现装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。

因此,

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue();

为什么浮点数运算的时候会有精度丢失的风险?

因为计算机系统在表示一个数字的时候,宽度是有限的,无限循环的小数存储计算机的时候会被截断,导致精度发生损失

如何解决浮点数运算的精度丢失问题?

BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的。

面向对象和面向过程的区别

  • 面向对象会抽离出对象,用对象的执行方式解决问题
  • 面向过程是把问题拆成一个个方法去解决

创建一个对象用什么运算符?对象实体与对象引用有何不同?

  • 用new创建对象实例
  • 对象引用指向对象实体

对象的相等和引用相等的区别

  • 对象在地址中存放的内容是否相等
  • 内存地址是否一样

面向对象三大特征

  • 封装 把实现隐藏,提供外部接口进行调用
  • 继承将共类型对象快速创建
  • 多态 一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

  • 浅拷贝:拷贝对象和原对象共用同一个内部对象。
  • 深拷贝:会完全复制整个对象,包括这个对象所包含的内部对象。
  • 引用拷贝:两个不同的引用指向同一个对象

Exception 和 Error 有什么区别?

  • Exception:程序本身可以处理的异常
  • Error:程序无法处理的错误,JVM一般会终止运行

try-catch-finally 如何使用?

  • try:执行可能会出错的程序语句
  • catch:用于处理try后捕获的异常
  • finally:无论是否处理异常,都会执行finally语句

不要在 finally 语句块中使用 return,因为最后的finally会覆盖return内容

public static void main(String[] args) {
    System.out.println(f(2));
}

public static int f(int value) {
    try {
        return value * value;
    } finally {
        if (value == 2) {
            return 0;
        }
    }
}

0

如何使用 try-with-resources 代替try-catch-finally

//读取文本文件的内容
Scanner scanner = null;
try {
    scanner = new Scanner(new File("D://read.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

//使用 Java 7 之后的 try-with-resources 语句改造上面的代码:
try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

什么是泛型?有什么作用?

  • 引入的新特性
  • 编译器通过泛型参数检测,可以传入指定的对象类型,比如 ArrayList<Person> persons = new ArrayList<Person>() 这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错。

泛型的使用方式有哪几种?

  • 泛型类
  • 泛型方法
  • 泛型接口

什么是反射

提供让我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射的优缺点?

  • 优点:代码更加灵活,为框架的使用提供便利
  • 缺点:有安全问题

反射的应用场景

许多框架中也大量使用了动态代理,而动态代理的实现也依赖反射。

像 Java 中的一大利器 注解 的实现也用到了反射。

为什么你使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?

这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理。

序列化什么是序列化?什么是反序列化?

  • 序列化:把数据结构或对象转换成二进制字节流的过程
  • 反序列化:将序列化过程中的二进制字节流转换为数据结果或对象

常见应用场景:

  • 进行网络传输
  • 存储文件的时候
  • 存储到数据库
  • 存储到内存

如果有些字段不想进行序列化怎么办?

使用 transient 关键字修饰。

Java IO 流了解吗?

IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。

Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

I/O 流为什么要分为字节流和字符流呢?

  • 不知道编码类型的话,字节类容易出现乱码问题

Java IO 中的设计模式有哪些?

  • 装饰器模式:可以在不改变原有对象的情况下拓展其功能
    • 对于字节流来说, FilterInputStream (对应输入流)和FilterOutputStream(对应输出流)是装饰器模式的核心,分别用于增强 InputStreamOutputStream子类对象的功能。
  • 适配器(Adapter Pattern)模式 主要用于接口互不兼容的类的协调工作,你可以将其联想到我们日常经常使用的电源适配器。
    • InputStreamReaderOutputStreamWriter 就是两个适配器(Adapter), 同时,它们两个也是字节流和字符流之间的桥梁。InputStreamReader 使用 StreamDecoder (流解码器)对字节进行解码,实现字节流到字符流的转换,OutputStreamWriter 使用StreamEncoder(流编码器)对字符进行编码,实现字符流到字节流的转换。
  • 工厂模式用于创建对象

BIO、NIO 和 AIO 的区别?

  • BIO 属于同步阻塞 IO 模型 (应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。)
  • NIO同步非阻塞 IO 模型。(不用等那么久,但是反复调用read函数,直到内核可以拷贝数据的时候开始阻塞再返回数据)
  • AIO 异步 IO 模型。 (异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Java基础面试题可以包括很多方面的知识,以下是一些常见的问题和答案: 1. 什么是JNI? JNI是Java Native Interface的缩写,它提供了一组API,用于实现Java和其他语言(主要是C和C++)之间的通信。JNI允许Java代码与本地已编译的代码进行交互,尽管这可能会降低平台的可移植性。\[2\] 2. JNI的步骤是什么? JNI的步骤包括以下几个部分: - 在Java类中编写带有native声明的方法。 - 使用javac命令编译Java类。 - 使用javah命令生成头文件。 - 使用C/C++实现本地方法。 - 生成动态连接库。 - 执行Java代码。\[1\] 3. 请解释一下super.getClass()方法的作用。 super.getClass()方法是用于获取当前对象的父类的Class对象。在给定的示例中,Test类继承自Date类,当调用super.getClass().getName()时,会返回Test类的名称。因此,输出的结果是"Test"。\[3\] 希望以上回答能够帮助你理解Java基础面试题。如果你有其他问题,请随时提问。 #### 引用[.reference_title] - *1* *2* [Java基础常见面试题及详细答案(总结40个)](https://blog.csdn.net/ayouki123456/article/details/124983188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java基础面试题50题](https://blog.csdn.net/weixin_38337769/article/details/100560220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值