Java面经学习2

devtools/2024/9/23 13:07:07/

来源

https://www.nowcoder.com/discuss/619573767051800576

1.一面内容

RocketMQ延时消息(项目用到了)底层怎么实现的(不会)
消息量太大导致读消息延迟时间很长怎么办
redis为什么快(说了内存、数据结构优化、单线程不用考虑线程安全、io多路复用)
单线程模型有什么缺点,有什么不太适用的场景
redis的大key问题,为什么会产生大key
redis怎么设置过期时间,底层是怎么实现的,有哪些过期删除策略
普通索引、(a b c)联合索引,如果只通过b等值查询能走索引吗,如果用a和c呢
线程池主要解决什么问题,有什么优点
线程池的原理、来了一个任务后的处理流程
keepAliveTime对核心线程是否生效,是否能杀死核心线程
那如果我想杀死核心线程应该怎么做(不太会,说了动态地修改核心线程数,下来查资料才知道有核心线程的过期时间参数)
线程安全问题怎么解决
除了加锁还有什么方法,有没有无锁化方法
读写锁听过吗,大概说说
ThreadLocal说说
线程池和ThreadLocal一起用会有什么问题吗(说了内存泄漏,面试官补充了个可能有脏数据)
lc53 最大子数组和
反问
  1. RocketMQ延迟消息: 定时扫描延迟队列,到达延迟的时间就执行发送
  2. 消息量太大导致的延迟时间长,这里应该说的是消费端的延迟:增加消费端性能,过滤消息,修改为拉取消息的形式
  3. redis为什么快:存在于内存中.数据结构简单.单线程不用考虑线程安全.io多路复用,非阻塞io,一个线程处理事件. 使用了简单编码的网络协议,网络通信更快
  4. 单线程模型有什么缺点,有什么不太适用的场景:高并发场景,单线程无法使用多核优势.一个线程阻塞,整个系统都会阻塞.高io场景,系统延迟可能会增高.长时间计算任务可能会阻塞.
  5. redis的大key问题是什么,为什么会产生大key:存储的key信息过大,导致网络传输慢,涉及到大key的操作有较大延迟.大key的产生主要是不合理的数据结构,对象的序列化生成的.
  6. redis怎么设置过期时间,底层是怎么实现的,有哪些过期删除策略:
Expire myKey expire_time;
set myKey value EX expire_time;

底层维护一个过期字典数据结构,存放key:过期时间的键值对.
删除策略: 1. 定时删除. 2. 惰性删除:访问到这个key的时候,如果key过期了就删除. 3. 定时+惰性 4. 惰性+内存回收:当内存到达一定阈值进行一次回收

  1. 联合索引中遵循最左原则:从左向右,如果不包含最左边的则不能使用该索引
  2. 解决的问题:减少开启和销毁线程的开销(次数),控制线程的个数. 优点:降低资源消耗,提升性能,调度线程
  3. 流程:如果线程池中线程总数小于设置的核心线程数(不论是否有空闲的线程),则新增线程执行,如果达到了核心线程数量,那么吧任务加到等待队列,如果等待队列已满,那么线程池会创建新线程来处理任务,直到线程数量达到了最大线程数量.如果线程达到最大线程数量,而且任务队列已满,那么这个任务会fallback,以设置的策略执行.当非核心线程空闲一段时间后会自行销毁.
  4. keepAliveTime不对核心线程生效
  5. 想要关闭核心线程:ThreadPoolExecutor的 allowCoreThreadTimeOut参数可以让核心线程也过期关闭
  6. 线程安全问题怎么解决:加锁,使用线程安全的类和数据结构
  7. 有没有无锁化方法:原子操作,读写锁
  8. 读写锁:读可以并发,读写互斥,写写互斥
  9. ThreadLocal:可以生成线程,每一个线程内部有自己独立的变量副本,存储在TreadLocalMap中,key为线程id,value为其副本数据
  10. 线程池和ThreadLocal一起用会有什么问题吗:threadLocal的线程回到线程池中,其关联的对象仍然存活,造成内存泄漏.也会有脏数据
  11. 算法题:最大子数组和:昨天的面经1里也有这道题,dp[i] = Math.max(dp[i-1],0) + nums[i];

2.二面内容

布隆过滤器原理(项目用到了)
布隆过滤器有什么问题,为什么不能删除
Object类有哪些方法,都有什么用
hashcode和equal有什么关系
hash冲突有哪些解决方法
wait和notify是用来做什么的
wait和sleep有什么区别
wait带参和不带参有什么区别
如果wait带参,到时间后会做什么
到时之后如果获取不到对象锁不还是得等别的线程notify吗,这和不带参有啥区别
说说垃圾回收
lc32 最长有效括号
  1. 布隆过滤器:使用bitmap来标记是否存在某个元素,计算该元素多个hash值,如果这些hash都存在,说明这个元素可能存在.但可能误判. 但是如果说没有,那是一定不存在的
  2. 不能删除:删除一个元素对应的hash值,可能会影响其他元素的判别,和误判存在是一样的原理
  3. 常见的方法:toString() hashCode() equals() getClass() synchronize关键字下(wait(),notify() notifyAll())
  4. hashcode和equal有什么关系:equals的判断是根据hashcode的,hashcode的计算涉及到属性,能保证对象属性都相同才是同一个属性
  5. wait()使一个线程释放所有拥有的对象锁,并且被阻塞:不消耗cpu,直到被notify(),或notifyAll()
  6. wait()和sleep()的区别:wait()只能对同步块中使用,sleep()对线程在任何地方都可以使用,wait()后线程会释放所有的锁,而sleep不会,wait()不指定时间,sleep()指定时间.wait()的线程不会消耗cpu,sleep的线程仍然会消耗,并且可以被调度
  7. wait带参数超时时间,wait超过这个时间会自动结束,不带参数会永远直到notify
  8. 带参数还是需要被唤醒,那么和无参有什么区别呢:可以更好处理超时问题
  9. 垃圾回收:堆,新生代,老年代. 新生代满了会触发gc, 老年代满了会fullgc
  10. 最长有效括号
    核心思想:推导公式
