JAVA面试题(46)

183 阅读6分钟

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

JAVA

  1. 抽象类与接口的区别
      1. 抽象类只能继承一个直接父类,可以实现多个接口
      2. 接口可以继承多个接口
    1. 变量
      1. 抽象类允许所有作用域或者关键字进行变量的修饰,与普通类没有区别
      2. 接口只允许静态不可变的public变量
    2. 方法
      1. 接口中在jdk1.8之前所有方法都是抽象的public方法,在1.8得到增强,可以有静态方法或者默认的普通方法
      2. 抽象类中可以有抽象方法,普通方法,静态方法,可以被多种关键字修饰,普通方法中可以有自身的逻辑
    3. 作用
      1. 接口主要用于模块间行为的约束
      2. 抽象类主要用于模板类的实现
  2. 线程不同步集合转换成线程同步集合以及区别
    1. 继承原有集合通过java的线程同步机制实现
    2. 使用Collections的synchronizedXxx方法进行集合的转换
      1. 简单
      2. 锁的对象为对象,粒度过大
    3. 使用java.util包中的ConCurrent方法进行包装
      1. 简单
      2. 锁的粒度为行级,且锁的种类比较丰富
  3. java常见异常以及发生场景(最少5个exception)
    1. OutOfMemoryError
      1. 创建大对象超过java老年代内存抛出
      2. 循环调用过多,甚至出现无限循环抛出
    2. ClassCastException
      1. 对象向下转型时发生
    3. NullPointerException
      1. 对象引用未指定对象实例直接使用
    4. SQLException
      1. sql语句执行错误
    5. InterruptedException
      1. 线程意外终止
    6. IndexOutOfBoundException
      1. 数组越界
  4. 为什么要用线程池,线程池有什么参数可以对线程池进行配置
    1. 使用线程池原因
      1. 异步操作频繁造成的线程切换
      2. 线程频繁创建销毁造成的资源的消耗
    2. 参数
      1. ThreadFactory
      2. corePoolSize
        1. CPU密集,n+1
        2. IO密集,多线程
      3. keepAliveTime
      4. maximumPoolSize
      5. BlockingQueue
        1. 6种实现队列
      6. TimeUnit
  5. List,Set,Map的区别
    1. 存储元素
      1. List与Set是存储单一元素的集合
      2. Map是存储key-value对元素的集合
    2. 元素有序性
      1. Set与Map内的元素在方法调用层面是无序的
      2. List元素是有序的
    3. 元素可重复性
      1. List元素是可重复的
      2. Set不允许重复,Map不允许key重复
    4. 继承接口
      1. Set与List继承了Collection
      2. Map是与Collection层次一致的接口
  6. Iterator与ListIterator的区别
    1. 继承性
      1. ListIterator继承于Iterator
    2. 遍历集合
      1. Iterator可以遍历Collection内的所有实现类
      2. ListIterator只能遍历List接口下的ArrayList以及LinkedList
    3. 遍历方向
      1. Iterator只能向下遍历
      2. ListIterator可以向上向下遍历
    4. 迭代时修改元素
      1. Iterator不支持迭代时修改或插入集合元素
      2. ListIterator支持迭代时修改或删除元素
    5. 迭代时移除元素
      1. 两个迭代器都可以在迭代时移除元素

JVM

  1. 垃圾回收算法
    1. 标记-清理
      1. 标记存活对象
      2. 清除未标记对象
      3. 效率高,但是会造成内存碎片
    2. 复制
      1. 将内存区域划分成清理区与存活区
      2. 将存活对象复制到存活区
      3. 清理清理区的所有对象
      4. 不会造成内存碎片,但是降低内存的使用率
    3. 标记-整理
      1. 标记待清理对象
      2. 将标记对象移到另外一侧
      3. 清理边界外内存区域
      4. 有效解决了内存碎片的产生以及内存使用率下降的问题

数据库

  1. char与varchar的区别
    1. 数据插入方面
      1. 当插入数据等于定义长度,两者处理没有区别
      2. 当插入元素小于定义长度
        1. char会填充空格到定义长度
        2. varchar不会填充空格
    2. 空格问题
      1. 数据最后出现空格
        1. char会将空格删除
        2. varchar不会
    3. 检索速度
      1. char比varchar的检索速度快
  2. 数据库的事务特性
    1. 原子性(Atomic),事务内操作结果时一致的
    2. 一致性(Consitency),事务执行前后数据库的状态时一致的
    3. 隔离性(Isolation),并发事务的执行是互不干扰的
    4. 持久性(Durability),事务执行结果是永久存储的
  3. 数据库中select语句执行流程(客户端到存储引擎)
    1. 客户端通过TCP三次握手与服务端进行连接
    2. 连接器判断账号信息是否有效
    3. 有效,则进入第三步
    4. 无效,连接器返回Access denied的错误
    5. 查询缓存中是否有执行的记录
      1. 不建议使用,可以通过query_cache_type关闭,MySQL 8.0去除了查询缓存的功能
      2. 有执行记录,则返回上次执行结果
      3. 没有执行记录,进入第四步
    6. 分析器进行词法分析,语法分析
      1. 词法分析
        1. 判断输入的SQL语句中的关键词的含义
      2. 语法分析
        1. 判断SQL是否合法
        2. 若合法,进入第五步
        3. 若不合法,返回 You have an error in your SQL syntax错误到客户端
    7. sql语句经过优化器选择最佳执行策略
      1. 多索引情况下的最佳索引的选择
      2. 多表关联时决定表的连接顺序
    8. sql语句交由执行器进行存储引擎的操作并返回结果
      1. 根据from找到需要查询的表,根据where形成有效的结果集合
      2. (如果有order by,对数据进行排序)select返回结果
  4. 数据库中数据更新语句执行流程(客户端到存储引擎) 1. 客户端通过TCP三次握手与服务端进行连接 2. 连接器判断账号信息是否有效 1. 有效,则进入第三步 2. 无效,连接器返回Access denied的错误 3. 查询缓存中是否有执行的记录 1. 不建议使用,可以通过query_cache_type关闭,MySQL 8.0去除了查询缓存的功能 2. 有执行记录,则返回上次执行结果 3. 没有执行记录,进入第四步 4. 分析器进行词法分析,语法分析 1. 词法分析 1. 判断输入的SQL语句中的关键词的含义 2. 语法分析 1. 判断SQL是否合法 2. 若合法,进入第五步 3. 若不合法,返回 You have an error in your SQL syntax错误到客户端 5. sql语句经过优化器选择最佳执行策略 6. sql语句交由执行器进行存储引擎的操作并返回结果 7. 两段式提交 1. 检查并读入相关数据页到内存 2. 将更新语句的操作行写入内存 1. 写入操作记录到readlog中,处于prepare状态 2. 写入操作记录到binlog中 3. 事务提交,处于commit状态
  5. redis的数据类型以及底层实现数据结构 1. string 1. 动态字符串 2. hash 1. 数据量小,压缩链表 2. 数据量大,哈希表 3. list 1. 数据量小,压缩列表 2. 数据量大,双循环链表 4. 有序集合 1. 数据量小,压缩链表 2. 数据量大,跳表 5. set 1. 数据量小,有序数组 2. 数据量大,哈希表

算法

  1. 将有序数组转换为二叉搜索树