面试题day21

京东

  • 简单自我介绍

  • 参加过社团活动吗?

  • 讲一下什么是线程池

    一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

    池化技术:降低资源消耗、提高响应速度、便于管理

  • spring中的ioc你怎么理解,aop呢

    Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

    Spring AOP 就是基于动态代理的。常用于计算接口运算时间、记录日志。

  • 知道netty吗 讲一下一个设计模式吧 reactor模式

    反应器设计模式

  • 说了下单例模式和迭代器模式

    • 满足要求
      • 构造私有、变量私有静态、方法公有静态
    • 懒汉式和饿汉式
      • 饿汉式,在装载类时就完成实例化
      • 懒汉式,在调用方法时完成实例化
    • 双重校验锁
      • 第一重校验在Sychronized外,提高性能,避免不必要的加锁
      • 第二重校验在Sychronized内,防止多次创建,可能多个线程通过第一重校验,创建实例前不加第二重校验的话,可能会线程安全的创建两次实例
    • volatile/final
      • 修饰成员变量,防止指令重排
    • 枚举
      • 自动支持序列化机制,防止反序列化重新创建新的对象,防止反射破坏
  • 什么是原子性(atomicity)

    要么一起成功(A帐户成功减少一块石头,同时B得到一块石头),要么一起失败(A回到原来状态,B也回到原来状态)的操作叫原子性操作。

  • 有一条mysql查询很慢,你有什么优化手段,请讲一下

    • 多表关联最多2张
    • 使用left join或right join代替not in和exist
    • 不使用外键和触发器
    • 避免索引失效
  • 说一下你从本科到研究生收获最大的一件事是什么

  • 说下你未来3-5年的职业计划

  • 反问交流环节

小米

2022校招 java后端一面凉经

  • 自我介绍 介绍一个你做的相对较好一点的项目

  • 说说索引的结构,为什么最左前缀原则就快了,原因是什么你尝试过了解吗

  • 为什么用b+树不用红黑树,用红黑树时间复杂度是多少

    O(logn)

  • 事务的特性哪几点 分别介绍一下

    acid 原子性(undolog) 隔离性(mvcc+锁) 持久性(redolog) 一致性

  • 保证原子性mysql表里面是怎么实现的

    undolog

  • 隔离级别有哪几种说一下,默认是哪一种

    ru rc rr s

    • 默认隔离级别为RR
      • 原因
        • RC隔离级别下的基于binlog的主从复制会发生问题
      • 解决方案
        • 使用RR隔离级别下的间隙锁
        • 切换RC隔离级别的binlog日志模式为row
    • 互联网项目隔离级别为RC
      • 在RR隔离级别下,存在间隙锁,易导致出现死锁
      • 在RR隔离级别下,条件列未命中索引会锁表;而在RC隔离级别下,只锁行。
      • 在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性。
  • 封锁粒度,封锁类型有哪些

    行级锁、表级锁

    排它锁、共享锁

    记录锁、间隙锁、临建锁

  • 什么是脏读,什么是不可重复读

    其他事务未提交数据

    其他事务修改

  • 讲一下java的容器有哪些

    list arraylist、linkedlist

    set hashset、treeset

    map hashmap、treemap

  • arraylist和linkedlist有什么区别吗

    • ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
    • 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
    • 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
    • 多读少写 多写少读
  • map里面的hashmap了解过吗 说下底层结构

    链表散列+红黑树

    • 扰动函数
      • (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞
    • 扩容
      • 链表引发
        • 链表长度大于8,判断是否转为红黑树
          • 数组大小大于64,转红黑树
          • 数组大小小于64,扩容
      • 数组引发
        • 数组元素大于容量与扩容因子之积,扩容
    • put
      • HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
        • 如果当前位置无元素的话直接放在当前位置
        • 如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)
    • get
      • HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
        • 如果该位置无链表的话直接返回
        • 如果该位置有链表的话需遍历链表,然后通过key对象的equals方法逐一比对查找
  • hahsmap默认容量是多少,达到多少会扩容

  • 多线程的hashmap冲突了怎么办,怎么解决

    ConcurrentHashMap/Collections.synchronizedMap(map)

  • ConcurrentHashMap了解吗,说一下

    • 原理

      • 通过部分锁定+CAS算法来进行实现线程安全的
    • 初始化

      • 通过自旋和 CAS 初始化操作,扩容阈值0.75
    • put

      • 先计算哈希值
      • 再确定map是否初始化
      • 插入数据
        • 数组插入,cas
        • 链表插入,先扩容,加锁
    • get

      • get方法是非阻塞,无锁的。重写Node类,通过volatile修饰next来实现每次获取都是最新设置的值
  • ReentranLock了解吗

    • 核心思想
      • 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
    • 操作流程
      • AQS 使用一个 int 成员变量来表示同步状态,通过内置的 FIFO 队列来完成获取资源线程的排队工作。AQS 使用 CAS 对该同步状态进行原子操作实现对其值的修改。
    • 公平锁和非公平锁
      • 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。
      • 非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。
    • 条件队列
      • AQS中实现ConditionObject,它实现了Condition接口,实现一个绑定在锁上的条件队列Condition,替代了 Object 监视器方法
    • Reentrantlock
      • 具体实现了tryAcquire、nofairTryAcquire、tryRelease
  • 你刚刚提到jdk1.8里面改进成了CAS 说一下你的理解,CAS失败了怎么办

    LongAdder类,尝试使用分段CAS以及自动分段迁移的方式来大幅度替身多线程高并发执行CAS的性能

  • synchronized了解吗,底层怎么实现的说一下

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

    对象头存储信息不同

    • 加锁方式

      • 同步代码块(monitorenter和monitorexit)
      • 同步方法(ACC_SYNCHRONIZED)
    • 操作流程

      • 首先会进入 EntryList 集合,当线程获取到对象的monitor后,进入 _Owner区域并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加1;
      • 若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 WaitSet集合中等待被唤醒;
      • 若当前线程执行完毕,也将释放monitor(锁)并复位count的值,以便其他线程进入获取monitor(锁);
  • 你刚说道volatile,讲一下它的实现原理

    内存屏障实现可见性和防止指令重排

  • sql注入了解吗

  • 你的项目里面用到了mybatis,他是怎么防止sql注入的

    {} 预编译

  • tcp三次握手四次挥手说一下

    seq x

    ack x+1 seq y

    ack y+1

  • linux平时有了解过吗,用过哪些命令

    • chmod 授权
    • ps -ef | grep 查看进程
    • kill -9 杀死进程
    • tail -f 实时读取日志
    • netstat -anp | grep 查看端口号
    • ping 测试地址
    • mkdir 创建文件夹
    • rmdir 删除文件夹
    • touch 创建文件
    • rm 删除文件
    • mv 移除文件
    • cp 复制文件
    • cat 查看文件
  • redis讲一下为什么单线程还那么快呢

    • 纯内存操作
    • 使用IO多路复用技术
    • 非CPU密集型任务
    • 单线程的优势
  • 判断链表是否有环 做完了讲一下思路

    hashset缓存、快慢指针

  • 反问环节

