乐趣区

JAVA面试题42

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

JAVA 基础

  1. 抽象类和接口的区别

    1. 类层面上

      1. 抽象类与接口都不能被实例化
      2. 抽象类只能继承一个直接父类,实现多个接口;接口能继承多个接口
      3. 抽象类大多用作模板类使用,接口用于规范模块间的行为
    2. 方法

      1. 抽象类可以用有抽象方法,静态方法以及普通方法;接口只能是抽象方法
      2. 抽象类中方法作用域跟普通类没有区别;接口方法只能是公共的
      3. 抽象类中可以通过方法间的相互引用实现自身逻辑,接口只能通过子类实现逻辑
      4. 抽象类可以拥有构造器,接口没有构造器
    3. 变量

      1. 抽象类可以有成员变量与静态变量,接口只能有 final 的静态变量
  2. Object 类有哪些成员方法

    1. wait/notify
    2. clone
    3. hashCode/equals
    4. getClass
    5. finalize
    6. 克隆有哪些方法

      1. 实现 Cloneable 重写 clone 方法
      2. 实现 Serialize 接口
  3. Collections 有哪些方法

    1. 返回线程安全类

      1. synchronizedXxx
    2. 返回不可变集合

      1. emptyXxx
      2. singletonXxx
      3. unmotifitableXxx
    3. 集合间的转换
    4. 对集合内元素进行操作

      1. 添加元素到集合中

        1. addAll
        2. copy
      2. 查找元素

        1. binarySearch
        2. frequency
        3. indexOfSubList
        4. shuffle
      3. 替换

        1. fill
        2. replaceAll
      4. 改变元素位置

        1. sort
        2. swap
        3. rotate
        4. reverse
      5. 元素对比

        1. min/max
        2. disJoint
  4. java 常见异常类

    1. 系统级

      1. IllegalAccessException
      2. OutOfMemoryException
    2. 类级

      1. ClassNotFoundException
      2. ClassDefFoundException
    3. 对象级

      1. NullPointerException
      2. ClassCastException
      3. CloneNotSupportedException
      4. NoSuchFieldException
      5. InstantiationException
    4. 方法级

      1. IllegalArgumentException
      2. NoSuchMethodException
    5. 操作级

      1. 数字

        1. ArithmeticException
        2. NumberFormatException
      2. 数组

        1. ArrayStoreException
        2. IndexOutOfBoundException
      3. IO

        1. IOException
        2. FileNotFoundException
        3. EOFException
      4. 数据库

        1. SQLException
      5. 线程

        1. InterruptedException
  5. 类加载机制是怎么样的

    1. 步骤

      1. 加载
      2. 校验
      3. 准备
      4. 解析
      5. 初始化
      6. 使用
      7. 卸载
    2. 双亲委派模型工作原理

      1. 类加载器

        1. BootstrapClassLoader
        2. ExtensionClassLoader
        3. ApplicationClassLoader
        4. UserClassLoader
      2. 当类被加载到内存时,逐层向上询问父加载器是否能加载,如果所有父加载器都不能加载,则由当前类加载器负责加载
      3. 这样做的原因能有效保证类的唯一性
  6. HashMap 的扩容机制

    1. HashMap 的扩容机制主要依赖于三个元素:capacity(默认为 16),loadFactory 负载因子,size 当前元素个数
    2. 当前元素个数大于 8 时,内部数组自动转换为红黑树进行存储
    3. 当前元素个数大于初始容量 x 负载因子时,数组扩容两倍,且内部元素的位置重新进行哈希
    4. 当前元素个数小于初始容量的 0.1 倍时,数组缩小一半,同样元素位置需要重新哈希
  7. ArrayList 扩容机制

    1. ArrayList 扩容主要依赖于 size(当前元素个数)以及 capacity(默认 10)的对比
    2. 当元素填满当前数组(capacity=size),将 capacity 扩容到现在的 1.5 倍,若计算后元素大于 Integer.MAX_VALUE 时,抛出 OOM
  8. ArrayList 与 LinkedList 区别

    1. ArrayList 内部为数组,LinkedList 内部为双向链表
    2. 新增元素

      1. ArrayList 涉及到数组扩容(或者伴随着 arrayCopy)
      2. LinkedList 修改指针指向(或者伴随着遍历操作)
    3. 删除元素

      1. ArrayList 需要进行 arrayCopy
      2. LinkedList 遍历链表并修改指针指向
    4. ArrayList 大小受 Integer.MAX_VALUE 影响,LinkedList 大小理论上无限(受 JVM 调用最大内存影响)
    5. ArrayList 在插入元素时需要考虑当前容量以及进行 arrayCopy 操作,LinkedList 插入不需要有额外操作
  9. Array 与 ArrayList 区别

    1. 存储类型

      1. Array: 基本数据类型以及对象
      2. ArrayList: 只能对象
    2. 大小限制

      1. Array: 在定义时指定,无法增大或缩小
      2. ArrayList: 定义时可不指定(初始为 10),可以扩容
    3. 插入元素

      1. Array: 插入基本数据类型元素不涉及装拆箱操作
      2. ArrayList: 涉及装拆箱操作
  10. Queue 中 poll 与 remove 区别

    1. poll 与 remove 都是取出队头元素
    2. 队列不为空时,两个方法结果是一样的
    3. 队列为空

      1. poll 返回 null
      2. remove 抛出 NoSuchElementException
  11. 线程不同步集合如何转换成线程同步集合

    1. 通过 Collections 工具类返回

      1. 锁为读写锁,锁的粒度为对象级
    2. 通过 java.util.Concurrent 进行包装

      1. 锁为写锁,锁的粒度为元素级
    3. 通常都是用 Concurrent 进行包装

