您的位置:首页 > 职场人生

实习电话面试遇到到一些问题

2018-03-14 19:47 543 查看
1.Spring的注入方式

当使用byType时,如果容器中存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。

2.判断两个类是否存在继承关系

1、instanceOf关键字,用来判断对象是否是类的实例

2、isAssignableFrom,用来判断类型间是否存在派生关系

3、isInstance方法,用来判断对象是否属于某个类型的实例

Class clazzB = B.class;
Class clazzD = D.class;
boolean isFather = clazzD.isAssignableFrom(clazzB));
if(isFather){
System.out.println("D是B的父类");
}else{
System.out.println("D不是B的父类");
}


System.out.println(new B() instanceof A);
System.out.println(new A() instanceof B);


System.out.println(A.class.isInstance(new B()));


3.JDK1.8为什么把运行时常量池移入堆中?永久代被移除,元空间取代

  1、字符串存在永久代中,容易出现性能问题和内存溢出。

  2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

  3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

  4、Oracle 可能会将HotSpot 与 JRockit 合二为一

4.mybatis中的#和$的区别

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

select * from user where name = #{name};


#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?;


那么我们使用 ${}的时候

select * from user where name = ${name};


${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato";


预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得 ,$ 变量的替换阶段是在动态 SQL 解析阶段,而 #变量的替换是在 DBMS 中。

#方式能够很大程度防止sql注入。

S方式无法防止Sql注入。

S方式一般用于传入数据库对象,例如传入表名.

一般能用#的就别用 S{}.

所以我们在使用mybatis的时候,尽量的使用#方式

5.mybatis 中修改sql语句需要重启吗 ?

需要重启,所有的配置文件修改了都要重启。修改了java文件需要重新编译。修改了页面不需要重启 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试