JAVA面试题(45)

194 阅读4分钟

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

java

  1. sleep与wait的区别
    1. 作用对象
      1. sleep是Thread类的静态方法,作用于当前线程
      2. wait是Object类的成员方法,作用于对象本身
    2. 作用
      1. 调用sleep方法,线程进入休眠状态
      2. 调用wait方法,线程进入阻塞状态
    3. 锁的释放
      1. sleep不会释放持有的锁
      2. wait会释放锁
    4. 唤醒
      1. 自然唤醒或者显式调用interrupt方法
      2. 调用notify或者notifyAll方法
    5. 调用
      1. sleep不需要在同步代码中调用
      2. wait需要在同步代码中调用,否则抛出IllegalMonitorStateException
    6. 使用场景
      1. sleep作用于周期性任务的执行
      2. wait作用于互斥资源的使用
  2. hashMap的扩容机制
    1. 相关成员属性
      1. HashMap是JAVA集合框架的一个存储key-value对的实现类,有关于扩容机制的成员属性主要有三个
        1. 默认值为16的capicity
        2. 默认值为0.75的loadFactory
        3. 默认值为0的size
    2. 触发时机
      1. 插入元素时
    3. 实现
      1. JDK 1.7
        1. 传入newCapicity参数
        2. 新建newCapicity长度的Entry数组
        3. 将原数组元素重新hash放入新数组
        4. 将原有数组引用指向新数组
      2. JDK 1.8之后
        1. 如果节点的链表元素个数大于8时,原有的数组链表会转换成数组红黑树的逻辑结构进行使用
        2. 如果当前size大于loadFactory*capicity的阈值,触发扩容机制
          1. 新建一个newCap的int变量,大小为2*oldCapicity
          2. 新建一个大小为newCap的数组
          3. 原数组元素索引进行2次幂的计算放入新数组
          4. 将newCap赋值给原有的capicity
          5. 返回新数组
  3. ReentantLock的了解
    1. 存在位置
      1. ReentantLock是JDK的一个显式锁的API,具体通过AQS队列实现功能
    2. 锁的种类
      1. ReentantLock是可重入的锁,内部通过判断state当前占有线程进行重入的判断
      2. ReentantLock可以实现公平锁以及非公平锁,在构造对象时显式传入fair
    3. 同步机制
      1. ReentantLock是同步非阻塞式的,采用乐观并发策略
      2. ReentantLock需要显式控制锁的获取与释放,而且可以响应中断
  4. List实现类的比较
    1. 底层实现
      1. Arraylist为数组
      2. LinkedList为链表
    2. 线程安全
      1. ArrayList,LinkedList为线程不安全
      2. Vector为线程安全
    3. 实现时间
      1. ArrayList,LinkedList为JDK1.2开始实现
      2. Vector为JDK1.1开始实现
  5. NIO的了解
    1. NIO是java中用于实现数据的输入/输出的API,是同步非阻塞式的
    2. 核心对象
      1. selector,选择器,用于对channel的选择
      2. channel,通道,用于连接java程序与对象的通道
      3. buffer,缓冲区,用于数据的暂时存放
    3. 工作步骤
      1. java程序与操作对象建立channel
      2. 数据放入buffer中
      3. selector轮询channel,监控IO状况,控制输入输出
  6. ConcurrentHashMap同步的实现(JDK1.7 1.8)
    1. JDK1.7实现
      1. ConcurrentHashMap中数据存放在Segment(默认为16个)中
      2. ConcurrentHashMap为区域锁,锁定对象是Segment
      3. 在写数据时,会经过计算得出使用的Segment,并检查是否持有Segment的锁
    2. JDK1.8实现
      1. ConcurrentHashMap中数据存放在数组链表/红黑树中
      2. ConcurrentHashMap是行级锁,锁定对象是链表的头结点或者红黑树的根结点
      3. 在写数据,计算访问的数据索引,检查锁,访问链表或者红黑树

JVM

  1. G1的工作流程
    1. 初始标记
    2. 并发标记
    3. 最终标记
    4. 筛选回收
  2. CMS的工作流程
    1. 初始标记(stw现象)
    2. 并发标记
    3. 重新标记(stw现象)
    4. 并发清理
    5. 重置线程

Spring

  1. spring bean的生命周期
    1. 对象被实例化
    2. Spring进行IOC的注入
    3. 可选
      1. 传入对象
        1. 实现BeanNameAware接口,传入bean的ID
        2. 实现ApplicationFactoryAware接口,传入Spring工厂
        3. 实现ApplicationContextAware接口,传入Spring上下文
      2. 初始化
        1. 实现BeanPostProcessor接口,对bean内容进行修改
    4. 使用
    5. 清理

网络

  1. 输入域名到返回页面的过程
    1. 浏览器部分
      1. 利用DNS进行域名解析
      2. 检查本地host文件
      3. 组装http报文
      4. http报文经过OSI底层包装发送请求
      5. http请求在第三次tcp握手上发送
    2. 传输
      1. 路由器根据IP进行选择转发到目标主机
    3. 目标主机
    4. 后端进行报文的拆解获取真实请求
    5. 根据请求返回相应页面
    6. 传输
    7. 路由器根据IP进行选择转发到目标主机
    8. 源主机
    9. 拆解报文,获取实部数据
    10. 交给浏览器渲染页面

算法

  1. 两数之和(leetcode 1)