![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《后端面试每日一题》
文章平均质量分 75
每天一个知识点,日积月累变大牛。
lakernote
不停的复盘自己,砥砺前行,不忘初衷
展开
-
基础 小酌两个基础题 对象传参 和 字节码优化问题
文章目录第一题 对象传参第二题 字节码优化今天群里的同学问题的问题,记录一下。第一题 对象传参public class Test { public static void main(String[] args) { B b = new B(); Person p = new Person(); p.name ="laker"; p.age = 9; b.test(p); // 结果是多少原创 2022-05-27 23:19:33 · 179 阅读 · 0 评论 -
SpringMVC Controller是单例还是多例?线程安全吗?如何解决呢?
文章目录示例结论验证Controller是单例还是多例?线程安全吗?如何解决呢?示例@RestController@RequestMapping("/laker")public class HelloWordController { private int num = 1; @GetMapping @ApiOperation(value = "根据id查询") public int get() { int i = num++; Sys原创 2022-05-24 22:26:27 · 475 阅读 · 0 评论 -
后端面试每日一题 保证幂等性
保证幂等性幂等性的实现方案通常分为以下几类:前端拦截使用数据库实现幂等性使用 JVM 锁实现幂等性使用分布式锁实现幂等性前端拦截前端拦截是指通过 Web 站点的页面进行请求拦截,比如在用户点击完“提交”按钮后,我们可以把按钮设置为不可用或者隐藏状态,避免用户重复点击。执行效果如下图所示:按钮点击效果图核心的实现代码如下:<script> function subCli(){ // 按钮设置为不可用 document.getEle原创 2021-05-27 13:52:15 · 457 阅读 · 0 评论 -
后端面试每日一题 插入排序和选择排序
插入排序插入排序(Insertion Sort)算法是指依次循环当前的列表,通过对比将每个元素插入到合适的位置,它的具体执行过程,如下图所示:插入算法的具体实现代码如下:public class AlgorithmExample { public static void main(String[] args) { int[] insertNums = {4, 33, 10, 13, 49, 20, 8}; // 插入排序调用 insertS.原创 2021-05-27 11:41:41 · 155 阅读 · 1 评论 -
后端面试每日一题 垃圾收集器
《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是 OracleJDK 中自带的 HotSpot 虚拟机。HotSpot 中使用的垃圾收集器主要包括 7 个:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS 和 G1(Garbage First)收集器。其中 Serial 收集器属于最早期的垃圾收集器,也是 JDK 1.3 版本之前唯一的垃圾收集器。它是单线程运原创 2021-05-27 11:19:47 · 152 阅读 · 0 评论 -
后端面试每日一题 垃圾回收算法
说到 Java 虚拟机不得不提的一个词就是 “垃圾回收”(GC,Garbage Collection),而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论支持。垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法。引用计数算法(Reference Counting) 属于垃圾收集器最早原创 2021-05-27 11:05:43 · 142 阅读 · 0 评论 -
后端面试每日一题 说一下 JVM 的内存布局和运行原理?
JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会根据特定的操作系统生成对应的操作指令)。JVM 的功能很强大,像 Java 对象的创建、使用和销毁,还有垃圾回收以及某些高级的性能优化,例如,热点代码检测等功能都是在 JVM 中进行的。JVM 的种类有很多,比如 HotSpo原创 2021-05-27 10:43:41 · 141 阅读 · 0 评论 -
后端面试每日一题 Redis实现消息队列
Redis实现消息队列早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种:使用 List 类型实现使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过 lpush、rpop 存入和读取实现消息队列的,如下图所示:lpush 可以把最新的消息存储到消息队列(List 集合)的首部,而 rpop 可以读取消息队列的尾部,这样就实现了先进先出,如下图所示:命令行的实现命令如下:127.0.0.1:6379> lpush mq "原创 2021-05-27 10:19:18 · 262 阅读 · 2 评论 -
后端面试每日一题 Redis实现分布式锁
文章目录实现过程第一层:setnx key value第二层:setnx key value + expire key TIME_IN_SECONDS第三层:set key value ex 30 nx第四层:解决锁超时导致问题重点看下锁超时部分,还有多实例Redis如何实现分布式锁分布式锁的常见实现方式有四种:基于 MySQL 的悲观锁来实现分布式锁,这种方式使用的最少,因为这种实现方式的性能不好,且容易造成死锁;基于 Memcached 实现分布式锁,可使用 add 方法来实现,如果添加成原创 2021-05-27 10:06:23 · 208 阅读 · 0 评论 -
后端面试每日一题 Redis 的过期策略和内存淘汰机制
我们在新增 Redis 缓存时可以设置缓存的过期时间,该时间保证了数据在规定的时间内失效,可以借助这个特性来实现很多功能。比如,存储一定天数的用户(登录)会话信息,这样在一定范围内用户不用重复登录了,但为了安全性,需要在一定时间之后重新验证用户的信息。因此,我们可以使用 Redis 设置过期时间来存储用户的会话信息。对于已经过期的数据,Redis 将使用两种策略来删除这些过期键,它们分别是惰性删除和定期删除。惰性删除是指 Redis 服务器不主动删除过期的键值,而是当访问键值时,再检查当前的键值是否过期原创 2021-05-27 09:18:19 · 143 阅读 · 0 评论 -
后端面试每日一题 Spring Boot 启动源码分析
Spring Boot 本质上是 Spring 的延伸,它是基于 Spring 的,它为快速构建和开发 Spring 提供了有力的支撑。Spring Boot 的四大特性:更快速的构建能力、起步依赖、内嵌容器支持、Actuator 监控支持等Spring Boot 启动源码分析我们知道 Spring Boot 程序的入口是 SpringApplication.run(Application.class, args) 方法,那么就从 run() 方法开始分析吧,它的源码如下:public Config原创 2021-05-26 17:21:18 · 251 阅读 · 3 评论 -
后端面试每日一题 聊聊Spring
文章目录SpringBean注册方式Bean 的作用域Bean 生命周期生命周期IoC 和 DI 的理解Spring IoC 的优点Spring IoC 注入方式汇总SpringBean注册方式Bean 的注册方式有三种:XML 配置文件的注册方式Java 注解的注册方式Java API 的注册方式XML 配置文件注册方式<bean id="person" class="org.springframework.beans.Person"> <pr原创 2021-05-26 17:14:18 · 127 阅读 · 0 评论 -
后端面试每日一题 聊聊synchronized
在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程原创 2021-05-26 16:47:33 · 162 阅读 · 0 评论 -
后端面试每日一题 聊聊线程Thread
文章目录线程状态常用方法常见问题BLOCKED 和 WAITING 的区别start() 和 run() 的区别线程优先级线程状态线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6 个状态:NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;RUNNABLE,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配 CPU 资源;BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执原创 2021-05-26 16:15:47 · 98 阅读 · 0 评论 -
后端面试每日一题 聊聊HashMap
文章目录底层实现核心属性常见问题JDK 1.8 HashMap 扩容时做了哪些优化?加载因子为什么是 0.75?HashMap 是如何导致死循环的?底层实现在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的。Hash冲突后使用头插法插入最新的值。JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,**小于6的时候会退化为链表。**Hash冲突后使用尾插法插入最新的值。它的组成结构如下图所示:数组中的元素我们称原创 2021-05-26 16:02:57 · 138 阅读 · 0 评论 -
后端面试每日一题 聊聊最基础的String
文章目录如何实现常见方法常见面试题为什么 String 类型要用 final 修饰?== 和 equals 的区别是什么?String 和 StringBuilder、StringBuffer 有什么区别?String 的 intern() 方法有什么含义?String 类型在 JVM(Java 虚拟机)中是如何存储的?编译器对 String 做了哪些优化?如何证明Java7以及之后常量池是在堆中的如何实现以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下:原创 2021-05-26 15:36:02 · 144 阅读 · 2 评论 -
后端面试每日一题 如何设计一个单点登录系统?
实现方式父域Cookie,只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了不过这要求应用系统的域名需建立在一个共同的主域名之下,如 http://tieba.baidu.com 和 http://map.baidu.com,它们都建立在 http://baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。此种实现方式比较简单,但不支持跨主域名原创 2021-05-25 15:37:53 · 600 阅读 · 3 评论 -
后端面试每日一题 如何设计一个系统?
第一步:需求场景分析这里分为功能性需求和非功能性需求,都是非常重要的。功能性需求谁用,使用角色是谁,有哪些。现在有什么问题,为什么要开发这个系统。解决了他什么问题,达到什么目标。有哪些场景,多描述如果功能很多,建议分期来做,先做核心功能,后面再做其他功能,持续迭代说白了就是该系统的价值、意义、使用场景,替谁解决了哪些问题。非功能性需求用户量评估,例如集团用户2w并发用户以及峰值评估,例如最高并发用户100,峰值预估120每天的总体QPS评估、很有意义,加C原创 2021-05-25 14:39:35 · 983 阅读 · 3 评论 -
后端面试每日一题 mybatis中#与$的区别
MyBatis中使用parameterType向SQL语句传参,parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型。在SQL中引用这些参数的时候,可以使用两种方式:#{parameterName}${parameterName}首先,我们说一下这两种引用参数时的区别:使用 #{parameterName}引用参数的时候,预编译参数,例如传入参数是“zhangsan”,那么在下面SQL中: <select id="selectUs原创 2021-05-18 16:15:16 · 160 阅读 · 0 评论 -
后端面试每日一题 Spring事务、Mysql事务、分布式事务
文章目录Spring事务Mysql事务Mysql几个重要知识点事务实现原理持久性实现原理原子性实现原理隔离性实现原理分布式事务Spring事务核心就是 TransactionManager实际上TransactionTemplate内部也是使用TransactionManager来完成事务管理的,我们之前也看过它的execute方法的实现了,其实内部就是调用了TransactionManager的方法,实际上就是分为这么几步开启事务执行业务逻辑出现异常进行回滚正常执行则提交事务例子//原创 2021-05-18 15:28:33 · 333 阅读 · 0 评论 -
后端面试每日一题 编写一个转账服务要确保在资金处理时转出账户的余额不会透支,金额计算准确
题目尝试用 java 编写一个转账服务,传入交易流水号、转出账号,转入账号,转账金额,完成转出和转入账号的资金处理,该服务要确保在资金处理时转出账户的余额不会透支,金额计算准确,能够支撑每天 10 万笔的个人用户之间转账, 描述思路即可暂时简易答案幂等性设计,一个唯一的请求流水号只能对应一笔支付,防止重复扣款“超卖”判断,要对余额做判断,内部要判断用户的资金是否足够。可以从数据库层面上,让用户的余额不能小于0。金额计算准确,一般用BigDecimal。日志记录关键信息。注意接口限流。.原创 2021-05-18 14:28:10 · 559 阅读 · 0 评论 -
后端面试每日一题 启动 3 个线程,第一个线程打印 0,第二个打印 1,第三个打印 2...
启动 3 个线程,第一个线程打印 0,第二个打印 1,第三个打印 2,然后第一个线程打印 3,依次类推,直到打印指定的数字为止,例如 20;public class DemoTask implements Runnable { // 这里将lock对象换成 Lock(ReentrantLock) 进行lock/unlock也是可以的 private static final Object lock = new Object(); private static final int原创 2021-05-18 14:11:14 · 380 阅读 · 0 评论 -
勇闯BAT 二分查找
方法名称:binarySearch(a,x)输入:a:有序数组x:目标值例如,我们将使用int [] {11,88,99,111,223,999,1028}输出:a [i] == x或-1(如果找不到)的索引位置程序:1.定义开始和范围变量2.将start设置为0,并将范围设置为a的长度/大小3.在start<=range时,请执行以下操作:定义一个中间变量并将其设置为(start + range)/ 2,这将获得中间元素如果x> a [翻译 2021-05-17 16:21:11 · 66 阅读 · 0 评论 -
勇闯BAT 反转链表
反转链表public class Solution { public ListNode ReverseList(ListNode head) { if(head==null) return null; //head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null; ListNode pre = null; ListNode next = null; //当前节点是hea原创 2021-05-17 11:55:36 · 104 阅读 · 0 评论 -
勇闯BAT 浏览器可以发送多少个HTTP请求?
一道经典的面试题是从URL在浏览器被输入到页面展现的过程中发生了什么?大多数回答都是请求响应之后DOM是怎么被构建、被绘制出来。但是你有没想过,收到的HTML如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的?要搞懂这个问题,我们需要先解决下面五个问题:现代浏览器在与服务器建立了一个TCP连接后,是否会在一个HTTP请求完成之后断开?什么情况下会断开?一个TCP连接可以对应几个HTTP请求?一个TCP连接中,HTTP请求发送可以一起发送吗(比如一起发转载 2021-05-17 09:07:38 · 1087 阅读 · 0 评论 -
勇闯BAT 为什么Redis使用IO多路复用模型
Redis的IO模型 也许你会怀疑高并发的Redis申间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了Redis之外,Node.js也是单线程,Nginx也是单线程,但是它们都是服务器高性能的典范。Redis单线程为什么还能这么快?因为它的所有数据都在内存中,所有的运算都是内存级别的运算。正因为Redis是单线程,所以要小心使用Redis指令,对于那些时间复杂度为O(n)级别的指令,一定要谨慎使用,否则一不小心就可能会导致Redis卡顿。Red原创 2021-05-14 14:48:46 · 233 阅读 · 0 评论 -
勇闯BAT 讲一下你们项目上的分库分表以及如何设计可以动态扩容缩容的分库分表方案
文章目录为什么要分库分表?如何分库分表?垂直拆分水平拆分常用方案Hash取模Range范围Hash和Range范围结合总结网上看到的面试题,然后各处搜寻的答案,感觉这么搞挺不错的。声明:此文大量参考自: http://www.toutiao.com/i6677459303055491597为什么要分库分表?某块业务数据量不较大需要分库分表,例如卫星定位表,一天的数据达到100w。某块业务并发比较高,需要分散并发读写压力。如何分库分表?大的方面来说可分为垂直和水平拆分垂直拆分思想:按原创 2021-05-14 13:51:34 · 256 阅读 · 0 评论 -
勇闯BAT 通俗讲解Restful
简要总结看Url就知道要什么看http method就知道干什么看http status code就知道结果如何长篇大论http是目前在互联网上使用最多的协议,没有之一。可是http的创始人一直都觉得,在过去10几年来,所有的人都在错误的使用Http.这句话怎么说呢?如果说你要删除一个数据,以往的做法通常是 delete/{id}如果你要更新一个数据,可能是Post数据放Body,然后方法是 update/{id}, 或者是artichle/{id}?method=update这种做转载 2021-05-10 15:53:43 · 340 阅读 · 0 评论 -
勇闯BAT 冒泡排序 Top K问题
总共2层循环外面的一层代表冒泡的趟数,一趟可以筛选出一个最大值或者最小值,所以n个数的数组,需要n-1躺,因为i从0开始,即 for(int i = 0 ;i<arr.length-1;i++)里面的一层代表对比次数,n个数的数组,第一躺交换n-1次,选出一个最大值,第二趟交换n-2次,因为已经筛选出一个最大值了,只需比较后边的即可,故:for(int j = 0 ;j<arr.length-i-1;j++)相邻2个数比较,交换位置,这里跟趟数没关系,都是j的事情if(a..原创 2021-05-10 10:57:10 · 400 阅读 · 0 评论 -
勇闯BAT @Autowired和@Resource的区别及其实现原理
文章目录@Resource和@Autowired简介@Autowired注解的工作原理注入方式@Resource和@Autowired简介凹头外耳的@Resource和@Autowired都可以用来装配bean,都可以用于字段或setter方法。@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。@Resource默认按名称装配,当找不到与名称匹配的bean时才按照类型进行装配。名称可以通过na原创 2021-05-10 09:42:18 · 429 阅读 · 0 评论 -
勇闯BAT wait和sleep之后的线程状态是什么?它们的区别?
文章目录区别相同拓展线程状态锁对象Object.wait( )/notify( )的内部实现Thread.sleep(2000),2000ms后是否立即执行?Thread.sleep(0),是否有用?wait(1000) vs sleep(1000)区别wait基本语义是使当前线程等待,直到被通知,默认是this.wait()。实现细节是把当前线程放入阻塞线程队列中,并把当前线程注册为指定对象的监听器,并锁释放指定对象的锁;当被notify/notifyAll通知时,重新争取指定对象的锁,并把当前线程原创 2021-05-08 15:29:17 · 2775 阅读 · 0 评论 -
勇闯BAT 聊聊Mysql的存储引擎
文章目录存储引擎是什么查看支持的引擎常用存储引擎介绍ArchiveMemoryMyISAMInnoDB概要常见问题MyISAM 和 InnoDB的区别存储引擎是针对实例的还是表自增主键最大值保存问题InnoDB引擎是否支持hash索引存储引擎是什么MySQL架构可以分为4层,先看下,其所在的位置。连接层:包括了数据库连接、授权认证、安全管理等Server层:包括 SQL 解析、优化、执行以及缓存等存储引擎层:包括了各种存储引擎,主要负责数据的存取等数据存储层:主要负责将数据存储在文件系统中,并原创 2021-04-26 18:11:41 · 369 阅读 · 0 评论 -
勇闯BAT 聊聊数据库范式
文章目录什么是范式?什么是数据库三范式?为什么要满足三范式或者说说三范式优点?为什么实际设计时,会去选择反三范式?什么是范式?你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。关键词:某种设计标准的级别。什么是原创 2021-04-20 18:45:46 · 298 阅读 · 0 评论