JAVA面试题(43)

    本文首发于cartoon的博客
    转载请注明出处:cartoonyu.github.io/cartoon-blo…java

java

  1. 对synchronized的了解git

    1. java的一个关键字,用于重量级锁的设定
    2. 利用synchronized关键字,能够实现对互斥资源的访问
    3. 做用范围
      1. 普通方法,锁的粒度为当前对象
      2. 静态方法,锁的粒度为当前类的class对象
      3. 代码块,锁的粒度为括号内使用的对象
  2. 多线程的同步机制github

    1. 使用同步代码块synchronized
    2. 经过标志位轮询访问临界资源
    3. 经过Condition以及lock对资源的锁定以及释放
    4. 经过阻塞队列BlockQueue(生产者/消费者)
  3. threadLocal的概念以及使用场景redis

    1. 每一个线程都能拥有该变量的独立副本
    2. 内部经过ThreadLocalMap进行值的存储以及读取
      1. 初始容量为16
        1. 负载因子为2/3
        2. 经过再hash法解决hash冲突
  4. final,finally,finalize的区别算法

    1. final为不可变修饰词,用于声明属性,方法或类不可变
    2. finally为异常捕获机制一部分,老是会被执行。若try或catch有return语句,finally早于此return语句执行
    3. finalize为Object方法,调用此方法能够实现资源的回收,可是回收时间由JVM决定
  5. java注解的做用spring

    1. 生成文档
    2. 完成特定的标识(@Service等)
    3. 在编译时进行格式检查(@Override)
  6. java集合间的区别sql

    1. set与list都只含单个元素,而Map含有key-value对
    2. Map将entry数组置为null,就是set,因此set内元素是无序的,list元素是有序的
  7. BIO NIO AIO的区别数据库

    1. BIO
      1. 同步阻塞
        1. 线程阻塞进行运算后返回结果
    2. NIO
      1. 同步非阻塞
        1. 请求共用一个线程进行处理
        2. 线程会直接返回结果到请求
    3. AIO
      1. 异步非阻塞
        1. 线程处理后会经过回调返回结果
  8. java反射机制的理解编程

    1. 做用
      1. 在程序运行中,动态获取对象所属类,属性以及方法等信息
      2. 在程序运行时,动态改变对象属性
    2. 动态代理以及静态代理

jvm

  1. 怎么判断对象是否可回收?
    1. 引用计数法
    2. 可达性分析算法(GC ROOT)
  2. java内存区域划分
    1. 运行时数据区域
    2. 线程共享
      1. 方法区
    3. 线程隔离区
      1. 虚拟机栈
      2. 本地方法栈
      3. 程序计数器

数据库

  1. MyBatis分页方式以及区别
    1. 逻辑分页
      1. 数组分页
      2. RowBounds分页
    2. 物理分页
      1. sql分页
      2. 拦截器分页
  2. 数据库事务特性以及隔离级别
    1. 特性
      1. 原子性(Atomicity)
        1. 事务执行结果是一致的,成功或者回滚
      2. 一致性(Consistency)
        1. 事务执行先后数据库状态不受影响
      3. 隔离性(Isolation)
        1. 事务间操做相互独立
      4. 持久性
        1. 事务执行产生的结果是永久存储下来的
    2. 隔离级别
      1. read uncommitted
        1. 读取事务未提交的数据
      2. read commited
        1. 屡次查询某一数据结果不一致
      3. repeatable
        1. 同时修改同一元素形成事务提交结果发生误差
      4. serializable
        1. 事务的顺序执行
  3. redis的数据类型以及底层数据结构
    1. string
      1. 经过DDS(简单的动态字符串)实现
      2. DDS的实现经过双端链表实现
    2. hash
      1. 压缩列表(数据量较小)
        1. key-value对少于512个且全部键对大小都要小于64字节
      2. 散列表
        1. 链地址法解决冲突
    3. set
      1. 有序数组
        1. 数据都是整数
        2. 元素个数不超过512个
      2. 散列表
    4. list
      1. 压缩列表
      2. 双循环链表
        1. 全部数据大小小于64字节
        2. 数据个数小于128个
    5. 有序集合
      1. 压缩列表
        1. 相似于数组,存储空间是连续的,可是元素所占空间不惟一
      2. 双循环链表
  4. 缓存穿透的概念,解决方法
    1. 缓存穿透是指请求访问不存在的key,请求穿透到DB,流量大会形成DB崩溃
    2. 解决方法
      1. 采用布隆过滤器或者BitMap对请求进行过滤
  5. 缓存雪崩的概念,解决方法
    1. 大量key设置统一过时时间,形成瞬间DB访问量过大
    2. 解决方法
      1. key的过时时间用随机数进行设置
  6. 缓存击穿的概念,解决方法
    1. 存在key在缓存失效的瞬间被大量请求访问,形成DB请求量大
    2. 解决方法
      1. 设置短时间key替代原始key
      2. key再生成后删除短时间key

