JAVA面试题46

43次阅读

共计 2660 个字符,预计需要花费 7 分钟才能阅读完成。

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

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. 将有序数组转换为二叉搜索树

正文完
 0