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.尚硅谷之高频重点面试题① -面经的主要内容,如果未能解决你的问题,请参考以下文章

第几天?(hdu2005)

比较好的网站地址

Glue Crawler 跳过特定的 S3 文件夹

0607am抽象类&接口&析构方法&tostring&小知识点

无论什么时候Rails cron,设置环境

I am back-电商网站开发&jQuery