20240725面经背诵

  1. 分布式服务对接口做限流的方案?

    • 利用Nginx提供的漏桶算法对在网关之前对所有服务进行统一限流
    • 利用SpringCloud中的令牌桶来实现限流
      • 在网关中,利用bucket4j来实现桶,定义一个配置类来定义桶大小和桶中令牌生成频率,如果要根据ip限流,那就将桶存入一个ConcurrentHashMap中,key为ip,value是桶,如果是无差别限流,那么只定义一个单例桶即可。
      • 在配置文件中配置要限流的服务的url,路径的断言,以及我们对应限流的过滤器。
  2. 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
  3. Java中的设计模式?

    • 单例模式:Runtime对象,在一个Java程序中只会有一个这个对象
    • 工厂模式:Calendar.getInstance()就是一个工厂方法
    • 适配器模式:Arrays.asList,将数组适配为List
    • 装饰器模式:BufferedInputStream为对InputStream添加缓冲功能
    • 代理模式:java.lang.reflect.Proxy对象就是用于创建代理对象
    • 模板方法模式:Reader和InputStream中的read方法,OutputStream和writer中的write方法,都是在接口中定义了算法的输入和输出,具体实现是依靠实现类
    • 观察者模式:java中的Observer采用了这种模式
    • 策略模式:Comparator中的compare方法,可以自定义排序规则
  4. java中的反射理解?

    • java中的反射赋予了我们在运行时操作对象中的属性,方法的能力
    • 可以通过Class.forName(全限定类名)获取类对象
    • 通过类对象的newInstance()方法创建一个该类的实例
    • 通过类对象的getDeclaredField(字段名)获取该类的某个字段的对象Field
    • 如果访问私有字段的话,需要调用setAccessible(true)
    • 通过调用Field.get(Obj)可获取对应对象的字段值
    • 通过类对象getDeclaredMethod(方法名,参数类型)获得方法对象Method,通过Method.invoke(Obj,参数)执行方法
    • 通过Class.getDeclaredConstructor(参数类型)来获取构造方法,并通过invoke(参数)来获得一个实例
  5. 十万个单词,从中找出访问频率最高的单词?

    • 使用哈希表来计算,key存储单词,value存储对应的次数
  6. Java中的集合有那些?

    • List:确保元素的插入顺序
      • ArrayList
      • LinkedList
      • CopyOnWriteArrayList
    • Set:确保元素值的唯一性
      • HashSet
      • TreeSet
    • Map:键值对
      • HashMap
      • HashTable
      • TreeMap
      • LinkedHashMap
      • ConcurrentHashMap
  7. 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位置
  8. String中的字符数组为什么要用final修饰?

    • 确保String对象一旦被创建出来后不可直接对字符串进行修改,所有的修改都是新创建字符串来代替,确保字符串都是常量,可以被存放在字符串常量池中
    • 可以缓存hashCode值,防止对字符串的修改导致需要对hashCode值进行修改
    • 确保字符串对象是线程安全的
  9. TCP依靠什么实现可靠传输?

    • 利用数据块进行传输
    • 校验和,TCP确保数据包首部和数据校验和,校验和验证不通过的包会被丢弃
    • 重传机制:如果在发送数据包后一段时间未收到对端的确认信号,则会触发重传
    • 流量控制:通过控制滑动窗口来限制流量
    • 拥塞控制;保证低丢包率
    • 对失序数据包进行重新排序以及去重
  10. 从键入url到浏览器渲染网页完成,中间发生什么?

    • 根据url去DNS服务器中去找对应的ip地址和端口
    • 根据查到的ip和端口与服务器简历TCP连接
    • 建立连接后向服务器发送http请求报文
    • 服务器接收到报文后,进行处理,返回响应的报文
    • 浏览器根据响应的静态资源和动态响应来渲染网页,同时根据响应报文中的其他资源的url去请求其他静态资源。
  11. 线程和进程说一下?

    • 进程是操作系统运行程序的基本单位,线程是进程中更小的执行单位
    • 进程之间占用的资源相互隔离,而同一进程的多个线程共享进程的资源
    • 线程切换的开销比进程切换的开销要小
    • 线程可以在多核环境下真正实现并行,而进程只能并发执行
  12. 进程间通信方式?

    • 管道:父子进程之间的匿名管道,其他进程之间的命名管道
    • 消息队列:操作系统提供的
    • 信号量:用于进程之间共享资源的控制
    • 套接字
    • 文件
  13. linux怎么查看JVM进程id,怎么杀死一个线程?

    • ps -ef | grep java
    • kill (可选)-9 进程id
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值