第一题:深入理解Integer对象的拆箱和装箱
1.Integer类型的和new Integer()类型的进行比较,永远都是false。
2.如果一个是Integer类型的,一个是int类型的,这两个类型进行比较,只要是数值相等就肯定相等。
3.只要两个Integer对象都是new出来的Integer对象,比较一律按照对象进行处理。
4.也就是最关键的,如果两个都是Integer类型的进行比较的话,那么会先把[-128,127]的都当成一个int常量进行比较,如果两个Integer类型的数超过这个范围,其实就是相当于还需要按照对象进行比较。
第二题:说一说什么是深拷贝,什么是浅拷贝,怎样实现深拷贝
浅拷贝:需要被拷贝的对象A中没有包含对象B,紧紧是单纯的变量和方法或者被拷贝对象A中包含了对象B,但是拷贝完的对象A1是一个分配了新的内存的全新对象,而B1只是引用了原对象B的地址。
深拷贝:拷贝完的对象A1和B1都是分配了新的内存地址的全新对象,下面有例为证。
上图就算是一个浅拷贝
上图是一个深拷贝
测试证明
总结:以上实现深拷贝的方法之一,实现Cloneable接口,重写clone方法,但是这种深拷贝方式有个弊端,就是包含了另一个对象的类要层层实现Cloneable方法。所以采用第二种方法:序列化方式更好。
第三题:关于String、StringBuffer、StringBuilder的线程安全和运营效率。
String和StringBuilder是线程不安全,String为字符串常量,一旦定义就不可改变。StringBuilder为字符串变量,StringBuffer是线程安全的字符串变量,因为它的方法全都用"synchronized"关键字修饰。他们的运行效率StringBuilder> StringBuffer>String
第四题:MyBatis的缓存
MyBatis缓存分为一级缓存和二级缓存,一级缓存为MyBatis的默认缓存,不需要手动开启,同一个sqlSession下执行相同的查询条件多次,则第二次查询会从缓存中读取。
会使一级缓存失效的原因有4种:
①不同的SqlSession对应不同的一级缓存
②同一个SqlSession但是查询条件不同
③同一个SqlSession两次查询期间执行了任何一次增删改操作
④同一个SqlSession两次查询期间手动清空了缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取。
二级缓存开启的条件:
①在核心配置文件中,设置全局配置属性catchEnable="true",一般默认为true,所以不需要设置
②在映射文件中设置标签< cache/>
③二级缓存必须在SqlSession关闭或者提交之后有效
④查询的数据所转换的实体类类型必须实现序列化
使二级缓存失效的情况:两次查询之间执行了任意的增删改,会使一级和二级缓存同事失效。