面试题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操作的并发性。
- 默认隔离级别为RR
-
封锁粒度,封锁类型有哪些
行级锁、表级锁
排它锁、共享锁
记录锁、间隙锁、临建锁
-
什么是脏读,什么是不可重复读
其他事务未提交数据
其他事务修改
-
讲一下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,扩容
- 链表长度大于8,判断是否转为红黑树
- 数组引发
- 数组元素大于容量与扩容因子之积,扩容
- 链表引发
- put
- HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
- 如果当前位置无元素的话直接放在当前位置
- 如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)
- HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
- get
- HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
- 如果该位置无链表的话直接返回
- 如果该位置有链表的话需遍历链表,然后通过key对象的equals方法逐一比对查找
- HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置
- 扰动函数
-
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
-
有什么想问的?