几轮面试下来,由最初的自信什么都能做,到现在感觉什么都不会做;但是面对面试官,却更坦然。
对自己还能记得起来的面试题,稍微整理一下。欢迎指正。
基 - 础
1、public、protected、default、private作用范围
public:所有,
protected : 同类,同包,子类
default : 同类,同包
private : 当前类
2、String、StringBuffer和StringBuild的区别。
String是因为有“final”修饰符是不可变的,StringBuffer和StringBuild都继承自AbstractStringBuilder类,都是可变的。
StringBuffer对方法加了同步缩或者调用的方法加了同步锁,所有线程是安全的,StringBuider没加线程锁是非安全。
如果不是使用多线程的话,StringBuider效率高于StringBuffer
3、Abstract和 Interface的区别
同:都具有抽象方法,都不能实例化。
异:抽象类可以有构造器,接口不能有构造器。抽象类里面可以写非抽象方法,从而避免在子类中重复书写它们,这样就提高了代码的复用性,而接口里面只能写抽象方法。一个类只能继承(extends)一个父类,而一个类可以实现(implements)多个接口。
一般在业务层使用接口,控制层使用接口
4、List、Set、Collection的区别
List是有序的可以重复,Set是无序不可重复,Collection是一个集合工具类。
5、SQL语句调优
(1)、对查询进行优化,避免全表扫描,首先考虑涉及到where、order by 的列建立索引。
(2)、尽量避免在where子句中对字段进行表达式操作,这样会导致索引失效, 例:where num*2=100 改为 where num=100/2。
(3)、尽量避免向客户端返回大量的数据,若数据量过大,就应该考虑需求是否合理。
(4)、避免使用 * ,只查询指定的列。
(5)、避免在where中使用 or 来连接条件,改用 union 或者union all来提高性能.
6、将Web项目部署到服务器的几种方法
(1)、直接将项目打成一个war包放到Webapps目录下面,服务器就会解开这个war包,并在当前目录生成一个同名的文件夹。
(2)、.在 Tomcat 安装目录的 conf 文件夹,修改配置文件 server.xml,在<host>和</host>标签之间插入下面代码:
<Context path="/hellooo" docBase="D:/HodoopSpark(项目路径)" reloadable="false" debug="0"privileged="true" ></Context>
ajax是基于JavaScript和HTTPRequest,最大的特点是局部刷新,由HTML、css、dom、xml、XMLHTTPRequest、JavaScript几个部分组成,
特点是:
1)通过异步模式,提示用户体验。
2)优化了服务器与客户端的传输,减少不必要的数据往返,优化了宽带占有。
3) ajax是在客户端运行的,承担了一部分服务器的工作,减少了服务器的负载。
8、session和cookie的区别和联系,session的生命周期。
cookie机制是在客户端保持状态的方案,session是服务端保持状态的方案。
session机制需要借助cookie机制来达到保存标识的目的,
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
9:什么是 乐观锁, 和悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
10、多线程中Sleep和wait 差别?
(1)这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
(2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
框 - 架
1、Spring IOC和AOP的理解
IOC:(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。是典型的工厂模式,IOC底层是通过key-value来实现的,key是id或者类型,value是堆里面的对象引用。通过Sessionfactory去注入实例,将类的依赖关系写进配置文件,由配置文件实现注入实现松耦合,在spring容器启动的时候,spring会把你配置的Bean都初始化,需要的时候直接通过@resource或者ApplicationContext取出来。
AOP:即面向切面编程,是对OOP技术的完善,将安全事务等这些运行程序分解成切面,利用spring配置文件将这些切面插进去,实现面向编程,提高复用 性。实现AOP是通过两种方式实现的,一种是通过jdk的动态代理和实现的,利用截取消息的方式对该消息进行装饰,以取代原有对象行为的执行,二 是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码
2、Spring事务隔离级别和传播性
数据隔离级别有四种:
1) serializable:最严格的级别,事务串行执行,资源消耗最大。
2) repeatable read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失
3) read committed:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统
4) read uncommitted:保证了读取过程中不会读取到非法数据。隔离级别在于处理多事务的并发问题。 我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。
脏读 | 不可重复的读取 | 幻影读取 | |
serializable | 不会 | 不会 | 不会 |
repeatable read | 不会 | 不会 | 会 |
read committed | 不会 | 会 | 会 |
read uncommitted | 会 | 会 | 会 |
3、Mybatis和Hibernate的区别
1)开发工作量
Hibernate和Mybatis都有相应的代码生成工具,可以生成简单的DAO方法。
针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。Hibernate有良好的映射机制,开发者不需要关系SQL生成和映射结果
2)调优方面
Hibernate查询的时候会将表里的字段全都查询出来,会消耗性能,如果自己写SQL语句查询,就破坏的Hibernate的简洁性
Mybatis的SQL是手动编写,可以按照需求查询指定的字段。
3)缓存方面
都有二级缓存,Mybatis的二级缓存都是在每个具体的表-对映射里面配置,都可以通过实现自己的缓存或其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
Hibernate的二级缓存都是在sessionFactory生成的配置文件详细配置,然后在具体的表-对象映射中配置缓存。
4、#{}和${}的区别是什么?
5、mybatis的xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
6、内联接,外联接区别?
7、drop、delete与truncate分别在什么场景之下使用?
不再需要一张表的时候,用drop,
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate
持续更新中.................