java">class Solution {public int longestValidParentheses(String s) {if (s.equals(""))return 0;int[] dp = new int[s.length()];dp[0] = 0;int max = 0;for (int i = 1; i < s.length(); i++) {// ()形式的,等于前面的有效括号个数+2if (s.charAt(i) == ')' && s.charAt(i - 1) == '(') {dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;} else if (s.charAt(i) == ')' && s.charAt(i - 1) == ')') {// )) 形式,如果前面使匹配的( ,就是前面(之前的有效和 (到 )之间的有效和 +2 if (i - dp[i - 1] - 1 >= 0  && s.charAt(i - dp[i - 1] - 1) == '(') {dp[i] = dp[i-1]+ ((i-dp[i-1])>=2 ? dp[i-dp[i-1] -2]  :0 )+ 2;}}max = Math.max(max, dp[i]);}return max;}
}

3.三面内容

java">什么场景适合分布式事务
微服务了解吗
说说tcp,它有哪些优点在平时的开发中有借鉴意义
说说http
javaNIO主要是为了减少线程数,为什么线程数多了会有问题
线程安全版lru
  1. 什么场景适合分布式事务:跨多个数据源,消息队列,数据库,服务,系统.需要分布式事务
  2. 微服务:了解springcloud Netflix一套,eureka服务注册,服务熔断
  3. tcp:传输层控制协议,基于字节流.可靠有序,有拥塞控制,流量控制.借鉴TCP的确认,重传和排序机制来保证数据的完整性和顺序,动态调整发送速率和控制发送窗口来避免拥塞
  4. http:是应用层协议,使用tcp进行传递信息,无状态,可以传输多种信息,本身不安全,可以配合ssl证书.有多种请求方法.
  5. 线程多了对内存占用多,上下文切换开销大,线程调度有开销
  6. LRU可以使用LinkedHashMap实现,线程安全可以给操作加上synchronized
java">
public class  ThreadSafeLRUCache<K,V>{private final Map<K,V> cache ;private final int capacity;public ThreadSafeLRUCache(int capacity){this.capacity = capacity;// true 为访问顺序, false为插入顺序this.cache = new LinkedHashMap<K,V>(capacity,0.75f,true){@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}};}public synchronized V get(K key){return cache.get(key);}public synchronized void put(K key,V value){cache.put(key,value);}public synchronized void remove(K key){cache.remove(key);}public synchronized int size(){return cache.size();}}

http://www.ppmy.cn/devtools/41663.html

相关文章

PCIE协议-2-事务层规范-Message Request Rules-Vendor_Defined Messages

2.2.8.6 厂商定义消息 厂商定义消息允许扩展PCI Express消息功能&#xff0c;可以作为PCI Express规范的一般扩展&#xff0c;也可以是厂商特定的扩展。本节通用地定义了与这些消息相关的规则。 厂商定义消息&#xff08;见表2-25&#xff09;使用图2-28中显示的头标格式。re…

【工具篇】-什么是.NET

“.NET"&#xff1a;.NET Core是由Microsoft开发&#xff0c;目前在.NET Foundation(一个非营利的开源组织)下进行管理。.NET Core是用C#和C编写的&#xff0c;并采用MIT协议作为开源协议。 简单来说&#xff1a;就是开发框架。 .NET 又称 .NET 平台或 .NET 框架&#xf…

k8s源码编译失败:Makefile:1: *** 缺失分隔符。 停止。

目录 问题解决 更换Arch或系统 问题解决 编译k8s源码的kubelet时执行make失败&#xff1a;Makefile:1: *** 缺失分隔符。 停止。 首先&#xff0c;查看文件内容 # cat Makefile build/root/Makefile 修改Makefile&#xff0c;给第一行前增加include&#xff0c;如下&…

Python3 笔记:循环结构 while语句

程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构&#xff0c;允许更复杂的执行路径。循环语句允许我们多次执行一个语句或语句组。 while是Python语言中构造循环结构程序的语句之一&#xff0c;在Python语言中&#xff0c;虽然绝大多数的循环结构都是用for语句来…

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

Redis 6.x的ACL功能

Redis ACL Redis ACL (访问控制列表) 是 Access Control List 的缩写&#xff0c;它允许某些连接在可以执行的命令和可以访问的密钥方面受到限制。它的工作方式是&#xff0c;在连接后&#xff0c;客户端需要提供 username/用户名 和有效 password/密码 来进行 authenticate/身…

使用 Python 进行图像验证码识别训练及调用

目录 1、验证码识别原理1.1 Tensorflow 介绍1.2 Tensorflow 运行原理1.3 卷积神经网络 CNN&#xff08;Convolutional Neural Networks&#xff09; 2、验证码识别实现步骤2.1 安装第三方模块2.1.1 安装 TensorFlow 模块2.2.2 安装 cuda2.2.3 下载 cudnn 2.2 读取验证码样本形成…

字符串函数(二):strlen(求长度),strstr(查找子串),strtok(分割),strerror(打印错误信息)

字符串函数 一.strlen&#xff08;求字符串长度&#xff09;1.函数使用2.模拟实现&#xff08;三种方法&#xff09; 二.strstr&#xff08;字符串查找子串&#xff09;1.函数使用2.模拟实现 三.strtok&#xff08;字符串分割&#xff09;四.strerror&#xff0c;perror&#x…