Java-面试总结

几轮面试下来,由最初的自信什么都能做,到现在感觉什么都不会做;但是面对面试官,却更坦然。

对自己还能记得起来的面试题,稍微整理一下。欢迎指正。

基 - 础

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>



7、谈谈你对 Ajax 的理解和优点(Asynchronous  JavaScript and XML)

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、deletetruncate分别在什么场景之下使用?

不再需要一张表的时候,用drop,

想删除部分数据行时候,用delete,并且带上where子句

保留表而删除所有数据的时候用truncate



持续更新中.................


猜你喜欢

转载自blog.csdn.net/javareact/article/details/77196854