深信服java日常实习面经

一面
项目拷打
mysql中left join和where有什么差异
mysql的分页方法
mysql左连接,右连接,内连接有什么差异
sql调优方法
说几种设计模式
springboot依赖注入的方式
说一下redis数据结构,详细说一下zset
如何保障redis的数据安全问题
线程有几种状态
线程和进程的区别
线程池如何设置参数,为什么这么设置
死锁的条件,避免死锁的方法
场景题:
给定一个线程池,给线程池提交任务,如何保障每次最多只有五个线程消费任务
快排的思路
反问环节

二面
项目拷打
java有几种锁
synchronized的原理
介绍一下aqs
介绍一下缓存雪崩,穿透,击穿,如何解决
redis为什么那么快
io多路复用的原理
介绍一下redis集群,如何保障集群高可用
说一下访问一个网站会经历什么过程
说一下你对springboot的理解
spring事物失效的场景
说一下springcloud的各个组件,分别有什么作用,原理有了解吗
说一下你对ai的理解
反问环节

印象深刻的是这些,有些忘记了

三面hr面 #面试# #深信服#  #后端# #实习生#
全部评论
佬,offer了吗
点赞 回复 分享
发布于 01-14 15:24 广东

相关推荐

01-10 21:01
门头沟学院 Java
比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率,附上代码如下比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率//通过自定义节点,hashmap,哨兵节点//删除时通过pre和next指针快速删除节点//添加时只操作头尾,通过哨兵节点快速添加节点class LRUCache {private class Node{//保留key,不然在删除尾结点的时候不能返回key让map也删除//而map又不知道尾结点是哪个int key,value;Node pre,next;Node(int key,int value){this.key=key;this.value=value;}Node(int key,int value,Node pre,Node next){this.key=key;this.value=value;this.pre=pre;this.next=next;}}private int capacity;//通过哨兵节点可以快速找到头结点和尾节点private Node dummy;//通过hashmap快速找到节点,通过节点pre指针和next指针快速实现删除private Map<Integer,Node> map=new HashMap();public LRUCache(int capacity) {this.capacity=capacity;//不能dummy=new Node(-1,-1,dummy,dummy)//这样会导致dummy的pre和next为nulldummy=new Node(-1,-1);dummy.pre=dummy;dummy.next=dummy;}public int get(int key) {if(!map.containsKey(key)) return -1;//如果存在,更新使用频率(加到头部)Node node=map.get(key);remove(node);addFirst(node);return node.value;}public void put(int key, int value) {Node node;if(!map.containsKey(key)){while(map.size()>=capacity){int removeKey=removeLast();map.remove(removeKey);}node=new Node(key,value);addFirst(node);}else{//否则更新数值重新加入node=map.get(key);node.value=value;remove(node);addFirst(node);}map.put(key,node);}public void remove(Node node){Node pre=node.pre;Node next=node.next;pre.next=next;next.pre=pre;}public int removeLast(){Node tail=dummy.pre;remove(tail);return tail.key;}public void addFirst(Node node){//通过哨兵结点快速找到头结点Node head=dummy.next;head.pre=node;node.next=head;dummy.next=node;node.pre=dummy;}}
查看1道真题和解析
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务