面试题day10

字节跳动

  • 自我介绍

  • 项目相关

  • Java中常用的集合类

  • 有一组数据,需要按照顺序对它进行加密,如果用集合做的话你会选哪个集合?比如一个数组,其元素本身无序,每个元素是字母或者数字都行,对它从小到大进行排序,你会选哪个集合去存储?

    linkedhashmap treemap

  • Java中线程同步的方案有哪些

    互斥同步(也称为阻塞同步,属于一种悲观的并发策略)

    • synchronized、J.U.C包中的锁(锁重入、公平锁\非公平锁)

    非阻塞同步(基于冲突检测的乐观并发策略,使用了硬件指令集提供的CAS功能)

    • J.U.C包里面的整数原子类

    无同步方案(线程本地存储)

    • Java中可以通过java.lang.ThreadLocal类来实现线程本地存储的功能
  • Lock接口的实现类

    ReentrantLock

    ReentrantReadWriteLock

    Lock接口与实现类

  • MySQL查询比较慢的话,通过什么方式来优化

    情况①:偶尔很慢,可能是数据库在查询脏页,或者没拿到锁
    情况②:一直很慢,可能是没有索引,或者有索引但没走索引,或者表数据量太大需要分库分表

  • http协议

    http是应用层的协议,其传输层协议是tcp,三次握手和四次挥手的完整过程

  • 算法题:lc726 原子的数量

便利蜂

  • 八种基本类型

    ​ float double

    byte short int long

    ​ char

    boolean

  • int取值范围

    Byte类缓存范围:[-128,127] 共256个值。
    Short类缓存范围:[-128,127] 共256个值。
    Character类缓存范围:[0,127] 共128个值。
    Integer类默认缓存范围:[-128,127] 共256个值
    Long类缓存范围:[-128,127] 共256个值。
    Boolean类就缓存两个值:true、false。

  • 封装类与封装类,封装类与基本类型比较。

    注意Integer在[-128,127]和这个区间之外是有区别的。在这个区间之内,Integer类型是IntegerCache.cache[x],这是一个静态类,所以可以使用==,在这个范围之外是Integer类型是直接new Integer(x)

  • 线程安全集合

    CopyOnWriteArrayList、CopyOnWriteArraySet

    ConcurrentHashMap

    hashtable vector

  • hashmap

    0.75

    过高 hash冲突严重

    过低 频繁扩容

  • counrrenthashmap

    1.7 分段加锁

    1.8 synchronized+cas

  • 如果两个同样的put相同的key,会发生什么?

    链地址法

  • 线程池工作原理

    核心线程数 最大线程数 阻塞队列 线程工厂 存活时间 时间单位 拒绝策略

  • 为什么要使用线程池

    减低资源消耗,提高资源管理

  • 线程池中为什么要使用阻塞队列

    线程池创建线程需要获取mainlock这个全局锁,影响并发效率,阻塞队列可以很好的缓冲。

    如果新任务的到达速率超过了线程池的处理速率,那么新到来的请求将累加起来,这样的话将耗尽资源。

  • 为什么用阻塞队列而不是普通队列

    阻塞队列主要是用于生产者-消费者模型的情况。比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。如果使用非阻塞队列,它不会对当前线程产生阻塞,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。

  • 线程复用的原理

  • 线程池运行中,突然电脑关机了,内存数据都会丢失,开机后怎么办?

    消息队列的一些框架的内容,分布式队列

    数据库持久化

  • sychronized和reentrantlock

    1. 原始构成
      • Synchronized是关键字属于JVM层面,
        monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象只有在同步块或方法中才能调wait/notify等方法)
        monitorexit
      • Lock 是具体类(java.util.concurrent.locks.lock)是api层面的锁
    2. 使用方法
      • Synchronized 不需要用户手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用
      • Reentrantlock则需要用户去手动释放锁若没有主动释放锁,就有可能导致出现死锁的现象。
        需要lock()和unlock()方法配合try/finally语句块来完成
    3. 等待是否可中断
      • synchronized不可中断,除非抛出异常或者正常运行完成。
      • Reentrantlock 可中断,
        • 设置超时方法。tryLock(Long timeout,TimeUnit unit)
        • lockInterruptibly()放代码块中,调用interruptibly()方法可中断。
    4. 加锁是否公平
      • synchronized非公平锁
      • Reentrantlock俩者都可以,默认非公平锁,构造方法可以传入boolean值,true为公平锁,false为非公平锁。
    5. 锁绑定多个条件Condition
      • synchronized没有
      • Reentrantlock用来实现分组唤醒需要唤醒的线程们,可以精确唤醒,不像synchronized随机唤醒或者唤醒全部线程。
  • hashset和hashmap

    hashset则将对象存储在map的key中,value值用一个new Object()作为填充

  • sychronized锁优化

    自旋锁、偏向锁、轻量级锁、重量级锁

  • 复合索引最左匹配,以及从源码上讲为什么要最左匹配

  • 如果使用delete删除,是真的把这个记录删除了吗?

    mysql执行delete操作后,存储在硬盘上的数据没有被删除,只不过在记录行上做了逻辑删除,即通过删除标识位实现。

    uodo log

  • 一个字段要求存的是不带符号的int,那怎么存负数?

    自制符号位

  • 自增id为什么会用完,用完了怎么办?

  • 如果数据库有100条值,数据库引擎会使用索引搜索吗?

    不一定,看执行计划

    image-20220715182239095

  • like语句什么时候能用什么时候不能用?

    违背最左前缀原则

    select *

    索引列上有计算

    索引列使用函数

    索引字段类型不同

    like左边包含%

    or关键字未全部使用索引

    not in和not exists

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