欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 后台开发面试题分享四

程序员文章站 2022-06-13 12:57:16
...

61、数据库隔离级别是什么?有什么作用?

  1. Serializable - 串行化:可避免脏读、不可重复读、幻读的发生。
  2. Repeatable read - 可重复读:可避免脏读、不可重复读的发生。
  3. Read committed - 读已提交:可避免脏读的发生。
  4. Read uncommitted - 读未提交:最低级别,任何情况都无法保证。

62、汉字和英文字符在数据库中存储是占同样字节吗

一个汉字占多少长度与编码有关:

UTF-8:一个汉字 = 3 个字节,英文一个字母占用一个字节

GBK: 一个汉字 = 2 个字节,英文一个字母占用一个字节

另: MySQL 5.0.3 之前 varchar(n) 这里的 n 表示字节数;MySQL 5.0.3 之后 varchar(n) 这里的 n 表示字符数,比如 varchar(200),不管是英文还是中文都可以存放 200 个字符。


63、下面两段代码会有编译错误吗?为什么?

第一段:

public class Test1<T> {
    public static T one;
    public static T show(T one){   
        return null;
    }
}

第二段:

public class Test2<T> {
    public static <E> E show(E one){
        return null;
    }
}

第一段会编译报错。因为泛型类中的泛型参数的实例化是在定义对象的时候指定的,而静态变量和静态方法不需要使用对象来调用。对象都没有创建,如何确定这个泛型参数是何种类型,所以当然是错误的。

第二段编译通过。因为这是一个泛型方法,在泛型方法中使用的 E 是自己在方法中定义的 E,而不是泛型类中的 E。


64、MySQL 中有几种连接查询,区别是啥

分为内连接,左连接,右连接和全连接四种,

内连接 inner join:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

左连接 left join:是 left outer join 的简写,它的全称是左外连接,是外连接中的一种。 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为 NULL。

右连接 right join:是 right outer join 的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为 NULL。全连接 union 单独取出的列数必须相同。

Java 后台开发面试题分享四


65、Mysql 中 MyISAM 和 InnoDB 的区别有哪些?该如何选择

区别:

  1. InnoDB 支持事务,MyISAM 不支持。对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin 和 commit 之间,组成一个事务。

  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败。

  3. InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

  5. InnoDB 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;

如何选择:

  1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM。
  2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读,写也挺频繁,请使用 InnoDB。
  3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受;
  4. MySQL 5.5 版本开始 InnoDB 已经成为 MySQL 的默认引擎(之前是 MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不会差。

66、连接池的工作原理

连接池的核心思想是连接的复用,通过建立一个数据库连接池以及一套连接使用、分配和管理策略,使得该连接池中的连接可以得到高效,安全的复用,避免了数据库连接频繁建立和关闭的开销。

连接池的工作原理主要由三部分组成,分别为连接池的建立,连接池中连接的使用管理,连接池的关闭。

  • 第一、连接池的建立。 一般在系统初始化时,连接池会根据系统配置建立,并在池中建立几个连接对象,以便使用时能从连接池中获取。Java 中提供了很多容器类,可以方便的构建连接池,例如 Vector(线程安全类)、LinkedList 等。
  • 第二、连接池的管理。 连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其策略是:
      1. 当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用并作相应处理(即标记该连接为正在使用,引用计数加一);如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到最大连接数,就重新创建一个连接给请求的客户;如果达到,就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
      1. 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过了就从连接池中删除该连接,并判断当前连接池内总的连接数是否小于最小连接数,若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。
  • 第三、连接池的关闭。 当应用程序退出时,关闭连接池中所有的链接,释放连接池相关资源,该过程正好与创建相反。

67、连接池的主要优点

1)减少连接的创建时间。连接池中的连接是已准备好的,可以重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。

2)更快的系统响应速度。数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

3)统一的连接管理。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统的连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的链接数量,增强了系统在大量用户应用时的稳定性。


68、ParNew 垃圾回收器的运行机制是什么

ParNew 垃圾回收器是针对年轻代的垃圾回收,年轻代的内存划分为一块 Eden 区和两块 Survivor 区,对象创建的时候进入 Eden 区,然后就慢慢增加,Eden 区满了就触发 YGC,ParNew 回收器就去回收年轻代中没有引用的对象,采用的是复制算法。

怎么个复制法呢?首先是在 Eden 区里标记出来存活的对象,也就是有 GCRoots 的对象,然后将这些对象全部复制到一块 Survivor 区中,再一次性将 Eden 区里的对象全部回收。这么做目的是为了防止 Eden 区中产生大量的内存碎片,导致内存浪费。


69、如果一个表有一列定义为 TIMESTAMP,将发生什么?列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?怎样才能找出最后一次插入时分配了哪个自动增量?

1)每当行被更改时,时间戳字段将获取当前时间戳。

2)它会停止递增,任何进一步的插入都将产生错误,因为**已被使用。

3)LAST_INSERT_ID 将返回由 auto_increment 分配的最后一个值,并且不需要指定表名称。


70、如下的一条 SQL 的执行顺序是什么?

SELECT 
  category_name, COUNT(category_name)
FROM 
  product 
WHERE 
  category_name IS NOT NULL 
GROUP BY
  category_name 
HAVING
  COUNT(category_name) > 1 
Order by id desc

FROM 找到 product 表,

WHERE 获取不为空的 category_name,

然后 GROUP BY 对数据进行分组,

HAVING 对数据进行筛选,

SELECT 选择显示对应的列,

ORDER BY 决定最终显示的顺序。

所以顺序是:From -> Where -> Group by -> Having -> Select -> Order by

想了解更多,欢迎关注我的微信公众号:Renda_Zhang