Java 基础常见面试题
1. Java 语言有那些特点
- 跨平台(由 JVM 虚拟机实现)
- 简单易学
- 面向对象(封装、继承、多态)
- 支持多线程(C++语言没有内置多线程机制,只有调用操作系统的多线程)
- 可靠性、安全性
- 支持网络编程并且方便
2. JVM vs JDK vs JRE
- JVM (java virtual machine)虚拟机
- Java 虚拟机是运行字节码的虚拟机
- JVM 针对不同系统有特定实现(实现跨平台)
- 字节码和不同系统的 JVM 实现是 Java 语言
一次编译,随处运行的关键所在 - JVM 只是一种规范,任何公司或者个人都可以开发专属的 JVM。
- JDK (java development kit)
- JDK 是功能齐全的 Java SDK(软件开发工具包)
- JDK 拥有 JRE 的一切,还拥有 编译器(javac) 和工具(javadoc、jdb等)。能够编译和创建程序
- JRE (java runtime environment)
- jre 是 java 运行时环境
- 它是运行已编译 java 程序所需的所有内容的集合,包括:jvm、java类库、java命令和其他基础构建
3. 什么是字节码?采用字节码的好处是什么?
3.1 什么是字节码?
- 简单来说,JVM 能够理解的代码就叫字节码,也就是扩展名为
.class的文件,,它不面向任何特定处理器,只面向虚拟机
3.2 采用字节码的好处是什么?
- Java 语言采用字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植到特点
- Java 程序从源代码到运行的过程如下图所示:
4. 为什么说 Java 语言 “编译与解释同存” ?
- 我们可以将高级编译语言按照程序的执行方式分为两种
- 编译型
- 编译型语言会通过编译器将源代码一次性翻译成该平台执行的机器码。一般情况下,
- 执行速度快
- 开发效率慢。
- 常见编译型语言:c、c++、Go等
- 解释型
- 解释型语言会通过解释器一句一句的将代码解释成机器码后在执行。
- 开发效率高
- 执行速度慢
- 常见解释型语言:Python、JavaScript等
- 编译型
5. Java 和 C++ 的区别
- Java 和 C++ 都是面向对象的语言
- Java 类只支持单继承,C++ 支持多重继承
- C++ 提供指针访问内存,java 不提供
- Java 有垃圾回收机制(GC),无需手动回收
6. 基本数据类型
java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数:
byty、int、long、short - 2 种浮点类型:
float、double
- 4 种整数:
- 1 种字符类型:
char - 1 种布尔型:
boolean
7. 基本数据类型 和 包装类型的区别
- 包装类可用于泛型,基本类型不可以
- 成员变量包装类型不赋值就是
null,而基本类型有默认值且不是null - 相比于包装类,基本数据类型占用空间小
- 包装类属于对象类型,
一般存储在堆中, - 基本数据类型的
局部变量存放在虚拟机栈中的局部变量表。 - 基本数据类型的
成员变量(未被static修饰)存放在Java虚拟机的堆中
8. 包装类型
-
Byte :
[-128, 127] -
Short:
[-128, 127] -
Integer:
[-128, 127] -
Long:
[-128, 127] -
Character:
[0, 127] -
Boolean:
trueorfalse -
注意:所有整型包装类对象之间值的比较,全部使用 equals 方法比较
9. 自动装箱与拆箱了解吗?原理是什么
9.1 什么是自动装拆箱?
- 装箱:将基本类型用它们所对应的引用类型包装起来
- 拆箱:将引用类型转换成基本数据类型
举例:
Integer i = 10; //装箱
int n = i; //拆箱
9.2 原理是什么
- 装箱:其实就是调用了包装类的
valueOf()方法 - 拆箱:调用了
xxxValue()方法
因此
Integer i = 10等价于Integer i = Integer.valueOf(10)int n = i等价于int n = i.intValue();
注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。
10. 如何解决浮点数运算的精度丢失问题
BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的