4.23面试总结
- 关键字volatile 的作用
- 定义:volatile 一般用于修饰属性变量
- 保证共享变量的可见性.(尤其是多核或多 cpu 场景下)
- 禁止指令的重排序操作(例如:count++底层会有三个步骤)
- 不保证原子性(例如不能保证一个线程执行完 count++所有指令其它线程才能执行。)
- String能否被继承?原因?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
// 省略...
}
当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法
- ArrayList如何扩展
ArrayList扩容的关键方法grow():
private void grow(int minCapacity) {
// 获取到ArrayList中elementData数组的内存空间长度
int oldCapacity = elementData.length;
// 扩容至原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 再判断一下新数组的容量够不够,够了就直接使用这个长度创建新数组,
// 不够就将数组长度设置为需要的长度
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//若预设值大于默认的最大值检查是否溢出
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间
// 并将elementData的数据复制到新的内存空间
elementData = Arrays.copyOf(elementData, newCapacity);
}
从此方法中我们可以清晰的看出其实ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。
- 一个servlet被请求10次,会创建几个实例?
一般Servlet只初始化一次(只有一个实例),所以是10个
- 列举SpringMvc常用的注解和含义(至少3个)
1)@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。
2)@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
3)@Resource和@Autowired 两者都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是java.annotation.Resource,需要导入,但是Spring支持该注解的注入。@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
4)@PathVariable 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
- Mybatis中$,#的区别,哪个能防止SQL注入?
- 可以把他们看成是mybatis中的一种表达式
- #一把用在一些条件表达式中来获取参数的值 就是我们sql元素所对应的参数中的值
- $一般用在order by ,group by,from用于替换具体的表名 列名
- $底层只是一个字符串的替换,也许会存在SQL注入的风险
- Java线程生命周期图
- 列举你了解的jdk命令工具和jvm启动参数,并说明其用法
- Varchar和char的区别
char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例
- 主键和索引的区别
1. 主键是个什么?
我来来具体的东西说吧,书大家都看过吧,没看过的找本翻一下,看下它每页是不是有个页码,我们的数据表主键就相当于是这个页码,明白了吧。
2. 那么索引是什么呢?
我们还拿书来说,索引相当于书的目录,有了目录我们可以很快的知道这本书的基本内容和结构,数据索引也一样,它可以加快数据表的查询速度。
3. 主键主索引类比,及其他们的作用?
主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。
数据表中只允许有一个主键,但是可以有多个索引。
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。
索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。
主键索引外索引的值可以为空。
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。
唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。
- Mysql的行锁和表锁的含义,并说明他们之间的区别
https://www.cnblogs.com/lsxuejava/p/7305920.html
- Mysql服务占用cpu 100%,如何排查问题
https://blog.csdn.net/jimshen/article/details/78706538
- 事物隔离级别有哪些?
事务:一个操作序列,要么同时执行,要么同时不执行,是一个不可分割的工作单位
事务有四大特性,原子性 一致性 持久性 与 隔离性
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
脏读是一个事务在修改某个数据但未提交,这时,另一个事务也来访问该数据,这时就会造成两个事务得到的数据不一致,比如,A 向 B 转 100元,这时 B 发现钱确实到账了,但只要 A 不提交该事务,所有的事务都将回滚, B 会发现 钱没能到账
不可重复读是指事务1在读取某一数据,而事务2立马修改了这个数据并提交给事务给数据库,当事务1再次读取该数据就会得到不同的结果,
幻读:事务非独立执行时发生的一种现象。比如:事务1对一个表中的所有行的某个数据项进行修改操作如从 1 修改成 2,这时事务2又对这个表中插入了一行数据,并且在这个数据项的数据为 1 时就提交给数据库。如果事务1的操作用户查看刚刚修改的数据,会发现还有一行没有修改,其实这一行是事务2添加的,这就是 幻读
级别越高,执行的效率越低, MySQL 数据库, 默认是Repeatable read (可重复读) ,
- Java求平方根