-
分布式服务对接口做限流的方案?
- 利用Nginx提供的漏桶算法对在网关之前对所有服务进行统一限流
- 利用SpringCloud中的令牌桶来实现限流
- 在网关中,利用bucket4j来实现桶,定义一个配置类来定义桶大小和桶中令牌生成频率,如果要根据ip限流,那就将桶存入一个ConcurrentHashMap中,key为ip,value是桶,如果是无差别限流,那么只定义一个单例桶即可。
- 在配置文件中配置要限流的服务的url,路径的断言,以及我们对应限流的过滤器。
-
redis淘汰策略?
- all-keys-random:所有的key,随机淘汰
- volatile-random:设置了ttl的,随机淘汰
- noeviction:不淘汰,再添加元素返回错误信息
- all-keys-lru:所有的key采用lru算法淘汰
- volatile-lru:设置了ttl的key采用lru算法淘汰
- all-keys-lfu:所有的key采用lfu算法淘汰
- volatile-lfu:设置了ttl的key采用lfu算法淘汰
- volatile-ttl:淘汰ttl最小的key
-
Java中的设计模式?
- 单例模式:Runtime对象,在一个Java程序中只会有一个这个对象
- 工厂模式:Calendar.getInstance()就是一个工厂方法
- 适配器模式:Arrays.asList,将数组适配为List
- 装饰器模式:BufferedInputStream为对InputStream添加缓冲功能
- 代理模式:java.lang.reflect.Proxy对象就是用于创建代理对象
- 模板方法模式:Reader和InputStream中的read方法,OutputStream和writer中的write方法,都是在接口中定义了算法的输入和输出,具体实现是依靠实现类
- 观察者模式:java中的Observer采用了这种模式
- 策略模式:Comparator中的compare方法,可以自定义排序规则
-
java中的反射理解?
- java中的反射赋予了我们在运行时操作对象中的属性,方法的能力
- 可以通过Class.forName(全限定类名)获取类对象
- 通过类对象的newInstance()方法创建一个该类的实例
- 通过类对象的getDeclaredField(字段名)获取该类的某个字段的对象Field
- 如果访问私有字段的话,需要调用setAccessible(true)
- 通过调用Field.get(Obj)可获取对应对象的字段值
- 通过类对象getDeclaredMethod(方法名,参数类型)获得方法对象Method,通过Method.invoke(Obj,参数)执行方法
- 通过Class.getDeclaredConstructor(参数类型)来获取构造方法,并通过invoke(参数)来获得一个实例
-
十万个单词,从中找出访问频率最高的单词?
- 使用哈希表来计算,key存储单词,value存储对应的次数
-
Java中的集合有那些?
- List:确保元素的插入顺序
- ArrayList
- LinkedList
- CopyOnWriteArrayList
- Set:确保元素值的唯一性
- HashSet
- TreeSet
- Map:键值对
- HashMap
- HashTable
- TreeMap
- LinkedHashMap
- ConcurrentHashMap
- List:确保元素的插入顺序
-
HashMap底层实现原理?
- 数据结构
数组+链表/红黑树 - put操作
- 根据key的hashCode值和hashmap的扰动函数计算hash值,然后对数组长度进行取模,得到要插入元素在数组中的位置,判断位置是否为空,为空直接赋值,不为空,判断是否是树节点,如果是树节点,那么走红黑树插入元素的逻辑,如果不是,那么遍历链表,遍历过程中如果key相等,覆盖,如果到链表尾部无重复,则插入链尾。然后判断链表长度是否>=8,那么进一步判断map中元素>=64个,如果是则转换当前链表为红黑树,如果不是,判断添加元素后元素数是否达到阈值,达到则扩容
- get操作
- 根据key的hashCode值确定位置后,判断是否为空,为空返回空,判断是否是树节点,如果是树节点,走红黑树查询,如果不是,那么遍历链表查询
- resize操作
- 计算新数组容量,记作newCapacity,值为旧容量oldCapacity * 2,判断newCapacity是否比HashMap设置的默认最大容量大,如果比默认最大容量大,那么新容量设置为默认最大容量,创建新的数组,遍历旧数组,如果节点next为null,那么直接将节点复制到新节点对应位置,如果不为null,判断是否是树节点,如果是树节点,则将红黑树进行拆分,左子树复制到新数组i位置,根节点及右子树复制到i+oldCapacity位置,如果不是树节点,那么遍历链表,每个节点重新计算hash值,hash值比oldCapacity小的插入到新数组i位置,如果不比oldCapacity小,则插入新数组i+oldCapacity位置
- 数据结构
-
String中的字符数组为什么要用final修饰?
- 确保String对象一旦被创建出来后不可直接对字符串进行修改,所有的修改都是新创建字符串来代替,确保字符串都是常量,可以被存放在字符串常量池中
- 可以缓存hashCode值,防止对字符串的修改导致需要对hashCode值进行修改
- 确保字符串对象是线程安全的
-
TCP依靠什么实现可靠传输?
- 利用数据块进行传输
- 校验和,TCP确保数据包首部和数据校验和,校验和验证不通过的包会被丢弃
- 重传机制:如果在发送数据包后一段时间未收到对端的确认信号,则会触发重传
- 流量控制:通过控制滑动窗口来限制流量
- 拥塞控制;保证低丢包率
- 对失序数据包进行重新排序以及去重
-
从键入url到浏览器渲染网页完成,中间发生什么?
- 根据url去DNS服务器中去找对应的ip地址和端口
- 根据查到的ip和端口与服务器简历TCP连接
- 建立连接后向服务器发送http请求报文
- 服务器接收到报文后,进行处理,返回响应的报文
- 浏览器根据响应的静态资源和动态响应来渲染网页,同时根据响应报文中的其他资源的url去请求其他静态资源。
-
线程和进程说一下?
- 进程是操作系统运行程序的基本单位,线程是进程中更小的执行单位
- 进程之间占用的资源相互隔离,而同一进程的多个线程共享进程的资源
- 线程切换的开销比进程切换的开销要小
- 线程可以在多核环境下真正实现并行,而进程只能并发执行
-
进程间通信方式?
- 管道:父子进程之间的匿名管道,其他进程之间的命名管道
- 消息队列:操作系统提供的
- 信号量:用于进程之间共享资源的控制
- 套接字
- 文件
-
linux怎么查看JVM进程id,怎么杀死一个线程?
- ps -ef | grep java
- kill (可选)-9 进程id
20240725面经背诵
最新推荐文章于 2024-08-14 23:12:09 发布