JAVA面试题(45)

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

java

  1. sleep与wait的区别git

    1. 做用对象github

      1. sleep是Thread类的静态方法,做用于当前线程
      2. wait是Object类的成员方法,做用于对象自己
    2. 做用算法

      1. 调用sleep方法,线程进入休眠状态
      2. 调用wait方法,线程进入阻塞状态
    3. 锁的释放spring

      1. sleep不会释放持有的锁
      2. wait会释放锁
    4. 唤醒后端

      1. 天然唤醒或者显式调用interrupt方法
      2. 调用notify或者notifyAll方法
    5. 调用api

      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)
相关文章
相关标签/搜索