2019.4.23面试总结

4.23面试总结

  1. 关键字volatile 的作用
  1. 定义:volatile 一般用于修饰属性变量
  1. 保证共享变量的可见性.(尤其是多核或多 cpu 场景下)
  2. 禁止指令的重排序操作(例如:count++底层会有三个步骤)
  3. 不保证原子性(例如不能保证一个线程执行完 count++所有指令其它线程才能执行。)

 

  1. String能否被继承?原因?

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

    // 省略...

}

当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法

  1. 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后实例化,并将原有数组内容复制到新数组中去。

  1. 一个servlet被请求10次,会创建几个实例?

一般Servlet只初始化一次(只有一个实例)所以是10个

  1. 列举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模板中的变量作为参数。

 

  1. Mybatis中$,#的区别,哪个能防止SQL注入?
  1. 可以把他们看成是mybatis中的一种表达式
  2. #一把用在一些条件表达式中来获取参数的值 就是我们sql元素所对应的参数中的值
  3. $一般用在order by ,group by,from用于替换具体的表名 列名
  4. $底层只是一个字符串的替换,也许会存在SQL注入的风险

 

  1. Java线程生命周期图

  1. 列举你了解的jdk命令工具和jvm启动参数,并说明其用法

  1. Varchar和char的区别

char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例

 

 

  1. 主键和索引的区别

1. 主键是个什么? 

我来来具体的东西说吧,书大家都看过吧,没看过的找本翻一下,看下它每页是不是有个页码,我们的数据表主键就相当于是这个页码,明白了吧。 

2. 那么索引是什么呢? 

我们还拿书来说,索引相当于书的目录,有了目录我们可以很快的知道这本书的基本内容和结构,数据索引也一样,它可以加快数据表的查询速度。 

3. 主键主索引类比,及其他们的作用? 

主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。 
数据表中只允许有一个主键,但是可以有多个索引。 
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。 
索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。 
主键索引外索引的值可以为空。 
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。 
唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。

 

  1. Mysql的行锁和表锁的含义,并说明他们之间的区别

https://www.cnblogs.com/lsxuejava/p/7305920.html

  1. Mysql服务占用cpu 100%,如何排查问题

https://blog.csdn.net/jimshen/article/details/78706538

  1. 事物隔离级别有哪些?

事务:一个操作序列,要么同时执行,要么同时不执行,是一个不可分割的工作单位

 

事务有四大特性,原子性 一致性 持久性 与 隔离性

 

​ ① 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 (可重复读) ,

  1. Java求平方根

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值