JVM

  1. 垃圾回收算法

    1. 标记 - 清除

      1. 标记不清理对象,清理未标记对象
      2. 速度快,但是会造成内存碎片
    2. 复制

      1. 将内存划分两块区域: 清理区与存活区
      2. 将不清理对象移到存活区,删除清理区的所有对象
      3. 空间浪费大
    3. 标记 - 整理

      1. 标记不清理对象,清理未标记对象
      2. 移动整理存活对象
      3. 成本高,但是有效解决内存碎片问题
  2. G1 工作流程

    1. 初始标记(停顿线程)

      1. 标记 GC Root 直接关联对象
    2. 并发标记

      1. 从 GC Root 对堆中对象进行可达性分析
    3. 最终标记(停顿线程)

      1. 并行将 Remembered Set Logs 的数据合并到 Remembered Set 中
    4. 筛选回收

      1. 根据各 Region 的回收价值和成本进行回收计划的制定

Spring

  1. Spring 中有哪些模块

    1. Spring Core(Spring 核心库)
    2. Spring AOP
    3. Spring ORM
    4. Spring Dao
    5. Spring Web
    6. Spring Context
    7. Spring Web MVC
  2. Spring MVC 的处理流程

    1. 请求通过 DispatchServlet 处理

      1. 普通逻辑处理交由 Controller 处理,Controller 处理后返回 model
      2. 视图处理,DispatchServlet 调用 View temlate 进行视图返回
  3. AOP 概念

    1. AOP 面向切面编程,它将原本纵向的程序看作成一个个切面的组合,是 OOP 的补充
    2. 动态插入执行逻辑到原有执行流程中
    3. 通知(Advice): 具体实现逻辑
    4. 连接点(JoinPoint): 使用通知的位置
    5. 切入点(PointCut): 指定使用通知的连接点位置
    6. 切面(Aspect): 通知与切入点集合
    7. 引入(introduction): 添加新方法属性到现有类中
    8. 目标(target): 被通知的对象
    9. 代理(proxy)
    10. 静态代理
    11. 动态代理
    12. 织入(weaving): 将切面引用到目标对象生成代理对象的过程
  4. Spring bean 的作用域
  5. singleton(默认)
  6. prototype
  7. request
  8. session
  9. globalSession

