26Java 小厂二面面经

自我介绍

————

1. 短链接项目中创建接口为什么用布隆过滤器?不是有误判的可能性吗,如何保证数据的正确性?高并发场景怎么解决的?
    - 布隆过滤器判断不存在的时候是完全准确的,而判断存在的误判率通过对布隆过滤器参数的配置可以降到一个很小的可接受的范围内,在系统不受攻击的情况下使用MySQL数据库的唯一索引作为兜底,如果创建成功的短链接进入数据库持久化时报唯一索引错误,此时执行事务回滚即可。如果同一个链接被高并发地创建,则此时由预防缓存穿透的逻辑解决,首次查询之后Redis会存储空对象,这样之后的请求不会全部打到数据库。

2. AQS是什么?【简历写的,其实没答太好】
    - 全称是AbstractQueuedSynchronizer,是在JUC包中定义的,内部属性包含有一个int变量一个同步队列,作用是作为一个接口提供锁的通用实现机制。(后面胡扯绕了半天也没说点啥

3. 介绍一下HashMap;为什么HashMap不支持多线程并发?HashMap如何解决Hash冲突?ConcurrentHashMap如何实现的?
    - 经典八股,说的八九不离十,扩容和红黑树、node数组加锁都提了

4. 事务的隔离级别?可重复读是如何实现的?
    - 说了读写锁和共享锁,一些当前读和快照读的理解,第一条select执行快照读创建Read View快照,此后的select都访问该快照,但如果执行update语句时,则会执行当前读,一定会去读最新的数据

5. 算法:打家劫舍Ⅱ
    - 最开始用注释写了个状态转移方程,因为首尾相接不好统一处理,卡了半天
    - 面试官提示可以分两种情况,确定偷第一家或者确定不偷,这样不用做统一处理。然后我开了两个dp数组写了一坨答辩代码,
    - 面试官说勉强算解决了,提出状态转移方程其实只涉及到了dp[n-2] dp[n-1]和dp[n]三个变量,其实可以用滚动方法优化空间复杂度,我说这个我明白,然后写了个封装函数robRange(int[] nums,int l,int r)把之前的逻辑整合简洁了一些,用上了滚动数组,主函数直接return Math.max(robRange(nums,0,n-1),robRange(nums,1,n));这样又写了半天,算法全过程总共墨迹了十几二十分钟
    - 面试官又提示了各种代码细节问题,比如函数返回值没写,有些地方复制的时候没改完美,总算是兜兜转转弄了一份完整代码。

    - 后面反问环节:我问了一下“刚才算法那块我感觉我写的有点烂,不知道您怎么看”,面试官说,这个其实就是刷的多就会,刷的少就不熟,我看你刚才反应也还算快的,多练就好。

6. 场景代码题:
 Ⅰ. 单例模式示例代码如下,有哪些问题?
----------------------------------------------------
public class Singleton {
    static Singleton instance;
    private Singleton() {
    }
    static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}
------------------------------------------------------
        - 其实有一堆问题,但是我只说了最明显的:只用了一层检查锁,首次进入的时候可能多个线程进入if块内创建多个单例
        - 面试官:这个地方用volatile修饰会怎么样?引导之后我说了一些使用volatile的优点,然后继续问“这样就行了吗”,我说看不出来什么问题了,结果给我讲了1分钟使用new关键字和指令重排序方面的知识,我全程点头啊对对对,不知所措(
-----------------------------------------------------------------------
 Ⅱ. MySQL事务场景题
--------------------------------------------------
CREATE TABLE t (
    id INT PRIMARY KEY,
    k INT
);

INSERT INTO t (id, k) VALUES (1, 1), (3, 3);

T A;
UPDATE t SET k = 3 WHERE id = 1;
COMMIT;

T B;
SELECT * FROM t WHERE id = 1;
UPDATE t SET k = k + 1 WHERE id = 1;
COMMIT;
--------------------------------------------------
 问:事务A在commit之前因故阻塞了,在事务B的update语句前提交了,问此时事务B提交后id=1的k是多少?
 答:B事务提交完成后,此时k=4,因为update语句是当前读,事务A的提交对于B的update是可见的,所以相当于id=1的k先被修改事务A为3,事务B执行自增后变为4

------------------------------------------------

反问:

  公司主营业务是什么?

  刚才代码感觉敲的不好,问题大吗?

#日常实习#  #面经# #Java# #MySQL#
全部评论
哥们我项目也短链😂
点赞 回复 分享
发布于 09-12 01:03 广东

相关推荐

5 15 评论
分享
牛客网
牛客企业服务