Java面试50问,女面试官最喜欢问的居然是它!

简介: Java面试50问,女面试官最喜欢问的居然是它!

[] 什么是自动装箱和拆箱?

在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)是Java 5引入的特性,它们允许基本数据类型和相应的包装类之间的自动转换。

自动装箱(Autoboxing)
自动装箱是指自动将基本数据类型转换为对应的包装类对象的过程。例如,将int类型转换为Integer对象,或者将double类型转换为Double对象。

Integer num = 10; // 自动装箱:int到Integer

自动拆箱(Unboxing)
自动拆箱是指自动将包装类对象转换为对应的基本数据类型的过程。例如,将Integer对象转换为int类型,或者将Double对象转换为double类型。

int num = num0.intValue(); // 拆箱:Integer到int(显式拆箱)
// 或者
int num = num1; // 自动拆箱:Integer到int(自动拆箱)

在上述拆箱的例子中,intValue()是一个显式拆箱的例子,而直接使用Integer对象赋值给int类型变量则是自动拆箱的例子。

注意事项
虽然自动装箱和拆箱使得代码更加简洁,但过度使用可能会导致性能问题,尤其是在涉及大量数据转换的场景中。这是因为每次装箱都会创建一个新的对象,而频繁的对象创建和垃圾回收可能会对性能产生负面影响。

此外,装箱类型具有身份性,即两个相同数值的装箱对象不一定equals(相等),因为它们是两个不同的实例。

Integer num1 = new Integer(10);
Integer num2 = new Integer(10);
System.out.println(num1.equals(num2)); // 输出 false,因为它们是不同的对象

为了解决这个问题,Java为包装类提供了缓存机制。当数值在一定范围内(对于Integer,默认是-128到127)时,会使用相同的对象实例。

Integer num1 = 10;
Integer num2 = 10;
System.out.println(num1 == num2); // 输出 true,因为它们引用相同的缓存对象

了解自动装箱和拆箱的工作原理以及它们的性能影响对于编写高效且可读的Java代码非常重要。

[] 什么是Java的垃圾回收机制?

Java的垃圾回收机制(Garbage Collection,GC)是一种自动内存管理功能,用于识别并清除不再使用的对象,从而释放内存资源。这是Java提供的一个关键特性,减少了内存泄漏和野指针等问题,使得开发者可以更专注于业务逻辑的实现。

以下是Java垃圾回收机制的一些关键点:

1. 内存分配:Java中的对象通常在堆内存中分配。堆内存被分为不同的代(Generation),如新生代(Young Generation)和老年代(Old Generation)。

2. 对象生命周期:对象从创建开始就处于活跃状态,如果之后没有更多的引用指向该对象,它就变得不再可访问,最终将被垃圾回收器回收。

3. 垃圾回收触发:垃圾回收通常在以下情况触发:
 - 显式调用System.gc(),尽管这只是一个建议,虚拟机可以选择忽略。
 - 堆内存不足时,如新生代或老年代空间不足。
 - 达到某个条件或时间点,由JVM的垃圾回收策略决定。

4. 垃圾回收算法:Java虚拟机使用不同的垃圾回收算法,如标记-清除(Mark-Sweep)、复制算法(Copying)、标记-压缩(Mark-Compact)、G1收集器等。

5. Stop-the-World事件:在执行垃圾回收时,JVM会暂停应用程序的线程,进行内存清理。这段时间被称为“Stop-the-World”事件。现代垃圾回收器通过各种技术减少这种暂停的影响。

6. 性能影响:虽然垃圾回收减少了内存管理的负担,但它也可能对程序性能产生影响,特别是在响应时间敏感的应用中。选择合适的垃圾回收器和调优垃圾回收参数是性能优化的重要部分。

7. 垃圾回收器:Java提供了多种垃圾回收器,如Serial、Parallel、Concurrent Mark Sweep(CMS)和Garbage-First(G1)等,它们适用于不同的应用场景。

8. 弱引用、软引用和虚引用:Java提供了几种引用类型,允许开发者对对象的生命周期进行更细粒度的控制,这些引用类型在垃圾回收时会被特别考虑。

9. finalize()方法:Java对象有一个finalize()方法,它在对象被垃圾回收前由垃圾回收器调用。然而,依赖finalize()进行清理工作是不可靠的,因为它的执行时机不确定,并且从Java 9开始,finalize()方法已被弃用。

了解垃圾回收机制对于编写高效的Java程序非常重要,它可以帮助开发者更好地管理内存使用,避免内存泄漏,并优化程序性能。

相关文章
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
18天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
46 14
|
28天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
23天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
27 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
53 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
106 4
|
1月前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
18 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。