面试题整理

整理目前面试遇到的所有的问题

1.tomcat加载jsp过程?
2.springMvc比struts好在哪里?
4.java中所有的类都可以继承么?java中的排序方法sort默认是什么排序算法
5.加了final关键字的类,对象的属性是否可以修改?
6.线程池?java线程同步相关
7.Hashmap里面的类要实现什么方法?
8.Springmvc怎么将请求转给Controller的?
9.nginx如何判断后台的tomcat是否紧张?
10.StringBuilder和StringBuffer的区别
11.列举出java中的几种字节流
12.Spring容器中bean的生命周期
13.static+sychrinised 两个线程能否访问同一方法?去掉static之后呢?
14.Mysql如何给字段加锁
15.sql语句执行很慢,可能的原因是什么?
16.列举几种设计模式,什么是策略模式
17.线程wait()方法和sleep()方法的区别
18.列举几种前段视图技术
19.列举几种排序算法,你认为哪种排序算法最快,说说他的原理过程
20.对GC这块有没有了解?
21.static+sychrinised和sychrinised的区别?
22.hashMap底层的数据结构是数组还是链表?HashMap怎么解决hash冲突
23.解释下什么是乐观锁
24.不用第三个变量,用数学方法来交换两个变量的值
25.Spring怎么托管MySql的事务
26.数据库的ACID和隔离级别
27.java可能发生内存泄漏吗?为什么?


java中所有的类都可以继承么?java中的排序方法sort默认是什么排序算法?加了final关键字的类,对象的属性是否可以修改?

不是所有的类都可以继承,Java中的类被声明为final的,比如Double等基本类型,String、Math等是不能被继承的,final类中的方法默认是final的。

查了下api文档:

貌似是快排, 我答成冒泡了...... 悲剧

如果类上加了关键字final,对象的属性是否可以修改?实践说明一切,答案是可以

  


Hashmap里面的类要实现什么方法?

具体是不是这个问题我记得不是太清楚了,反正具体和HashMap有关. 答案是hashCode()方法。http://www.cnblogs.com/f91og/p/6657474.html


列举出java中的几种字节流

要搞明白java中字节流和字符流的区别:

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

详细区别见:http://www.cnblogs.com/absfree/p/5415092.html


java中StringBuilder和StringBuffer的区别

看了几篇博客,主要的区别在于两个方面:性能和线程安全上。性能方面:StringBuilder >  StringBuffer  >  String

                           线程安全:StringBuilder是线程非安全的,StringBuffer是线程安全的


static+synchrinised 两个线程能否访问同一方法?去掉static之后呢?

这个问题涉及到了java多线程的知识,static关键字就不说了,聊聊synchrinised关键字吧, Java中Synchronized的用法


java多线程中wait()方法和sleep()方法的区别?

1. sleep()方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

2. 调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。详细见博文:http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html


java线程池

首先要明白这个概念,java中的线程类是Thread,一个Thread对象便是一个线程,java提供了一个类Excecutor(执行器)来帮你管理Thread对象,这个类在java.util.concurrent包中,从而简化了并发编程。这里贴上两遍我觉得不错的博文:Java线程池介绍&&Java线程池的分析和使用


Mysql如何给字段加锁?

找了到一篇不错的博文来解释Mysql的锁机制:MySQL详解--锁(我们不生产博文,我们只是博文的搬运工)。Mysql的默认引擎innodb对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。

¡  共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

¡  排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。

SQL语句执行很慢,可能的原因是什么?

这个涉及到数据库优化之类的,继续转载下别人的博客:mysql查询速度慢的原因[整理版] 

列举几种设计模式,什么是策略模式?

关于设计模式,以后肯定是要写一系列的博文来研究研究的,现在明白策略模式大大概:创建个接口,里面有个方法,再有这个接口的3个实现类,分别用不同的方式来实现接口中的方法(即有3种策略),那么我们在运用的时候将一个方法的接受参数类型设为这个接口的话,他这个3个实现类都能传进去了。也就是说我们可以根据我们具体的业务场景来运用不同的策略了。


列举几种排序算法,你认为哪种排序算法最快,说说他的原理过程

冒泡,快排,简单选择,基数,堆,归并,直接插入,希尔。至于哪种排序算法最快,我答的是快排......至于原理,网上一搜一大堆,我就不再阐述了。


SpringMVC比struts好在哪里?