网易有道

java一二三面

  • 自我介绍,问项目相关。没有问具体细节,问的是涉及到的技术栈方法的基本知识。

  • hashmap的put过程

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置

    • 如果当前位置无元素的话直接放在当前位置
    • 如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)
  • hashcode和equals关系

    equals=>hashcode

  • jvm中怎么判断一个对象可以回收,可达性分析中的安全点,gc root可以是什么

    引用计数法、可达性分析

    安全点是在程序执行期间的所有GC Root已知并且所有堆对象的内容一致的点。

    本地方法栈、虚拟机栈、静态变量、常量

  • 垃圾收集器

  • spring的启动流程

    • 初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
    • 将配置类的BeanDefinition注册到容器中
    • 调用refresh()方法刷新容器
  • bean的创建过程

    • 推断构造方法
    • 依赖注入
    • 初始化前
    • 初始化
    • 初始化后
  • 算法:二叉树的先序遍历,非递归版

  • 设计模式相关,单例模式静态内部类的实现

  • linux的文件有哪些属性

    第 0 位确定文件类型
    第 1-3 位确定属主(该文件的所有者)拥有该文件的权限
    第 4-6 位确定属组(所有者的同组用户)拥有该文件的权限
    第 7-9 位确定其他用户拥有该文件的权限

泰隆银行

Java一面面经

  • 秒杀系统的设计

  • SpringBoot和SpringCloud的区别

  • 微服务之间的调用方式,如果保证调用的正确性

  • HashMap和HashTable之间的区别

    线程安全、空值、扩容、初始值

  • hashMap如何获取一个值

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置

    • 如果该位置无链表的话直接返回
    • 如果该位置有链表的话需遍历链表,然后通过key对象的equals方法逐一比对查找
  • HashMap如何存值:put()方法

  • LinkedHashMap

    有序的hashmap

  • 有什么想问的?

posted @ 2022-08-03 22:54  Faetbwac  阅读(13)  评论(0编辑  收藏  举报