互联网大厂Java面试大挑战:核心知识全解析
面试官:好,开始面试。第一轮,先问你几个基础的Java核心知识问题。首先,什么是Java的多态性?
王铁牛:多态性啊,就是一个对象可以有多种形态。
面试官:还算回答得简洁明了。那说说Java中方法重载和方法重写的区别。
王铁牛:方法重载是在一个类里,方法名相同但参数不同;方法重写是子类重写父类的方法,方法名、参数和返回值都得一样。
面试官:嗯,回答得不错。再问一个,Java中基本数据类型和引用数据类型的区别是什么?
王铁牛:基本数据类型存的是值,引用数据类型存的是对象的地址。
面试官:第一轮表现还行,接下来第二轮,关于JUC相关的问题。什么是CAS?
王铁牛:CAS就是比较并交换,通过比较内存值和预期值来决定是否更新。
面试官:那说说AQS,它在JUC里起到什么作用?
王铁牛:AQS就是抽象队列同步器,能实现线程的同步和互斥。
面试官:JUC里的CountDownLatch是怎么用的?
王铁牛:这个嘛,就是等所有线程都完成任务后再一起执行。
面试官:第二轮回答得有点混乱,希望第三轮能好好表现。现在问第三轮问题,关于JVM的。什么是JVM的垃圾回收机制?
王铁牛:垃圾回收机制就是回收那些不再使用的对象内存。
面试官:那类加载机制分哪几个阶段?
王铁牛:好像是加载、验证、准备、解析、初始化。
面试官:JVM的内存结构分为哪几个部分?
王铁牛:这个,不太记得清了。
面试官:面试就到这里,回去等通知吧。
答案:
- Java的多态性:多态性是指同一个行为具有多个不同表现形式或形态的能力。在Java中,多态性主要体现在方法的重载和重写上。方法重载是指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。这是一种静态多态性,在编译时就确定了调用哪个方法。方法重写是指子类重新定义父类中已有的方法,要求方法名、参数列表和返回值类型都相同。这是一种动态多态性,在运行时根据对象的实际类型来决定调用哪个方法。
- 方法重载和方法重写的区别:方法重载是在同一个类中,方法名相同但参数列表不同,它与返回值类型无关。方法重写是子类对父类中已有的方法进行重新定义,要求方法名、参数列表和返回值类型都必须与父类的方法相同。方法重载是静态绑定,在编译时确定调用哪个方法;方法重写是动态绑定,在运行时根据对象的实际类型来决定调用哪个方法。
- Java中基本数据类型和引用数据类型的区别:基本数据类型包括整型(byte、short、int、long)、浮点型(float、double)、字符型(char)、布尔型(boolean),它们直接存储值。引用数据类型包括类、接口、数组等,它们存储的是对象的地址,通过这个地址来访问对象。基本数据类型的变量存储在栈内存中,而引用数据类型的对象存储在堆内存中,变量存储在栈内存中,指向堆内存中的对象。
- CAS(比较并交换):CAS是一种无锁的原子操作,用于在多线程环境下实现变量的安全更新。它包含三个操作数:内存值V、预期值A和新值B。当且仅当预期值A和内存值V相等时,才会将内存值V更新为新值B,并返回true;否则返回false。CAS操作是通过硬件指令实现的,保证了操作的原子性和可见性,从而避免了锁的开销,提高了并发性能。
- AQS(抽象队列同步器):AQS是JUC包中实现同步器的基础框架,它提供了一种基于FIFO队列来实现阻塞锁和同步器的机制。AQS通过一个int类型的变量来表示同步状态,并提供了一系列方法来对同步状态进行操作,如获取锁、释放锁、等待、唤醒等。它通过模板方法模式,将一些通用的同步逻辑抽象出来,子类只需要实现特定的方法来处理具体的同步需求。AQS可以用于实现各种同步器,如ReentrantLock、Semaphore、CountDownLatch等。
- CountDownLatch:CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成一组操作之后再继续执行。它通过一个计数器来实现,在创建CountDownLatch对象时,需要传入一个初始计数值。当调用CountDownLatch的countDown()方法时,计数器的值会减1;当计数器的值减为0时,所有等待在CountDownLatch上的线程都会被唤醒。通常用于多个线程并发执行任务,需要等待所有任务都完成后再进行下一步操作的场景。
- JVM的垃圾回收机制:垃圾回收机制是Java虚拟机自动回收不再使用的对象所占用的内存空间的过程。JVM会定期检查堆内存中的对象,判断哪些对象不再被引用,这些对象就会被标记为可回收对象。然后,垃圾回收器会通过不同的算法(如标记清除算法、标记整理算法、复制算法等)来回收这些对象所占用的内存空间,将其返还给堆内存,供其他对象使用。垃圾回收机制的目的是提高内存利用率,避免内存泄漏,使程序能够高效地运行。
- 类加载机制的阶段:类加载机制分为加载、验证、准备、解析、初始化五个阶段。加载阶段负责将类的字节码文件加载到内存中,并创建一个Class对象。验证阶段主要检查加载的字节码文件是否符合Java虚拟机规范,确保其安全性。准备阶段为类的静态变量分配内存,并设置默认初始值。解析阶段将符号引用转换为直接引用,使得类中的方法和字段可以被正确访问。初始化阶段执行类的静态代码块和静态变量的赋值操作,完成类的初始化。
- JVM的内存结构:JVM的内存结构主要分为堆内存、栈内存、方法区、程序计数器等部分。堆内存是JVM中最大的一块内存区域,用于存储对象实例和数组。栈内存用于存储局部变量、方法调用等信息,每个线程都有自己独立的栈空间。方法区用于存储类的元数据信息,如类的结构、常量池等。程序计数器用于记录当前线程执行的字节码指令地址,是线程私有的。此外,还有本地方法栈用于执行本地方法。不同的内存区域有着不同的功能和特点,它们共同协作,保证了Java程序的正常运行。