spring

  1. AOP,IOC的概念
    1. AOP
      1. AOP面向切面编程,它将本来纵向的程序看做成一个个切面的组合,是OOP的补充
      2. 动态插入执行逻辑到原有执行流程中
      3. 通知(Advice):具体实现逻辑
      4. 链接点(JoinPoint):使用通知的位置
      5. 切入点(PointCut):指定使用通知的链接点位置
      6. 切面(Aspect):通知与切入点集合
      7. 引入(introduction):添加新方法属性到现有类中
      8. 目标(target):被通知的对象
      9. 代理(proxy)
      10. 静态代理
      11. 动态代理
      12. 织入(weaving):将切面引用到目标对象生成代理对象的过程
    2. IOC
      1. 我把IOC称做为控制反转或者依赖注入,IOC是Spring的核心思想,它使调用者不用管理对象的生存周期以及具体实现,可以更加注重于业务逻辑的实现。
      2. 在平时实际开发中,我一般使用向上转型的对象完成业务逻辑,这样我以为能使对象中的耦合度下降,并且在代码重构的时候可以轻易切换实现类。
  2. Spring bean的做用域
    1. singleton
    2. prototype
    3. session
    4. request
    5. global session
  3. Spring bean是线程安全吗?
    1. prototype,request每次被调用都会建立新对象,不存在线程问题
    2. singleton,session,globalSession会形成线程间竞争,无状态bean是线程安全的,有状态beanSpring经过ThreadLocal进行解决
  4. spring mvc的执行流程
    1. 请求经过http到达后端,由DispatcherServlet进行分发
    2. DispatchServlet经过HandlerMapping查找处理的Controller,中间或者会有过滤器等进行处理
    3. 若是在查找过程当中发生错误,HandlerExceptionResolver会返回一个HandlerExecutionChain对象到DispathchServlet
    4. 请求正确分发到Controller,Controller调用Service以及Repository等进行处理,调用RequestAndViewNameResolver处理后返回ModelAndView对象到DispatchServlet
    5. DispatchServlet根据返回的ModelAndView对象,将对象交给ViewResolver组件进行视图的渲染,若是在语言上有特殊要求,渲染会调用LocaleResolver以及ThemeResolver进行国际化的适配

网络

  1. Session与cookie的区别后端

    1. cookie存储在客户端,session存储在服务器
    2. cookie只能存储字符串,session能够存储任意对象
    3. cookie的存储大小受客户端影响,大小为4KB,session存储大小不受影响
    4. 后端获取cookie经过http报文中的cookie字段获取,session则经过cookie中的sessionId标识寻找
  2. session的工做原理

    1. session是存储在服务器端的一种标识客户端的数据结构
    2. 用户请求到达后台,后台检测是否有sessionId字段的存在
      1. 有的话,校验字段是否合法
      2. 没有的话,建立新session并返回对应sessionId到客户端
  3. TCP与UDP区别

    1. TCP面向链接,UDP不面向链接
    2. TCP有拥塞控制,UDP没有拥塞控制
    3. TCP资源开销大,UDP资源开销小
    4. TCP只支持一对一,UDP支持一对多
    5. TCP提供可靠传输,UDP尽量交付
    6. TCP面向字节流,UDP面向报文
  4. tcp粘包的缘由以及解决办法

    1. 缘由
      1. 不一样数据包在到达接收方时首尾部粘在一块儿
      2. 解决方法
        1. 在每一个tcp报文首部添加报文长度
        2. 在报文的首部或者尾部设置特殊的符号位标识
  5. tcp的三次握手与四次挥手

    1. 三次握手(链接过程)
      1. 一次握手(客户端发起)
        1. 建立TCB
        2. 发送SYN=1,seq=x
        3. 进入SYN-SENT
      2. 二次握手(服务器发起)
        1. 发送ACK=1,syn=1,ack=y+1,seq=x+1
        2. 进入SYN-RCVD
      3. 三次握手(客户端发起)
        1. 发送ACK=1,seq=x+1,ack=x+1
        2. 进入ESTABLISHED
    2. 四次挥手(结束链接过程)
      1. 一次挥手
        1. 客户端发送FIN=1,seq=u为内容的请求报文
        2. 客户端进入FIN-SENT-1状态
      2. 二次挥手
        1. 服务器端发送ACK=1,seq=v,ack=u+1为内容的确认报文
        2. 服务器端进入CLOSE_WAIT
        3. 客户端进入FIN-SENT-2状态
      3. 三次挥手
        1. 服务器端发送FIN=1,seq=w,ACK=1,ack=u+1为内容的释放报文
        2. 服务器端进入LAST_ACK状态
      4. 四次挥手
        1. 客户端发送ACK=1,ack=w+1,seq=u+1为内容的确认报文
        2. 客户端进入TIME_WAIT状态,等待2MSL后关闭链接
        3. 服务器端接受报文后关闭链接

设计模式

  1. 抽象工厂与简单工厂的区别
    1. 抽象工厂定义建立产品的大概流程,子工厂经过继承抽象工厂负责具体产品的建立,产品种类的增长不须要改变抽象工厂的代码逻辑
    2. 简单工厂负责具体产品的建立,产品种类的增长须要改变建立的逻辑

算法

  1. 快速排序实现
    1. 主要采用分治的思想
    2. 定义左右指针遍历元素(左右指针的初始值为边界)
    3. 循环遍历数组(左指针小于右指针)
      1. 循环遍历左指针直到元素大于右指针指向的元素
      2. 交换左右指针的元素值
      3. 循环遍历右指针直到元素小于小指针指向的元素
      4. 交换左右指针的元素值
    4. 返回左指针的值做为中线
    5. 分别递归中线左右,依据2,3的步骤进行处理
相关文章
相关标签/搜索