小厂Java面经1
1、自我介绍2、简单说一下对Java多态的理解3、介绍一下用的比较多的关键字4、private关键字和public关键字的区别5、介绍一下线程的创建方式6、线程池的核心参数7、什么时候会触发拒绝策略8、你有自己实现过拒绝策略吗9、线程中用到了哪些方法10、谈谈你对索引的理解11、什么情况下不推荐使用索引12、事务的隔离机制,mysql默认的是哪个13、讲一下乐观锁、悲观锁14、讲一下红黑树15、讲一下冒泡排序16、讲一下单例模式17、redis的持久化方式18、怎么解决redis和数据库之间数据不一致19、你实习的时候部署过redis机群吗20、讲一下Spring的AOP和IOC21、你的项目中对异常怎么处理
22.了解微服务吗
23.微服务中的组件了解哪些反问:反问三件套
作者:看日出看日落链接:https://www.nowcoder.com/feed/main/detail/f750c43e2fce432db0e36c9d0a8ac885?sourceSSR=search来源:牛客网
下面是我在实习中协助面试 然后在牛客上挑选了一些完整的面试问题借助豆包完成的面经答案思路汇总
小厂Java面经1参考答案
1. 自我介绍
简要介绍个人背景、技术栈、项目经验及亮点,突出与岗位相关的技能和成果。示例:“面试官您好,我是XX,毕业于XX学校,主修计算机科学。目前有X年的Java开发经验,熟悉Spring Boot、MySQL、Redis等技术,参与过XX项目,负责后端模块开发,使用Redis优化了查询性能,提升了系统吞吐量。对分布式系统和微服务有一定了解,业余时间喜欢研究开源框架和算法。”
2. 对Java多态的理解
多态是面向对象的三大特性之一,指同一方法在不同对象中有不同实现方式。体现为:
- 编译时多态(静态):方法重载(Overload)。
- 运行时多态(动态):方法重写(Override),通过父类引用指向子类对象(如
Animal dog = new Dog()
)。
示例:
class Animal { void sound() { System.out.println("Animal sound"); } } class Dog extends Animal { void sound() { System.out.println("Bark"); } } Animal myDog = new Dog(); myDog.sound(); // 输出 "Bark"(运行时绑定)
3. 常用的Java关键字
static
:修饰类变量、方法,属于类而非实例。final
:修饰类(不可继承)、方法(不可重写)、变量(常量)。synchronized
:保证线程同步。volatile
:确保变量可见性,禁止指令重排。try/catch/finally
:异常处理。
4. private与public的区别
- private:仅本类内部可见,外部类无法直接访问。
- public:所有类均可访问。
- 示例:
public class Example { private int secret = 1; // 仅本类可访问 public int value = 2; // 所有类可访问 }
5. 线程创建方式
- 继承Thread类:重写
run()
方法,调用start()
启动线程。 - 实现Runnable接口:实现
run()
,将实例传入Thread构造器。 - 实现Callable接口:配合
FutureTask
获取返回值。 - 线程池:通过
ExecutorService
提交任务(推荐)。
示例:
// 方式2 Runnable task = () -> System.out.println("Running"); new Thread(task).start();
6. 线程池核心参数
- corePoolSize:核心线程数(常驻)。
- maxPoolSize:最大线程数。
- keepAliveTime:非核心线程空闲存活时间。
- workQueue:任务队列(如
ArrayBlockingQueue
)。 - ThreadFactory:线程工厂。
- RejectedExecutionHandler:拒绝策略(如
AbortPolicy
)。
7. 触发拒绝策略的条件
当同时满足以下条件时:
- 线程池处于SHUTDOWN状态。
- 任务队列已满且当前线程数达到
maxPoolSize
。
8. 自定义拒绝策略
可通过实现RejectedExecutionHandler
接口自定义策略,例如记录日志或降级处理。示例:
public class CustomPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.out.println("Task rejected: " + r); } }
9. 线程常用方法
start()
:启动线程。sleep()
:线程休眠(不释放锁)。wait()/notify()
:对象锁的等待与唤醒。join()
:等待线程结束。yield()
:让出CPU时间片。
10. 索引的理解
索引是数据库中加速查询的数据结构(如B+树),通过减少磁盘I/O提高查询效率。优点:加速查询。缺点:占用存储空间,降低写操作速度。
11. 不推荐使用索引的情况
- 数据量极小的表。
- 频繁更新的字段。
- 区分度低的字段(如性别)。
- 查询中很少使用的列。
12. 事务隔离级别
- 读未提交(Read Uncommitted):可能脏读。
- 读已提交(Read Committed,Oracle默认):避免脏读。
- 可重复读(Repeatable Read,MySQL默认):避免不可重复读。
- 串行化(Serializable):避免幻读,性能最低。
13. 乐观锁与悲观锁
- 乐观锁:假设无冲突,通过版本号(如CAS)实现。适用于读多写少。
- 悲观锁:假设有冲突,直接加锁(如
synchronized
)。适用于写多读少。
14. 红黑树
一种自平衡二叉查找树,特性:
- 节点为红或黑。
- 根和叶子节点(NIL)为黑。
- 红节点的子节点必为黑。
- 任一节点到叶子的路径包含相同数量黑节点。优点:插入/删除效率优于AVL树,适合频繁写操作。
15. 冒泡排序
步骤:
- 比较相邻元素,若前大后小则交换。
- 每轮将最大元素“冒泡”到末尾。时间复杂度:O(n²)。优化:若某轮无交换,提前终止。
示例:
void bubbleSort(int[] arr) { for (int i=0; i<arr.length-1; i++) { for (int j=0; j<arr.length-1-i; j++) { if (arr[j] > arr[j+1]) swap(arr, j, j+1); } } }
16. 单例模式
确保类仅有一个实例,并提供全局访问点。实现方式:
- 饿汉式:类加载时初始化。
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
- 懒汉式(双重检查锁):延迟加载,线程安全。
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) instance = new Singleton(); } } return instance; } }
17. Redis持久化方式
- RDB:定时生成数据快照,恢复快但可能丢数据。
- AOF:记录写操作日志,数据更安全但文件较大。
- 混合模式(Redis 4.0+):结合两者优势。
18. Redis与数据库数据一致性
- 策略:
19. Redis集群部署经验
若未实际部署,可回答了解理论:
- 主从复制:数据备份与读写分离。
- 哨兵模式:自动故障转移。
- Cluster模式:分片存储,支持水平扩展。
20. Spring AOP与IOC
- IOC(控制反转):对象由容器创建和管理,通过DI(依赖注入)解耦。
- AOP(面向切面):通过动态代理实现日志、事务等横切关注点。
21. 项目中的异常处理
- 使用@ControllerAdvice定义全局异常处理器。
- 通过@ExceptionHandler捕获特定异常。
- 返回统一格式的错误信息(如JSON)。
22. 微服务了解
微服务是一种架构风格,将单体应用拆分为独立部署的小服务,通过轻量级通信协作。
23. 微服务组件
- 注册中心:Eureka、Nacos。
- 配置中心:Spring Cloud Config、Nacos。
- 网关:Zuul、Spring Cloud Gateway。
- 负载均衡:Ribbon。
- 熔断器:Hystrix、Sentinel。
- 链路追踪:Sleuth、Zipkin。
反问建议
- 团队技术栈与业务方向?
- 新人培养机制与成长路径?
- 当前项目面临的挑战?
总结:回答问题需清晰简洁,结合示例或场景说明,对不确定点可诚实说明但展现思考过程。
全部评论
(3) 回帖