Day481&482&483&484&485.尚硅谷之高频重点面试题① -面经
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day481&482&483&484&485.尚硅谷之高频重点面试题① -面经相关的知识,希望对你有一定的参考价值。
高频重点面试题①
一、自增变量
- 题目代码
int i = 1;
i = i++; //i = 1
int j = i++; //i = 2, j = 1
int k = i + ++i * i++;//2+3*3,i=4
System.out.println("i="+i);//i = 4
System.out.println("j="+j);//j = 1
System.out.println("k="+k);//k = 11
- 理解
- 等号的右侧
从左到右依次
压入操作数栈 - 计算的顺序依然还是根据
运算符的优先级
计算 - 自增操作是直接对变量表中的变量直接修改,不需要压入操作数栈
- 赋值操作是最后做在处理的
- 等号的右侧
二、单例模式
- 饿汉式
//通过构造器私有化,对外暴露get方法获取
public class Singleton1
private static final Singleton1 SINGLETON_1 = new Singleton1();
private Singleton1()
public Singleton1 getInstance()
return SINGLETON_1;
//通过枚举的方式获取
public enum Singleton2
INSTANCE;
public static void main(String[] args)
Singleton2 s = Singleton2.INSTANCE;
//通过静态代码块初始化
public class Singleton3
private static final Singleton3 INSTANCE;
static
//todo 可通过配置文件去加载参数,提供初始化
INSTANCE = new Singleton3();
public Singleton3 getInstance()
return INSTANCE;
- 懒汉式
//同步方法方案
public class Singleton4
private static Singleton4 INSTANCE;
private Singleton4()
public synchronized static Singleton4 getINSTANCE()
if (INSTANCE==null)
INSTANCE = new Singleton4();
return INSTANCE;
//双重锁判断方案
public class Singleton5
private volatile static Singleton5 INSTANCE;
private Singleton5()
public static Singleton5 getINSTANCE()
if (INSTANCE == null)
synchronized (Singleton5.class)
if (INSTANCE==null)
INSTANCE = new Singleton5();
return INSTANCE;
//静态内部类
public class Singleton6
private Singleton6()
private static class Inner
private static final Singleton6 INSTANCE = new Singleton6();
public static Singleton6 getInstance()
return Inner.INSTANCE;
三、类初始化和实例初始化
- 类初始化过程—(子类初始化需要加载初始化父类)
- 静态成员变量、静态代码块(从上往下的顺序,顺序执行)
- 构造器(最后执行)
- 实例初始化过程
- 成员变量、非静态代码块(从上往下顺序,顺序执行)
- 构造器(最后执行)
- 哪些方法不会被重写
- final
- private
- static
- 对象的多态性
四、方法的参数传递机制
五、成员变量&局部变量
六、SpringBean的作用域之间的区别
七、Spring数据库事务
地址:https://blog.csdn.net/qq_43284469/article/details/110919021?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163982224916780264049691%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163982224916780264049691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-7-110919021.pc_v2_rank_blog_default&utm_term=%E4%BA%8B%E5%8A%A1
第五标题开始+
八、如何解决SpringMVCPost请求中文乱码问题?
创建一个类,继承OncePerRequestFilter
添加一个Filter过滤器,来做字符集的转换
九、简单的谈一下SpringMVC的工作流程
-
DispatchServlet会拦截请求
-
执行这里就会遍历所有
this.handlerMappings
,获取请求的uri和请求,拿到对应能够处理这次请求的handlerMapping
,并将拿到:↓- handlerMapping处理器
- 对应的拦截器
- 这次的请求request
包装成一个
HandlerExecutionChain
。 -
从HandlerExecutionChain拦截器链到拿到对应的
handlerMapping
-
根据handlerMapping,去获取对应的
HandlerAdapter
的处理器对应的适配器
-
判断请求方式是否是
get
,如果是就判断是否被修改过 -
遍历所有的拦截器链,执行每个
applyPreHandle()
- 每次执行都记录执行的拦截器链遍历索引
- 如果有一个applyPreHandle返回false,就去导致执行triggerAfterCompletion,去执行
倒置
每一个已经执行applyPreHandle()方法的拦截器的afterCompletion()
方法
-
再通过适配器执行
真正处理
这次请求的controller方法handle
,返回ModelAndView
(这里我们不是jsp,所以肯定必然没有ModelAndView对应,就肯定为null)
-
执行适配器对应的handle()方法也就是对应的controller的方法后,会返回
ModelAndView
-
判断当前请求的所选处理程序
是否选择处理异步处理
-
给对应返回的ModelAndView对象赋予
默认名
-
倒置
去执行每个拦截器链中每个拦截的applyPostHandle()
方法 -
执行
processDispatchResult()
做收尾工作- 判断是否有
ModelAndView
,有就渲染,没有执行下面的 - 去执行
triggerAfterCompletion()
,这里上面已经出现过,也就是去执行已经执行过preHandle
拦截器的afterCompletion()
方法
- 判断是否有
十、Mybatis中当实体类中的属性名和表中名字段不一样该怎么办
- sql语句中起
别名
- 在实体类上标注
注解
- 开启
驼峰规则
- 可以使用
结果集映射
—resultmap映射
十一、Linux服务类常用指令
1、CentOS6
2、CentOS7
十二、Git分支相关命令
十三、Redis持久化有几种类型?他们的区别是什么?
1、RDB
- 特点
内存快照
全量的方式保存,一个fork子进程不影响主进程进行备份【全量替换
】
- 优点
- 恢复速度快
- 备份速度快
- 缺点
- 会有可能数据丢失
- 数据量的时候就比较消耗性能
2、AOF
-
特点
- 以日志的形式,记录每一个写操作
- 只追加文件,不改写文件【做
增量操作
】
-
优点
- 存储的粒度更小更细
- 可处理误操作
- 人可读懂的日志文本
-
缺点
- 比RDB的方式更占用存储空间
- 恢复速度慢
十四、mysql建立索引的时机
-
什么时候建立索引
-
什么时候不适合建立索引
十五、JVM垃圾回收机制,GC发生在JVM哪个部分,有几种GC,他的算法是什么
GC发生在JVM哪个部分?发生在堆
中。
-
GC有几种
- 年轻代的GC—MinorGC
- 老年代的GC—FullGC
-
算法的分类
- 引用计数算法
- python中被使用,已经被jvm淘汰
- 复制算法
- 特点
- 使用与年轻代的MinorGC
- 优点
- 没有内存碎片
- 没有标记清楚,效率高
- 缺点
- 双倍的存储空间
- 特点
- 标记清除
- 特点
- 发生在老年代,先进行标记,再进行清除
- 优点
- 不需要额外空间
- 缺点
- 存在内存碎片
- 特点
- 标记压缩
- 特点
- 发生老年代,先进行标记,再进行压缩
- 优点
- 又要标记又要压缩移动,需要移动的成本,所以效率低
- 缺点
- 解决内存碎片的问题
- 特点
- 标记清除压缩
- 先进行标记,再清除,再压缩移动内存
- 引用计数算法
十六、Redis在项目中的使用场景
十七、ES和Solr的区别
-
Solr集群
十八、单点登录实现的过程
- 概念
一处登录,处处使用
- 前提
分布式系统中
- 流程图
十九、购物车实现流程
1、购物车与用户的关系
- 一个用户一个购物车
- 单点登入在购物车之前
2、购物车操作
- 添加购物车
- 用户未登录
- Redis
- Cookie
- 用户登录.
- Redis
- Mysql
- 用户未登录
- 展示状态
- 用户未登录
- 从Cookie中取到数据展示
- 用户登录
- 用户一旦登录,必须显示数据或Redis中的数据,再加上未登录的Cookie数据
- 用户未登录
二十、消息队列在项目中的使用
1、背景
在高并发的场景下,来不及同步处理用户的请求,就会出现阻塞的情况。
2、作用
- 异步
- 削峰
- 解耦–并行
3、使用场景
- 电商使用场景之一
4、缺点
- 消息的不确定性
通过轮询和延时队列
二十一、volatile是什么
-
volatile是jvm提供的一种
轻量级(青春版、乞丐版syn)
的同步机制 -
三大特性
-
不保证原子性---------会出现丢失写值的线程安全问题
操作不可分割,要么同时成功,要么同时失败
-
防止重排序
-
保证可见性—
及时通知机制
某一个线程,修改了主内存的值,并写回主内存后,其他线程能知道这个值被修改过了
-
二十二、JMM的认识
- 是一种概念,并
不存在
- 概念
-
同步规定
-
要求具有的特性
- 有序性(禁止重排序)
- 可见性
- 原子性
二十三、你在哪些地方用到了volatile?
-
单例模式—DCL双重锁校验机制—来防止指令重排
-
读写锁手写缓存
-
CAS—JUC包中
二十四、CAS是什么?
-
定义
比较并交换(CompareAndSawp)
如果线程的期望值跟主内存的真实值一致,就修改为更新值
-
原理
-
自旋锁
-
unsafe类工具包
- CAS的核心包
- Java自带提供通过C/C++代码直接操作特定内存的一个工具类
-
-
缺点
- 多次循环自锁,
资源消耗大
- 会有
ABA问题
- 只能保证
一个共享变量
的原子操作
- 多次循环自锁,
-
如何解决ABA问题
-
原子引用
AtomicReference<?>
-
乐观锁—版本号(时间戳)
AtomicStampedReference<?>
-
二十五、ArrayList线程安全吗?如何解决?
- 解决
- 通过Collections.sychronizedList()
- Vector
- CopyOnWriteArrayList—写时复制(复制追加)
- CopyOnWriteArrayList为什么能保证线程安全?
二十六、HashSet的底层实现原理是什么?
-
底层
- HashMap
-
那底层的HashMap是什么结构?
将Add进来的值作为HashMap的key,value为PRESENT的Object的常量
以上是关于Day481&482&483&484&485.尚硅谷之高频重点面试题① -面经的主要内容,如果未能解决你的问题,请参考以下文章