面试题day22
广联达
秋招面试22届java面经
-
自我介绍
-
聊了聊项目
-
http与https,分别是什么,区别是什么
端口、ssl加密、证书
-
https的请求方式
-
封装继承多态
将bean封装,提供调用方法、子类继承父类、重载和重写
-
hashmap底层,扩容机制,容量为什么是2的幂
- 扰动函数
(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 判断当前元素存放的位置
- 扰动函数
-
数据库怎么优化
- 多表关联最多2张
- 使用left join或right join代替not in和exist
- 不使用外键和触发器
- 查找避免索引失效
- 逻辑删除
- 更新使用id作为条件,更新非索引字段
- 增加 id有顺序
-
数据库索引
b+树、hash索引、数组索引
-
java虚拟机组成
方法区 堆
本地方法栈、虚拟机栈、程序计数器、直接内存
-
怎么判断一个对象要不要回收
引用计数法、可达性分析
-
什么是GC roots
本地方法栈、虚拟机栈、静态变量、常量
-
垃圾回收器
-
进程和线程的理解
进程是资源分配的基本单位。线程是独立调度的基本单位。
-
创建线程的几种方式
thread、runnable、callable
YY直播
Java开发一面:
-
自我介绍
-
常用集合类,然后挑一个熟悉的介绍
arraylist、linkedlist、hashmap、hashset、treeset、treemap
-
JVM垃圾回收算法,垃圾回收过程
分代、复制、清除、整理
-
MySQL的事务四大特性、索引底层实现、事务隔离级别实现
acid
b+树
锁+mvcc
-
Redis的五大对象,然后他们底层的数据结构
string
- int
- embstr
- raw
list
- ziplist
- linkedlist
hash
- hash
- ziplist
set
- hash
- intset
zset
- skiplist
- ziplist
-
计算机网络OSI七层模型,介绍每一层的作用
物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
-
介绍项目(项目描述、自己负责什么,遇到的难点,如何解决的,你负责的模块,你当队长是怎么分配工作内容和管理的,挑一个模块细讲)
-
项目中为什么要拿Reids做缓存,考量是什么
中心化、支持数据类型丰富
-
怎么实现缓存一致性的,怎么解决
先修改数据库、再删除缓存
先删除缓存、再修改数据库、在删除缓存(延时双删)
二面
-
介绍一下项目
-
项目有上线吗?
-
项目整个流程
-
项目模块是怎么划分的,考量?
-
api模块和网关模块是干嘛的?说说网关作用,一个请求来了,网关如何处理?
API网关是用户与服务器之间的连接器。
-
Nacos作用?
-
物流、支付怎么做的,讲讲。
-
用户支付了,怎么保证支付成功的,网络问题怎么办?
-
用了ES是嘛,为什么要用ES?效率为什么比Mysql快?说一下他们各自的使用场景
-
用了Redis来存储是吗?为什么要用redis,考量是什么?他的作用是什么?
redis是基于内存存储计算,性能速读远超mysql等数据库,计算速度很快,所以在使用的时候数据响应很快,
redis支持多种多样的数据结构,如字符串、tree、ztree、map、等,这些丰富的数据结构,可以满足我们在开发工作大部分常见数据结构,进行存储。
redis丰富的api支持,让我们在使用的时候,常见的查询存储都能够很方便的使用,支持自定的查询的api等等
redis的生态比较成熟,很多家大型公司都在使用,很多相关的知识扩展以及分析
redis分布式集群化扩展性极高,而且稳定,能够支撑大量的数据吞吐,只要硬件支持。
-
Redis有哪些作用一般?
计数器、分布式锁、缓存、排行榜
-
讲讲分布式锁怎么实现的?
-
关键命令
- SETNX
- SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
- EXPIRE
- EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
- DELETE
- DELETE key:删除key
- SETNX
-
实现思想
-
获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
-
获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
-
释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
-
-
-
Redis为什么可以在多线程下做分布式锁
因为Redis是单线程处理的
-
spring?说说spring相比传统的开发好处是什么?
ioc、aop
-
说说你用过的注解
-
spring事务注解用过嘛?在什么情况下用的?什么情况下这个注解会失效?
aop性质导致方法必须为public
设置异常为exception
隔离级别
传播行为
-
spring特点,IOC的作用,好处是什么,为什么?
Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
-
用过ping吗?
-
计算机网络,四层模型?具体讲讲传输层和网络层干嘛的?
应用层、传输层、网络层、数据链路层
https、tcp\udp、ip
-
网络层不传输数据吗?
传输,无连接、非可靠、不确认
渤海银行
提前批面经
-
什么是反射?
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
-
重载和重写的区别,多态的两个特性,子类能重写父类构造方法吗,为什么?
方法重载、子类重写
子类不能重写父类构造方法、重写必须保证参数个数、参数类型、参数顺序一致、构造不满足条件
-
线程池是什么?
7大参数,4中拒绝策略,和java提供好的4种线程池以及优缺点
-
redis中有1E条数据,找出1W条前缀相同数据。
分批次Scan无阻塞提取列表,每次执行返回少量元素,非递增小心要去重,存入HashSet
-
redis线程模型
IO多路复用、单线程的文件派发模型