面试题day12

快手

  • 自我介绍

  • 实习项目、背景、需求介绍

  • InnoDB优点

    外键 行锁 事务 聚簇索引 mvcc 使用场景

  • MyISAM索引底层是什么结构

    b+树,遍历层级短,io次数少

  • B树和B+树区别

    非叶子节点是否存数据

  • 为什么选择B+树不选择B树

    单位时间查找效率高,io次数更少

  • MySQL如何支持事务

    使用innodb引擎,acid

    一致性 原子性 隔离性 持久性

    A原子性:靠undo log来保证(异常或者执行失败进行回滚)
    D持久性:靠redo log来保证(保证当mysql宕机或者停电后,可以通过redo log最终将数据保存在磁盘中)
    I隔离性:事务之间的读写靠mysql的锁机制来保证隔离,事务间的写操作靠MVCC机制(快照读,当前读)来保证隔离性

  • undo log如何保证原子性

    回滚日志,read_view,三个字段(最后事务id、回滚指针、隐式主键)

  • MySQL隔离级别、存在的问题

    脏读 其他事务未提交数据

    不可重复读 数据被修改

    幻读 数据新增

  • MySQL如何解决脏读、不可重复读、幻读

    mvcc+临键锁

  • 如何解决脏读?(读已提交)

    mvcc+行锁

  • MySQL如何判断事务有没有提交?

    查看事务表select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx

  • 事务A中对id=1进行修改,不提交;事务B中读取id=1的数据,如何判断这个数据有没有被提交?

    mvcc

  • InnoDB可重复读是否存在幻读问题

    无,mvcc+临键锁

  • 如果对记录修改,是否会读到修改的值?

  • LeetCode:8. 字符串转换整数

  • HashMap和HashTable区别

    线程安全和null

  • HashTable如何实现线程安全

    给每个方法加synchronized,put时只能有一个线程获取到锁

  • 其他线程如何知道已经有线程在put(Mark word)

    锁状态和锁信息

    hash码 线程id lockrecord指针 管程指针

  • Mark word是什么

    对象头的一部分

  • synchronized的锁优化

    无锁 偏向锁 轻量级锁 重量级锁

  • 出于目的写博客;什么时间写博客

  • 假设有1,2,3,4,5,6,7,8,9,10 在B+树中存储,是什么样子

  • 为什么1和2之间是链表

  • MySQL有哪些索引

    • 普通索引
      • 是最基本的索引,它没有任何限制
    • 唯一索引
      • 索引列的值必须唯一,但允许有空值
    • 主键索引
      • 特殊的唯一索引,不允许有空值
    • 组合索引
      • 多个字段上创建的索引
  • 为什么会有覆盖索引

    select的数据列只用从索引中就能够取得,不必读取数据行

  • table 有a b c d四列,(b c d) 联合索引,selct c,d from table where c = 1会使用这个联合索引吗?

    不会

  • 为什么覆盖索引存在最左匹配原则

    如果第一列相等则再根据第二列单调递增排序,依次类推

  • select c,d from table where b = 1 and d = 2会走索引吗?

    不会

  • MySQL中有一些优化,比如ICP,就会将索引下推

    当存在索引的列做为判断条件时,MySQL server将这一部分判断条件传递给存储引擎,然后存储引擎会筛选出符合MySQL server传递条件的索引项

  • 算法题:LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

  • HashMap底层数据结构是什么

    链表散列/红黑树

  • HashMap先不考虑红黑树,手写一个底层数据结构,存储key value

    仿照hashmap

  • Java 线程的状态;time-waiting时间到了,进入什么;调用sleep()进入什么状态?time_waiting,那这个time_waiting状态会释放锁吗?锁等待是什么状态?

    run

    time-waiting

    不会释放锁

    没拿到锁状态

  • wait() notify() 以及线程状态转换

    如果A线程在Runnable(可运行)状态中调用了wait()方法,那么A就进入了Waiting(无限等待)状态,同时失去了同步锁;如果B线程获取到同步锁,并在运行中调用了notify()方法,就会将无限等待的A线程唤醒;如果A线程唤醒后获取到锁对象,就进入Runnable(可运行)状态

  • Java线程状态和操作系统线程有什么不同?

    Java线程的 runable=ready+running,操作系统线程分为 running和 ready,并不是合在一起的

  • 为什么Java把这两个状态放在一起?

    CPU的执行分成很多个小的时间片,cpu转换很快,状态标志不准确

  • 自我介绍

  • JVM内存结构

    堆 方法区

    程序计数器 本地方法栈 虚拟机栈 本地内存

  • 堆如何分代

    新生代 老年代 永久代 新生代又分为了Eden区、Survivor区。老年代存放着经历多次GC仍然存活的对象。

  • 为什么要分代

    分代的唯一的理由就是优化GC性能

  • 回收算法

    标记清楚、标记复制、标记压缩

  • 回收算法有哪些具体实现?

    Parallel Parallelold
    Serial Serialold

    ParNew CMS
    G1

  • TCP三次握手

    seq x

    ack x+1 seq y

    ack y+1

  • TCP 四次挥手

    seq x

    ack x+1

    seq y

    ack y+1

  • 为什么建立三次、断开是四次

  • 四次挥手套接字的状态转移

    FIN WAIT 1 (主动关闭)已经发送关闭请求,等待确认
    FIN WAIT 2 (主动关闭)收到对方关闭确认,等待对方关闭请求
    CLOSE WAIT (被动关闭)收到对方关闭请求,已经确认
    LAST ACK (被动关闭)等待最后一个关闭确认,并等待所有分组死掉
  • 输入url的流程

    缓存 dns ip tcp https

  • http的request、response的具体格式

    请求行 请求头 请求体

    响应行 响应头 响应体

  • 你们的服务是如何部署的?SpringBoot中的Tomcat

  • LRU 如何实现?在哪用过

  • LRU put get 时复

  • 100G文件,每行是一个长整数,总行数为N;主机内存1G;结果:输出最大的K个数 (K << N)

    维护大小为k的最小堆,如果当前元素大于堆顶元素,入堆。这样,堆中始终存储的是到当前为止,最大的k个数。
    大小为k的最小堆会一直存在内存中,因为K << N,所以不考虑内存不够的情况

posted @ 2022-07-20 13:37  Faetbwac  阅读(35)  评论(0编辑  收藏  举报