1.请简要谈⼀下Java中的equals与==的区别?
(1) ==是运算符,而equals()是方法
(2) 基本数据类型中,==比较的是他们的数据是否相等,而在引用数据类型中==比较的是地址值;equals()方法更多的比较的是值的具体内容,前提是让要比较的双方重写equals()方法,否则,调用的是Object类中的equals(),而Object类中的equals()就是调用的==运算符;在包装类,以及特殊的 类中例如String,Date,File... ,底层默认重写了equals(),所以可以直接比较;
2. JDK8中的HashMap做了什么改变?
1> 由原来的 数组 + 链表 ,换为 数组 + 链表 + 红黑树
2> jdk7中实例化HashMap时底层会创建一个长度为16的entry[]数组,而jdk8中实例化时不会创建数组,而在put第一个键值对的时候才会创建长度为16 node[]的数组
3>在添加数据时,通过hashCode值的特定算法算出在数组中存放的位置,如果此位置没有元素,则添加成功,如果有元素,则以链表的方式存储在当前位置,这里jdk7和8有区别,7是头插,8是尾插;头插效率高,而尾插需要遍历,效率低一点;
4> jdk8中当链表的长度 > 8,并且数组长度大于64的时候,该列链表转换为红黑树存储
3. 请按顺序选出SpringMVC中 DispatcherServlet 正确的⼯作流程
A:当⽤户向服务器发送请求时,会被 DispatcherServlet 拦截。
B:DispatcherServlet 根据 ModelAndView 对象来调⽤适合的视图解析器 ViewResolver。
C:DispatherServlet 解析⽤户访问的 URL,并调⽤处理器映射器 HandlerMapping。
D:处理器映射器 HandlerMapping 映射到对应的后端处理器 Handler(注 意这⾥只是找到了对应的 Controller 类,并没有执其中的⽅法),Handler 对象以及 Handler 对象相关的拦截器对象会被封装到 HandlerExecutionChain 对象中返回给DispatcherServlet。
E:ViewResolver 解析 Model 和 View 返回具体的 view 给 DispatcherServlet。
F:DispatcherServlet 对 view 进⾏渲染,返回具体的视图给客户端显示, 如 JSP,JSON、XML、PDF等。
G:DispatcherServlet 根据后端处理器 Handler 对象来调⽤适合的处理器 适配器。
H:HandlerAdapter 调⽤ Handler 对象执⾏ Handler 中的⽅法,在 Handler 的⽅法中,可以做⼀些额外的⼯作,如消息转换(如 JSON、XML 和 Java 对象的互转)、数据转换(如 String 和 Integer、Double的互 转)、数据格式化(如⽇期)、数据校验(后端校验),最终返回 ModelAndView 对象给 DispatcherServlet,该对象包含视图名和数据模型。
A > C > D > G > H > B > E > F
4.MySQL的ACID分别代表什么?
-
原子性(Atomicity,或称不可分割性)
-
一致性(Consistency)
-
隔离性(Isolation)
-
持久性(Durability)
原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性:事务必须使数据库从一个一致性状态变换为另一个一致性状态
隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即事务内部的操作和使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间具有隔离性
持久性:一个事务一旦被提交,他对数据库中的数据的改变是永久性的,接下来的其他操作或数据库故障不应该对他有任何影响
5. Redis的缓冲异常有哪些以及应对⽅案,能简要描述⼀下吗?
缓存穿透
缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。
-
非法请求的限制,主要是指参数校验、鉴权校验等,从而一开始就把大量的非法请求拦截在外,这在实际业务开发中是必要的手段。
-
缓存空值或者默认值,如果从缓存取不到的数据,在数据库中也没有取到,那我们仍然把这个空结果进行缓存,同时设置一个较短的过期时间。通过这个设置的默认值存放到缓存,这样第二次到缓存中获取就有值了,而不会继续访问数据库,可以防止有大量恶意请求是反复用同一个key进行攻击。
-
使用布隆过滤器快速判断数据是否存在。那什么是布隆过滤器呢,简单来说,就是可以引入了多个相互独立的哈希函数,保证在给定的空间和误判率下,完成元素判重。因为我们知道,存在hash碰撞这样一种情况,那如果只使用一个hash函数,则碰撞冲突的概率明显会变大,那为了减少这种冲突,我们可以多引入几个hash函数,而布隆过滤器算法的核心思想就是利用多个不同的hash函数来解决这样一种冲突。它的优点是空间效率高,查询时间短,远超其他算法,而它的缺点就是会存在一定的误识别率