某小厂电话面
电话面 40 分钟。偏基础,说后续会问项目实习比较多。
面试官会引导你回答问题,挺好的。
问题列表
- 请简要介绍一下自己,包括教育背景、项目经历、实习经验等。
- 你擅长哪些技术领域?有哪些不足?
- 面向对象的三大特征是什么?
- Object 类有哪些方法?
- HashMap 的 put 过程是怎样的?
- 什么时候会使用红黑树来优化 HashMap 的性能?
- 除了链地址法和红黑树,还有哪些方法可以解决哈希冲突?
- 创建线程的几种方式有哪些?
- 阻塞线程的方式有哪些?
- Synchronized 和 Lock 的区别是什么?
- Synchronized 可以在静态代码块上加锁吗?
- ACID 特性分别是什么?
- 原子性是如何实现的?
- 你有做过 SQL 的优化吗?有哪些优化方法?
- 如何优化几千万条数据的查询性能?
- 简单介绍一下 CAS 机制。
- 简单介绍一下 JVM 的内存模型。
- 没有程序计数器会怎么样?
- 设计哈希算法时需要考虑哪些因素?
- 如何设计分表策略?(水平分表与垂直分表)
- 如何避免数据倾斜?
- 算法:如何判断链表是否有环? 部分回答的感觉一般 。
附上GPT解答
- 请简要介绍一下自己,包括教育背景、项目经历、实习经验等。
- 你擅长哪些技术领域?有哪些不足?
- 面向对象的三大特征是什么? 封装:将数据和操作封装在类中,隐藏内部实现细节。继承:子类继承父类的属性和方法,实现代码复用。多态:同一接口,不同实现。通过方法重载和方法重写实现。
- Object 类有哪些方法? hashCode()equals(Object obj)toString()clone()finalize()wait()notify()notifyAll()
- HashMap 的 put 过程是怎样的? 计算 key 的 hash 值。根据 hash 值找到对应的桶(bucket)。如果桶为空,创建一个新的节点。如果桶不为空,遍历链表或红黑树,检查 key 是否存在。如果 key 存在,更新 value。如果 key 不存在,将新节点插入链表或红黑树。如果链表长度超过阈值,转换为红黑树。
- 什么时候会使用红黑树来优化 HashMap 的性能? 当链表长度超过阈值(默认8)且桶内元素总数超过64时,链表转换为红黑树,以提高查找和插入效率。
- 除了链地址法和红黑树,还有哪些方法可以解决哈希冲突? 开放寻址法:线性探测、二次探测、双重散列。再哈希:使用不同的哈希函数重新计算哈希值。
- 创建线程的几种方式有哪些? 继承 Thread 类。实现 Runnable 接口。实现 Callable 接口。使用线程池(ExecutorService)。
- 阻塞线程的方式有哪些? 使用 wait() 和 notify()/notifyAll()使用 sleep()使用 join()使用 Lock 的 lock() 和 await()
- Synchronized 和 Lock 的区别是什么? Synchronized 是 Java 的内置锁,使用简单,但功能有限。Lock 是 Java 5 引入的接口,提供了更灵活的锁机制,如可中断锁、超时锁、公平锁等。
- Synchronized 可以在静态代码块上加锁吗? 可以。静态代码块上的锁是类级别的锁,而不是对象级别的锁。
- ACID 特性分别是什么? 原子性(Atomicity):事务中的操作要么全部执行,要么全部不执行。一致性(Consistency):事务执行前后,数据库状态保持一致。隔离性(Isolation):并发事务之间互不影响。持久性(Durability):事务一旦提交,数据永久保存。
- 原子性是如何实现的? 通过使用日志(如 undo log)记录未完成的操作,在事务失败时回滚。
- 你有做过 SQL 的优化吗?有哪些优化方法? 使用索引优化查询。避免全表扫描,使用 WHERE 子句限制结果集。使用连接池提高并发性能。分区表和分片技术。
- 如何优化几千万条数据的查询性能? 使用合适的索引。分区表或分库分表。查询缓存。优化 SQL 语句,避免复杂的 JOIN 和子查询。
- 简单介绍一下 CAS 机制。 比较并交换(Compare and Swap),一种无锁算法,通过比较内存位置的当前值和预期值,如果相同则更新为新值。
- 简单介绍一下 JVM 的内存模型。 堆(Heap):存储对象实例。方法区(Method Area):存储类信息、常量、静态变量、即时编译器编译后的代码。虚拟机栈(JVM Stack):存储方法调用的局部变量和部分结果。本地方法栈(Native Method Stack):为本地方法服务。程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。
- 没有程序计数器会怎么样? 无法记录当前线程执行的位置,导致线程切换后无法恢复正确的执行位置。
- 设计哈希算法时需要考虑哪些因素? 哈希函数的均匀性。冲突解决策略。扩展性和可扩容性。
- 如何设计分表策略?(水平分表与垂直分表) 水平分表:根据某个字段的值将数据拆分到不同的表中。垂直分表:将表按字段拆分,将常用字段和不常用字段分开存储。
- 如何避免数据倾斜? 使用均匀的哈希函数。动态调整分片策略。预分片,避免热点数据集中在某个分片。
- 如何判断链表是否有环? 使用快慢指针法:一个指针每次走一步,另一个每次走两步。如果两个指针相遇,则有环。
后端开发笔面经 文章被收录于专栏
主要收录一部分我的笔试面试经历文章,欢迎订阅。