1、列举一些列举常见的运行时异常
NullPointerException - 空指针异常
ClassCastException - 类转换异常
IndexOutOfBoundsException - 下标越界异常
ArithmeticException - 计算异常
IllegalArgumentException - 非法参数异常
NumberFormatException - 数字格式异常
UnsupportedOperationException 操作不支持异常
ArrayStoreException - 数据存储异常,操作数组时类型不一致
BufferOverflowException - IO 操作时出现的缓冲区上溢异常
NoSuchElementException - 元素不存在异常
InputMismatchException - 输入类型不匹配异常
2、MyISAM与InnoDB的区别?
InnoDB 支持事务;MyISAM 不支持事务
InnoDB 支持行级锁;MyISAM 支持表级锁
InnoDB 支持 MVCC(多版本并发控制);MyISAM 不支持
InnoDB 支持外键,MyISAM 不支持
MySQL 5.6 以前的版本,InnoDB 不支持全文索引,MyISAM 支持;MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引
InnoDB 不保存表的总行数,执行 select count(*) from table 时
需要全表扫描;MyISAM 用一个变量保存表的总行数,查总行数速度很快
InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,
通过主键索引效率很高。辅助索引需要两次查询,先查询到主键,再通过主键查询到数据。主键太大,其他索引也会很大;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的
总结:
InnoDB 存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全,与 MyISAM 比 InnoDB 写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引
MyISAM 不支持事务、也不支持外键,优势是访问的速度快。对事务的完整性没有要求、以 SELECT 和 INSERT 为主的应用可以使用这个存储引擎
3、MySQL的数据类型有哪些?
1、整数类型: TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
分别占用 1 字节、2 字节、3 字节、4 字节、8 字节;任何整数类型都可以加上 UNSIGNED 属性,表示数据是无符号的,即非负整数;整数类型可以被指定长度,即为显示长度,不影响存储占用空间
2、实数类型: FLOAT、DOUBLE、DECIMAL
DECIMAL 可以用于存储比 BIGINT 还大的整型,能存储精确的小数;FLOAT 和 DOUBLE 有取值范围,支持使用标准的浮点进行近似计算
3、字符串类型: CHAR、VARCHAR、TEXT、BLOB
CHAR 是定长的,根据定义的字符串长度分配足够的空间;VARCHAR 用于存储可变长字符串;TEXT 存大文本;BLOB 存二进制数据
4、枚举类型:ENUM
把不重复的数据存储为一个预定义的集合,可以替代常用的字符串类型
5、日期和时间类型:YEAR、TIME、DATE、TIMESTAMP、DATETIME
分别占用 1 byte、3 bytes、4 bytes、4 bytes、8 bytes
4、索引如何创建与删除?
创建单个字段索引的语法:CREATE INDEX 索引名 on 表名(字段名)
创建联合索引的语法:CREATE INDEX 索引名 on 表名(字段名1,字段名2)
索引命名格式一般可以这样:idx_表名_字段名。注意有长度限制
删除索引:DROP INDEX 索引名 ON 表名
如:
给 id 创建索引:CREATE INDEX idx_t1_id on t1(id);
给 username 和 password 创建联合索引:CREATE index idx_t1_username_password ON t1(username,password)
index 替换成 unique 或 primary key,分别代表唯一索引和主键索引
5、LIKE 后的%和_代表什么?
% 代表 0 或更多字符
_ 代表 1 个字符
6、Mysql中exists和in的区别
下面将主查询的表称为外表;子查询的表称为内表。exists 与 in 的主要区别如下:
子查询使用 exists,会先进行主查询,将查询到的每行数据循环带入子查询校验是否存在,过滤出整体的返回数据;子查询使用 in,会先进行子查询获取结果集,然后主查询匹配子查询的结果集,返回数据
外表内表相对大小情况不一样时,查询效率不一样:两表大小相当,in 和 exists 差别不大;内表大,用 exists 效率较高;内表小,用 in 效率较高。
不管外表与内表的大小,not exists 的效率一般要高于 not in,跟子查询的索引访问类型有关。
7、强引用、软引用、弱引用、虚引用是什么,有什么区别?
强引用,就是普通的对象引用关系,
软引用,用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。
弱引用,相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。
8、说一下垃圾分代收集的过程
分为新生代和老年代,新生代默认占总空间的 1/3,老年代默认占 2/3。
新生代使用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1。
当新生代中的 Eden 区内存不足时,就会触发 Minor GC,过程如下:
在 Eden 区执行了第一次 GC 之后,存活的对象会被移动到其中一个 Survivor 分区;
Eden 区再次 GC,这时会采用复制算法,将 Eden 和 from 区一起清理,存活的对象会被复制到 to 区;
移动一次,对象年龄加 1,对象年龄大于一定阀值会直接移动到老年代
Survivor 区相同年龄所有对象大小的总和 > (Survivor 区内存大小 * 这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。其中这个使用率通过 -XX:TargetSurvivorRatio 指定,默认为 50%
Survivor 区内存不足会发生担保分配
超过指定大小的对象可以直接进入老年代
Major GC,指的是老年代的垃圾清理,但并未找到明确说明何时在进行Major GC
FullGC,整个堆的垃圾收集,触发条件:
1.每次晋升到老年代的对象平均大小>老年代剩余空间
2.MinorGC后存活的对象超过了老年代剩余空间
3.元空间不足
4.System.gc() 可能会引起
5.CMS GC异常,promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成;concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成
6.堆内存分配很大的对象