【面试记录】支付宝面试考察技术点

支付宝面试考察技术点

      • 1. JDK基础
          • 1.1 HashMap源码
          • 1.2 线程池原理
          • 1.3 [Java8新特性](https://developer.51cto.com/article/647804.html)
          • 1.4 [锁机制](https://tech.meituan.com/2018/11/15/java-lock.html)(CAS/AQS/重量级 & 轻量级/偏向锁/独占锁/具体实现/ConcurrentHashMap)
          • 1.5 [动态代理机制](https://javaguide.cn/java/basis/proxy/)
          • 1.6 [NIO](https://javaguide.cn/java/basis/io/#aio-asynchronous-i-o)工作方式(IO模型 / Channel / Selector / Buffer / Epoll)
          • 1.7 面向对象设计模式
          • 1.8 [Fork/Join](https://www.twle.cn/c/yufei/javatm/javatm-basic-forkjoin.html)
      • 2. JVM基础
          • 2.1 JVM内存区域
          • 2.2 Java对象创建过程
          • 2.3 对齐填充
          • 2.4 GC算法
          • 2.5 性能调优 / 问题排查
      • 3. 缓存相关
          • 3.1 Redis数据结构
          • 3.2 缓存穿透/雪崩/预热/更新
          • 3.3 高可用保证
          • 3.4 集群分片机制(路由/扩容/收缩)
          • 3.5 具体使用场景
      • 4. 消息相关
          • 4.1 [消息的推拉模式](https://blog.csdn.net/wabiaozia/article/details/102057941)
          • 4.2 整体技术架构
          • 4.3 消息的可靠性保证
          • 4.4 部署模式(主从)
          • 4.5 具体使用场景
      • 5. 数据库相关
          • 5.1 索引数据结构
          • 5.2 聚簇索引和非聚簇索引
          • 5.3 单机事务
          • 5.4 隔离级别
          • 5.5 高可用方案
          • 5.6 水平分库分表(路由策略/水平扩容)
          • 5.7 乐观锁/悲观锁
          • 5.8 搜索引擎工作原理
      • 6. 分布式技术
      • 7. 应用框架相关
          • 7.1 Spring IOC&AOP原理(织入方式)
          • 7.2 Spring MVC的工作流程
          • 7.3 SpringBoot源码理解
          • 7.4 Spring事务控制
          • 7.5 [MyBatis](https://javaguide.cn/system-design/framework/mybatis/mybatis-interview/)工作原理
      • 8.Web开发
          • 8.1 WEB容器(Tomcat/[Netty](https://www.163.com/dy/article/FRNK1U3K0511X1MK.html))
          • 8.2 [HTTP协议(1.1/2.0)](https://juejin.cn/post/6963931777962344455)
          • 8.3 [WebSocket协议](http://www.noobyard.com/article/p-weguifxd-ru.html)
          • 8.4 [TCP/UDP](https://javaguide.cn/cs-basics/network/other-network-questions/)
          • 8.5 [Restful规范](https://javaguide.cn/system-design/basis/RESTfulAPI/#)
          • 8.6 [登录认证(OAuth2/JWT)](https://javaguide.cn/system-design/security/basis-of-authority-certification/)
          • 8.7 [权限设计](https://blog.51cto.com/u_13260163/3095454)
          • 8.8 [RBAC模型](https://www.cnblogs.com/hoanfir/p/9088668.html)
      • 9. 开发工具
      • 10. 其他

1. JDK基础

1.1 HashMap源码
  • JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的(“拉链法”解决冲突)。
    • HashMap 通过key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这⾥的 n 指的是数组的⻓度),如果当前位置存在元素的话,就判断该元素与要存
      ⼊的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。
    • 所谓扰动函数指的就是 HashMap 的 hash ⽅法。使⽤ hash ⽅法也就是扰动函数是为了防⽌⼀
      些实现⽐较差的 hashCode() ⽅法 换句话说使⽤扰动函数之后可以减少碰撞。
    • 所谓 拉链法 就是:将链表和数组相结合。也就是说创建⼀个链表数组,数组中每⼀格就是⼀
      个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
  • JDK1.8 以后在解决哈希冲突时有了较⼤的变化,当链表⻓度⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如果当前数组的⻓度⼩于 64,那么会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以减少搜索时间。
    • TreeMap、 TreeSet 以及 JDK1.8 之后的 HashMap 底层都⽤到了红⿊树。红⿊树就是为了解决⼆叉查找树的缺陷,因为⼆叉查找树在某些情况下会退化成⼀个线性结构。
    • HashMap 的⻓度为什么是2的幂次⽅:为了能让 HashMap 存取⾼效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上⾯也讲到了过了, Hash 值的范围值-2147483648到2147483647,前后加起来⼤概40亿的映射空间,只要哈希函数映射得⽐较均匀松散,⼀般应⽤是很难出现碰撞的。但问题是⼀个40亿⻓度的数组,内存是放不下的。所以这个散列值是不能直接拿来⽤的。⽤之前还要先做对数组的⻓度取模运算,得到的余数才能⽤来要存放的位置也就是对应的数组下标。这个数组下标的计算⽅法是“ (n - 1) & hash ”。(n代表数组⻓度)。这也就解释了 HashMap 的⻓度为什么是2的幂次⽅。
1.2 线程池原理
  • 池化技术的思想主要是为了减少每次获取资源的消耗,提⾼对资源的利⽤率。
  • ThreadPoolExecutor 3 个最重要的参数:
    • corePoolSize : 核⼼线程数线程数定义了最⼩可以同时运⾏的线程数量。
    • maximumPoolSize : 当队列中存放的任务达到队列容量的时候,当前可以同时运⾏的线程数量变为最⼤线程数。
    • workQueue : 当新任务来的时候会先判断当前运⾏的线程数量是否达到核⼼线程数,如果达到的话,新任务就会被存放在队列中。
  • ThreadPoolExecutor 其他常⻅参数:
    1. keepAliveTime :当线程池中的线程数量⼤于 corePoolSize 的时候,如果这时没有新的任务提交,核⼼线程外的线程不会⽴即销毁,⽽是会等待,直到等待的时间超过了keepAliveTime 才会被回收销毁;
    2. unit : keepAliveTime 参数的时间单位。
    3. threadFactory :executor 创建新线程的时候会⽤到。
    4. handler :饱和策略。关于饱和策略下⾯单独介绍⼀下。
  • 饱和策略:如果当前同时运⾏的线程数量达到最⼤线程数量并且队列也已经被放满了任务时, ThreadPoolTaskExecutor 定义⼀些策略:
    • ThreadPoolExecutor.AbortPolicy :抛出 RejectedExecutionException 来拒绝新任务的处理。
    • ThreadPoolExecutor.CallerRunsPolicy :调⽤执⾏⾃⼰的线程运⾏任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应⽤程序可以承受此延迟并且你不能任务丢弃任何⼀个任务请求的话,你可以选择这个策略。
    • ThreadPoolExecutor.DiscardPolicy : 不处理新任务,直接丢弃掉。
    • ThreadPoolExecutor.DiscardOldestPolicy : 此策略将丢弃最早的未处理的任务请求。
  • 解释:我们在代码中模拟了 10 个任务,我们配置的核⼼线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执⾏,剩下的 5 个任务会被放到等待队列中去。当前的 5 个任务之⾏完成后,才会之⾏剩下的 5 个任务。
1.3 Java8新特性
  • Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • Date Time API − 加强对日期与时间的处理。
  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
1.4 锁机制(CAS/AQS/重量级 & 轻量级/偏向锁/独占锁/具体实现/ConcurrentHashMap)
  • 锁的种类

你可能感兴趣的:(面试,面试,散列表,哈希算法)