每日一面---真实面试题---7

先看原题,自己心里默想一遍答案再滑到后面对比答案。答案来源于网络,欢迎指正,共同进步

一、原题
  1. Spring 中的 AOP 是如何实现的,jdk 和 CGLIB 方法的区别
  2. 数据库 hash 索引和 b+树的区别
  3. b 树和 b+树的区别,b+树的优势
  4. 垃圾回收器 CMS 和 g1 的区别
  5. http1.0 和 1.1 的区别
  6. mysql 联合索引使用 A>n and B=m 和 A=n and B=m 的区别
  7. 线程池中多线程的处理过程(最大核心是 5,最大线程数量 10,最大队列 10);如果满了后,如何进行;核心线程最终会结束吗(一面的时候和面试官讨论过,面试官说核心线程也是会结束的,所以我就按照1 面的说的)
  8. 你知道哪些 java 锁
  9. SpringBoot 核心自动装配原理——》为什么使用 EnableAutoConfiguration 注解(此处还有问题,暂时想不起来了)
  10. 用过 mybatis 吗
  11. 是否了解索引,简要描述
  12. 集合类都有什么
  13. ArrayList 和 linkedlist 的区别,各自优缺点,适用场景,实现方式
  14. 常用 算法 都会啥
  15. 排序 算法 ,请描述快速 排序 和归并 排序 的思路
  16. 是否了解 JUC,请讲出有什么 JUC 组件
  17. 线程池是否理解,都有哪些参数
  18. 线程池的核心线程数,最大线程数,队列之间的关系。new 新的线程是怎样的逻辑?

------------------------------------------------------------------------优美的分割线------------------------------------------------------------------------
















二、答案
  1. Spring 中的 AOP 是如何实现的,jdk 和 CGLIB 方法的区别

    1、要想启用Spring AOP,配置类加上注解@EnableAspectJAutoProxy,会往spring容器注入一个BeanPostProcessor即AnnotationAwareAspectJAutoProxyCreator
    2、在Bean实例化完成后(即调用构造函数将对象创建出来)会执行AnnotationAwareAspectJAutoProxyCreator#postProcessAfterInitialization(这个方法在父AbstractAutoProxyCreator中,AnnotationAwareAspectJAutoProxyCreator并没有重写)
    3、当执行完成AbstractAutoProxyCreator#postProcessAfterInitialization这个方法会将原生对象变成代理代理对象,代理对象中写入了横切的逻辑
    
    jdk 和 CGLIB 方法的区别:
    	1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
    	2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
    	3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换.
    
  2. 数据库 hash 索引和 b+树的区别

    欢迎补充!!!
    
  3. b 树和 b+树的区别,b+树的优势

    欢迎补充!!!
    
  4. 垃圾回收器 CMS 和 g1 的区别

    CMSG1
    JDK版本1.6以上1.7以上
    回收算法标记——清除标记——整理
    运行环境针对70G以内的堆内存可针对好几百G的大内存
    回收区域老年代新生代和老年代
    内存布局传统连续的新生代和老年代区域Region(将新生代和老年代切分成Region,默认一个Region 1 M,默认2048块)

    MIN_REGION_SIZE:允许的最小的REGION_SIZE,即1M,不可能比1M还小;
    MAX_REGION_SIZE:允许的最大的REGION_SIZE,即32M,不可能比32M更大;限制最大REGION_SIZE是为了考虑GC时的清理效果;
    浮动垃圾
    内存碎片
    全堆扫描
    回收时间可控
    对象进入老年代的年龄615
    空间动态调整是(新生代5%-60%动态调整,一般不需求指定)
    调优参数多(近百个)少(十几个)
  5. http1.0 和 1.1 的区别

    1、缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
    
    2、带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
    
    3、错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
    
    4、Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
    
    5、长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
    
  6. mysql 联合索引使用 A>n and B=m 和 A=n and B=m 的区别

    欢迎补充!!!
    
  7. 线程池中多线程的处理过程(最大核心是 5,最大线程数量 10,最大队列 10);如果满了后,如何进行;核心线程最终会结束吗?

    核心线程也是会结束的
    
  8. 你知道哪些 java 锁

    1、独享锁/共享锁
    2、读写锁 ReentrantReadWriteLock
    3、公平锁/非公平锁
    4、可重入锁
    5、乐观锁/悲观锁
    6、分段锁
    7、自旋锁
    8、偏向锁/轻量级锁/重量级锁
    
  9. SpringBoot 核心自动装配原理——》为什么使用 EnableAutoConfiguration 注解(此处还有问题,暂时想不起来了)

  10. 是否了解索引,简要描述

    索引好比书的目录,好比新华字典的拼音、偏旁部首查字,可以帮助人快速查找到需要的内容
    
  11. 集合类都有什么

    set\list\map
    
  12. ArrayList 和 linkedlist 的区别,各自优缺点,适用场景,实现方式

    ArrayList :基于数组实现,适用于读多写少的场景
    linkedlist :基于链表实现,适用于写多读少的场景
    
  13. 常用 算法 都会啥

  14. 排序 算法 ,请描述快速 排序 和归并 排序 的思路

  15. 是否了解 JUC,请讲出有什么 JUC 组件

    AQS同步组件
    
  16. 线程池是否理解,都有哪些参数

    corePoolSize
    	核心线程数量
    maximumPoolSize
    	最大线程数量,这个值必须大于等于corePoolSize,如果这两个值相等,那就是固定大小的线程池
    KeepAliveTime
    	程池中除常驻核心线程之外的其他线程的空闲时间,如果超过这个时间就会销毁。
    queue
    	缓存队列,当请求的线程数大于corePoolSize的时候,线程会进入队列进行阻塞。当这个队列达到上限之后,线程池会创建新的线程,直到到吗maximumPoolSize大小位置。
    RejectedExecutionHandler
    	拒绝策略。当queue满了之后,并行活动的线程数大于maximunPoolSize的时候,线程池通过改策略处理请求。
    threadFactory
    	线程工厂。用来生产一组相同任务的线程。
    
    
    
  17. 线程池的核心线程数,最大线程数,队列之间的关系。new 新的线程是怎样的逻辑?

    
    线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源。在调用execute()添加一个任务时,线程池会按照以下流程执行:
    
    1、如果正在运行的线程数少于corePoolSize(用户定义的核心线程数),线程池就会立刻创建线程并执行该线程任务;
    
    2、如果正在运行的线程数大于corePoolSize,该任务就会被放入阻塞队列中;
    
    3、如果阻塞队列已满且正在运行的线程数少于maximumPoolSize时,线程池会创建非核心线程立刻执行该线程任务;
    
    4、在阻塞队列已满并且正在运行的线程数大于maximunPoolSize时,线程池将会拒绝执行该任务并且抛出拒绝异常RejectExecutionException;
    
    5、在线程执行完毕后,该任务会从线程队列中移除,然后从队列中取下一个任务继续执行;
    
    6、在线程处于空闲的时间超过keepAliveTime,并且正在运行的线程数大于corePoolSize, 该线程将会被认为是空闲线程并停止;所以线程任务都执行完毕后,线程池会收缩到corePoolSize大小。
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值