JAVA面试题(42)

154 阅读8分钟

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

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. www.cnblogs.com/ngy0217/p/9…
    2. 静态内部类
    3. 懒汉式
    4. 双重检查式
  2. BIO NIO AIO

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

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