数据库

  1. MyBatis 中 #与 $ 区别

    1. 传入数据

      1. : 当作字符串传入 sql,相当于 PrepareStatement

      2. $: 直接将参数传入 sql,相当于 Statement
    2. 安全性

      1. 可以防止 sql 注入,$ 不能

  2. 事务的四个特性

    1. 一致性

      1. 事务执行前后都是一致的
    2. 原子性

      1. 事务中操作结果都是一样的
    3. 隔离性

      1. 事务间的操作是相互隔离的
    4. 持久性

      1. 事务的执行结果是永久性的
  3. char 与 varchar 区别

    1. char 的长度是固定的,varchar 的长度是不固定的
    2. char 会用空格填充到指定长度,varchar 不会
    3. char 类型数据后面空格会被删除,varchar 不会
    4. char 的检索效率比 varchar 高
  4. 逻辑分页与物理分页

    1. 逻辑分页会将全部数据加载到内存中,再利用代码逻辑返回分页结果
    2. 物理分页是在数据库层面进行分页
  5. MyBatis 的分页方式

    1. 数组分页
    2. sql 分页
    3. 拦截器分页
    4. RowBounds 分页
  6. 数据库三范式

    1. 第一范式

      1. 属性已经是不能分割的数据单位
    2. 第二范式

      1. 所有非主属性完全依赖于候选属性
    3. 第三范式

      1. 不存在传递依赖候选属性
  7. 内连接外连接区别

    1. 内连接只返回符合条件的共有记录
    2. 外连接会返回表的所有记录,插入符合条件的列

操作系统

  1. 线程与进程的区别

    1. 进程是操作系统分配资源时间的最小单位,线程是进程内部调用的实体
    2. 不同进程拥有操作系统分配的不同地址空间,同一进程的不同线程共享父进程的内存地址
    3. 进程的资源与空间由操作系统分配,线程资源与空间由进程分配
    4. 进程切换开销比线程大
    5. 进程崩溃不会造成对其他进程的影响;线程崩溃造成父进程的死亡
    6. 进程拥有一个程序运行的入口,线程依附进程生存

网络

  1. http 方法有哪些

    1. 方法
    2. get
    3. post
    4. delete
    5. put
    6. options
    7. connect
    8. trace
    9. link
    10. unline
    11. head
    12. get 与 post 的区别

      1. 幂等

        1. get 为幂等操作,post 为非幂等操作
      2. 数据传输

        1. get 的数据通过 url 进行传输,post 数据通过 http 报文传输
        2. get 数据大小受 url 长度限制,post 不受限制
      3. 可缓存

        1. get 数据可缓存,post 数据不可缓存
      4. http 报文

        1. get 的报文没有实体,post 的报文有实体
  2. forward 与 redirect 区别

    1. 行为方

      1. forward 是浏览器行为
      2. redirect 是服务器行为
    2. url 是否改变

      1. forward url 不变
      2. redirect url 改变
    3. 资源消耗

      1. forward 的资源消耗比 redirect 小
    4. 数据共享

      1. redirect 不共享数据,forward 可以共享 request 数据
    5. 效率

      1. forward 高
      2. redirect 低
  3. TCP 三次握手

    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
  4. UDP 与 TCP 区别

    1. TCP 面向连接,UDP 不面向连接
    2. TCP 有拥塞控制,UDP 没有拥塞控制
    3. TCP 资源开销大,UDP 资源开销小
    4. TCP 只支持一对一,UDP 支持一对多
    5. TCP 提供可靠传输,UDP 尽可能交付
    6. TCP 面向字节流,UDP 面向报文

设计模式

  1. 单例模式实现的三种方法

    1. https://www.cnblogs.com/ngy02…
    2. 静态内部类
    3. 懒汉式
    4. 双重检查式
  1. BIO NIO AIO

    1. BIO

      1. 同步阻塞
      2. 线程阻塞进行运算后返回结果
    2. NIO

      1. 同步非阻塞
      2. 请求共用一个线程进行处理
      3. 线程会直接返回结果到请求
    3. AIO

      1. 异步非阻塞
      2. 线程处理后会通过回调返回结果
  2. 反射

    1. JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
    2. 动态代理以及静态代理
退出移动版