摘自百度知道:https://zhidao.baidu.com/question/1962679077387254340.html

1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。
8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
9、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。
10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经100%零配置。

SpringMVC怎么将请求转给Controller的?

发现阿里的面试好喜欢问一些底层,原理性的东西,看来基础还是很重要的,光会用可不行。

①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.

②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.

③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.

④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.

详细讲解见:SpringMVC源码分析(3)DispatcherServlet的请求处理流程


Nginx如何判断后台的tomcat是否紧张?

Nginx如何实现负载均衡的问题,详见:http://www.cnblogs.com/mecity/archive/2011/06/20/2085529.html


Spring容器中bean的生命周期?Spring组件?

再来搬运一篇博文:Spring Bean的生命周期(非常详细)SpringMVC 组件类大全


除了jsp列举几种前端视图技术

freemarker  velocity thymeleaf jade ejs (问人的时候发现了新大陆,知道了一个叫做MVVM的东西,这里先记下来,日后研究研究)


Tomcat加载jsp过程?Servlet生命周期?

当客户端浏览器向服务器发出访问一个JSP页面的请求时,服务器根据该请求加载相应的JSP页面,并对该页面进行编译,然后执行。JSP页面的执行过程如下图所示:

  1. 客户端通过浏览器向服务器发出请求,在该请求中包含了请求的资源的路径,这样当服务器接收到该请求后就可以知道被请求的内容。
  2. 服务器根据接收到的客户端的请求来加载相应的JSP文件。
  3. Web服务器中的JSP引擎会将被加载的JSP文件转化为Servlet。
  4. JSP引擎将生成的Servlet代码编译成Class文件。
  5. 服务器执行这个Class文件。
  6. 最后服务器将执行结果发送给浏览器进行显示。

并不是每次请求都需要重复进行这样的处理。当服务器第一次接收到对某个页面的请求时,JSP引擎就开始按照上述的处理过程来将被请求的JSP文件编译成Class文件。当再次对该页面进行请求时,如果该页面没有任何改动,服务器就会直接调用对应的Class文件来执行。因此当某个JSP页面第一次被请求时,会有一些延迟,而再次访问时会感觉速度快了很多。如果被请求的页面经过了修改,那么服务器会重新编译这个文件,然后再执行。这样说感觉还是太笼统了,想要彻底搞明白还是得看源码才行,哪天就这块写下博客具体分析分析,现在感觉时间真的是不够用啊。

Java Servlet系列之Servlet生命周期


对GC这块有没有了解?

不怎么了解,这块是要准备买本书来看看的


解释下什么是乐观锁

关于悲观锁和乐观锁的区别:首先要明白的是这两个都是并发控制机制,接下来用理解的便是这两者并发控制机制的不同。

  悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

   乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。(脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。)

  详细见:http://www.javaweb1024.com/java/JavaWebzhongji/2015/09/06/847.html


hashMap底层的数据结构是数组还是链表?

从上图我们可以看出HashMap底层实现还是数组,只是数组的每一项都是一条链。其中参数initialCapacity就代表了该数组的长度。详细分析见这篇博文:http://www.cnblogs.com/chenssy/p/3521565.html


static+synchrinised和synchrinised的区别?

synchronized static是某个类的范围,防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
synchronized 是某实例的范围,防止多个线程同时访问这个实例中的synchronized 方法。


不用第三个变量,用数学方法来交换两个变量的值

感觉被测智商了。(说到这里,我有个很莫名奇妙的感慨,人脑世界&数学世界&程序世界  这三个世界的基础构造的不同之处和贯穿之处。) 

即首先用其中一个较小的变量存储他们的差值,然后另一个变量减去这个差值的得较小的那个变量,在用这个变量加上差值便得到较大的那个变量。关键点在于:两者的差值是必须要记下来用于计算的,如果不能用第三个变量的话那就用给定的两个变量中的一个便可以了。


Spring怎么托管MySql的事务


数据库的ACID和隔离级别

Atomicity,Consistency,Isolation,Durability

1.READ UNCIMMITTED(未提交读)

2.READ COMMITTED(提交读)

3.REPEATABLE READ(可重复读)

4.SERIALIZABLE(可串行化)

http://www.cnblogs.com/s-b-b/p/5845096.html


java可能发生内存泄漏吗?为什么?

原文地址:https://www.cnblogs.com/f91og/p/6652306.html