Java面试八股文

22 篇文章
Java面试-11:面向对象和面向过程的区别?

Java面试-11:面向对象和面向过程的区别?

面向过程编程(POP)和面向对象编程(OOP)是两种常见的编程范式,它们的主要区别在于解决问题的方式。POP通过拆分问题为一个个方法来执行,而OOP则先抽象出对象,再通过对象执行方法来解决问题。OOP相较于POP具有易维护、易复用和易扩展的优点,主要得益于其良好的结构、封装性、继承和多态特性。POP编程方式更简单直接,适合处理简单任务。需要注意的是,性能差异不仅取决于编程范式本身,还与运行机制相关,因此简单比较两者性能是一种误区。

Java面试-10:重载和重写的区别

Java面试-10:重载和重写的区别

文章主要介绍了编程中的两个重要概念:重载和重写。重载指的是同一个方法可以根据输入数据的不同,执行不同的处理逻辑。这意味着方法名相同,但参数类型或数量可以不同,从而实现不同的功能。重写则是指子类在继承父类的方法时,如果需要对相同输入数据做出不同于父类的响应,就需要覆盖父类的方法。通过重写,子类可以定制化父类的方法,以满足特定需求。这两个概念在面向对象编程中非常重要,帮助开发者实现代码的复用和灵活性。

Java面试-9:什么是Bcrypt 加盐加密?

Java面试-9:什么是Bcrypt 加盐加密?

bcrypt是一种专门用于密码加密的算法,通过“加盐”机制增强密码的安全性。所谓“加盐”,即在用户密码中加入一段随机生成的字符串,再进行加密,从而确保即使相同的密码也能生成完全不同的密文,防止被批量破解。不加盐的密码加密存在严重漏洞,相同密码会生成相同的密文,容易被对比破解。加盐后,每个用户拥有唯一的随机盐,使得相同密码的密文完全不同,极大提高了密码的安全性。

Java面试-8:静态方法和实例方法的区别

Java面试-8:静态方法和实例方法的区别

文章主要讨论了静态方法和实例方法的调用方式及访问类成员的限制。静态方法可以通过`类名.方法名`或`对象.方法名`的方式调用,但推荐使用`类名.方法名`,因为静态方法属于类而非对象,使用对象调用容易造成混淆。实例方法只能通过`对象.方法名`调用。此外,静态方法只能访问静态成员(静态变量和静态方法),不能访问实例成员(实例变量和实例方法),而实例方法则没有这种限制。

Java面试-7:成员变量与局部变量的区别?

Java面试-7:成员变量与局部变量的区别?

本文详细对比了成员变量和局部变量的核心区别。成员变量定义在类中、方法外,属于类或对象,存储在堆内存,随对象创建而存在,默认有初始值,可使用访问修饰符。局部变量定义在方法内、方法参数或代码块内,存储在栈内存,随方法或代码块执行而创建,执行结束即销毁,无默认值,仅能使用final修饰符。文章通过代码示例直观展示了两者在定义、内存存储、生命周期和修饰符方面的差异,帮助读者更好地理解它们的区别。

Java面试-6:基本数据类型

Java面试-6:基本数据类型

Java的基本数据类型分为数值型和非数值型两大类,共8种。数值型包括字节型(byte)、短整型(short)、整型(int)、长整型(long)、单精度浮点(float)和双精度浮点(double),用于存储数字;非数值型包括布尔型(boolean)和字符型(char),分别用于存储布尔值和单个字符。每种类型有不同的占用字节、取值范围和默认值,适用于不同的场景。例如,int是最常用的整型,double是最常用的小数类型,char支持Unicode编码,可存储中文字符。使用时需注意long和float的声明后缀(L和f),以及boolean只能取true/false,不能用0/1替代。基本数据类型直接存储值,速度快,是Java编程的基础。

Java面试-5:移位运算符

Java面试-5:移位运算符

移位运算符是编程语言中的基本运算符,广泛应用于高效计算、内存节省、位字段管理、哈希算法、数据压缩、数据校验和内存对齐等领域。Java 中有三种移位运算符:左移(`<<`)、带符号右移(`>>`)和无符号右移(`>>>`)。左移操作相当于乘以 2 的幂次方,右移操作相当于除以 2 的幂次方。移位运算符在 `HashMap` 等 JDK 源码中也有应用。移位操作符仅支持 `int` 和 `long` 类型,对 `short`、`byte`、`char` 类型进行移位前会先转换为 `int`。当移位位数超过数据类型的位数时,会先求余再进行移位操作。掌握移位运算符知识有助于理解源码和优化代码。

Java面试-4:自增自减运算符

Java面试-4:自增自减运算符

在Java编程中,处理整数类型变量的增减操作时,可以使用自增运算符(`++`)和自减运算符(`--`)来简化代码。这两种运算符可以放在变量之前(前缀形式)或之后(后缀形式)。前缀形式(如`++a`)会先对变量进行自增或自减操作,然后再使用变量的值;后缀形式(如`a++`)则会先使用变量的当前值,然后再进行自增或自减操作。为了方便记忆,可以采用口诀:“符号在前就先加/减,符号在后就后加/减”。通过示例代码可以看出,不同形式的运算符会导致变量在赋值或使用时的值不同。

Java面试-3:为什么说 Java 语言“编译与解释并存”?

Java面试-3:为什么说 Java 语言“编译与解释并存”?

文章详细解释了编译与解释的核心区别,并深入探讨了Java的“编译+解释”执行流程。编译型语言如C/C++直接将源代码编译成机器码,运行时无需额外处理;而解释型语言如早期Python则在运行时逐行解释执行源代码,无中间代码生成。Java则结合了两者的优点:首先,通过`javac`编译器将`.java`源代码编译成`.class`字节码文件(中间代码),这一步实现了“一次编译,到处运行”的跨平台特性;然后,JVM在执行字节码时,采用解释执行和即时编译(JIT)相结合的方式,解释器逐行翻译字节码为机器码,同时对热点代码进行编译优化,提升了运行效率。这种设计既保证了跨平台性,又优化了性能,是Java“Write Once, Run Anywhere”理念的核心支撑。

Java面试-2:什么是字节码?采用字节码的好处是什么?

Java面试-2:什么是字节码?采用字节码的好处是什么?

字节码(Bytecode)是介于源代码和机器码之间的中间代码,常见的例子是Java编写的`.java`源代码通过编译生成`.class`文件,其中包含的就是字节码。字节码并非直接供人类阅读或CPU执行,而是由Java虚拟机(JVM)执行。 采用字节码的主要好处有以下三点: 1. **跨平台性**:Java编译后的字节码可以在任何安装了JVM的系统上运行,实现了“一次编写,到处运行”的特性。 2. **虚拟机优化**:JVM可以对字节码进行即时编译(JIT)以提升性能,并提供内存管理、垃圾回收和安全检查等功能。 3. **语言无关性**:只要编译成标准字节码,多种语言如Kotlin、Scala、Groovy等都可以在JVM上运行,虚拟机负责屏蔽底层系统差异。 总结来说,字节码是虚拟机能理解和执行的中间指令,具备跨平台、可优化、安全和多语言兼容的优势。