互联网大厂面试:Java核心知识、框架与中间件全方位大考验
在互联网大厂的一间明亮的面试室内,严肃的面试官正襟危坐,对面坐着略显紧张的求职者王铁牛。一场对Java核心知识、JUC、JVM等众多技术领域的面试拉开了帷幕。
第一轮提问 面试官:“首先问几个基础的Java核心知识问题。Java中的基本数据类型有哪些?” 王铁牛:“这个我知道,有byte、short、int、long、float、double、char、boolean。” 面试官:“回答正确,不错。那说说int和Integer的区别。” 王铁牛:“int是基本数据类型,Integer是它的包装类。int直接存储数值,Integer是对象,有自己的方法和属性。” 面试官:“很好,理解得挺清晰。再问下,Java中多态的实现方式有哪些?” 王铁牛:“主要有继承和接口实现,还有方法的重载和重写。” 面试官:“非常棒,基础很扎实。”
第二轮提问 面试官:“接下来进入JUC和多线程的领域。JUC包是什么,有什么作用?” 王铁牛:“JUC就是java.util.concurrent包,里面提供了很多并发编程的工具类,能帮助我们更方便地进行多线程编程。” 面试官:“回答正确。那线程池有哪些创建方式,各自有什么特点?” 王铁牛:“可以用Executors工具类创建,像newFixedThreadPool,它创建固定大小的线程池;还有newCachedThreadPool,它可以根据需要创建新线程。” 面试官:“还行。那说说在多线程环境下,使用ArrayList会有什么问题?” 王铁牛:“呃……好像会有线程安全问题,但是具体的我有点不太清楚。” 面试官:“这个问题你回答得不够完整,需要加强这方面的学习。”
第三轮提问 面试官:“现在考察一下框架和中间件相关的知识。Spring框架的核心特性有哪些?” 王铁牛:“有IoC(控制反转)和AOP(面向切面编程)。” 面试官:“对的。那Spring Boot和Spring有什么区别和联系?” 王铁牛:“Spring Boot是在Spring基础上的简化开发框架,它自动配置很多东西,让开发更简单。” 面试官:“不错。再问下,Dubbo的负载均衡策略有哪些?” 王铁牛:“这个……我好像有点印象,但是具体说不出来了。” 面试官:“这说明你对Dubbo的掌握还不够深入。”
面试接近尾声,面试官整理了下手中的资料,说道:“今天的面试就到这里,你在基础的Java核心知识方面表现不错,对一些概念理解得比较清晰。但在多线程和框架中间件的一些细节上,还存在不足,比如ArrayList在多线程环境下的问题以及Dubbo的负载均衡策略等。我们需要综合评估后再做决定,你先回家等通知吧。”
答案解析
- Java中的基本数据类型:Java有8种基本数据类型,分为4类。整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节);浮点类型:float(4字节)、double(8字节);字符类型:char(2字节);布尔类型:boolean(1位)。基本数据类型存储的是具体的值,占用内存空间小,操作速度快。
- int和Integer的区别:
- 数据类型:int是基本数据类型,Integer是引用数据类型,是int的包装类。
- 存储方式:int直接存储数值,存储在栈中;Integer是对象,存储在堆中,栈中存储的是对象的引用。
- 默认值:int的默认值是0,Integer的默认值是null。
- 使用场景:在性能要求高、简单计算场景用int;在需要对象操作、泛型编程等场景用Integer。
- Java中多态的实现方式:
- 继承:子类继承父类,重写父类的方法,通过父类引用指向子类对象,调用重写的方法实现多态。例如:
class Animal {
public void sound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sound();
}
}
- **接口实现**:类实现接口,通过接口引用指向实现类对象,调用接口方法实现多态。
- **方法重载**:在同一个类中,方法名相同,但参数列表不同(参数个数、类型、顺序不同),根据传入的参数不同调用不同的方法。
- **方法重写**:子类重写父类的方法,方法名、参数列表、返回值类型都相同,但方法体不同。
- JUC包:java.util.concurrent包,在Java 5中引入,提供了丰富的并发编程工具类。作用包括:
- 线程池:如ThreadPoolExecutor、Executors等,方便管理线程的生命周期和资源分配。
- 并发集合:如ConcurrentHashMap、CopyOnWriteArrayList等,在多线程环境下保证线程安全。
- 同步器:如CountDownLatch、CyclicBarrier、Semaphore等,用于线程间的同步和协作。
- 锁机制:如ReentrantLock、ReadWriteLock等,提供更灵活的锁控制。
- 线程池的创建方式及特点:
- Executors.newFixedThreadPool(int nThreads):创建固定大小的线程池,线程数量固定,当有新任务提交时,如果线程池中有空闲线程则执行,没有则放入任务队列等待。适用于任务量比较稳定的场景。
- Executors.newCachedThreadPool():创建可缓存的线程池,线程数量不固定,根据任务量动态创建和销毁线程。如果线程空闲时间超过60秒则会被回收。适用于任务量大但执行时间短的场景。
- Executors.newSingleThreadExecutor():创建单线程的线程池,只有一个线程执行任务,保证任务按顺序执行。适用于需要保证任务顺序执行的场景。
- Executors.newScheduledThreadPool(int corePoolSize):创建定时任务的线程池,可定时或周期性执行任务。
- 多线程环境下使用ArrayList的问题:ArrayList不是线程安全的,在多线程环境下,多个线程同时对ArrayList进行读写操作可能会导致数据不一致、数组越界等问题。例如,一个线程正在遍历ArrayList,另一个线程同时对其进行添加或删除元素操作,就可能会抛出ConcurrentModificationException异常。
- Spring框架的核心特性:
- IoC(控制反转):也叫依赖注入(DI),将对象的创建和依赖关系的管理交给Spring容器,降低了代码的耦合度。例如,通过配置文件或注解,Spring容器会自动创建对象并注入依赖。
- AOP(面向切面编程):通过将横切关注点(如日志记录、事务管理等)与业务逻辑分离,提高了代码的可维护性和复用性。可以在不修改原有业务逻辑的基础上,对程序进行增强。
- Spring Boot和Spring的区别和联系:
- 联系:Spring Boot是基于Spring框架构建的,它继承了Spring的核心特性,如IoC和AOP。
- 区别:Spring需要大量的配置文件来配置各种组件和依赖关系,开发和部署相对复杂;Spring Boot采用了约定大于配置的原则,提供了自动配置功能,能快速搭建项目,减少了配置文件的编写,提高了开发效率。
- Dubbo的负载均衡策略:
- RandomLoadBalance:随机策略,随机选择一个服务提供者。根据权重随机选择,权重越大被选中的概率越高。
- RoundRobinLoadBalance:轮询策略,按顺序依次选择服务提供者。根据权重进行轮询,权重高的服务提供者会被更多地选中。
- LeastActiveLoadBalance:最少活跃调用数策略,优先选择活跃调用数最少的服务提供者。如果有多个服务提供者的活跃调用数相同,则随机选择一个。
- ConsistentHashLoadBalance:一致性哈希策略,根据请求的某些参数计算哈希值,将请求映射到同一个服务提供者上,保证相同参数的请求总是被路由到同一个服务提供者。
547

被折叠的 条评论
为什么被折叠?



