面试题(一)

一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

  2、String不可变是因为在JDK中String类被声明为一个final类。

  3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

  ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。

二、Vector,ArrayList, LinkedList的区别是什么?

答:   1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以双向链表的形式进行存储。所以,Vector和ArrayList都具有数组的优缺点,而LinkedList拥有链表的优缺点。

     2、Vector是线程同步的,而ArrayList和LinkedList是线程不同步的。

三、HashTable, HashMap,TreeMap区别?

答:   1、HashTable、HashMap使用散列表的方式存储数据,获得、修改数据都是O(1)的操作。HashTable是线程安全的,不允许null值,HashMap不是线程安全的,允许null。HashTable中hash数组的大小默认是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

   2、TreeMap能够把记录根据键值排序,默认是升序排列。

   3、Properties 继承于Hashtable,,所以它是线程安全的.

四、get和post的区别

答:都是http协议里定义的方法。post的内容,添加在http协议的body里面,而get添加在url的后面。所以,1.post发送的内容大,理论上无限制;get内容小,1M 2. post相对安全 3. get的速度快。

五、session和cookie的区别

答:首先session是服务器维护的一个服务器端的存储空间,而cookie是客户端的,主要由浏览器维护。最初cookie是为了解决http的无状态问题的,可以记录前后两次的状态。但是浏览器、js等是可以设置cookie的,一旦禁用,就不能记录了。seesion是在服务器端产生的,用于记录前后两次的状态,如果发起的请求包含sessionid,则访问过,如果没有则新建。seesion是通过cookie实现的,存储在浏览器端用户的sessionid,一旦cookie禁用,也就需要使用重写url和提交隐藏表单的方式进行。浏览器关闭就失效的cookie是会话cookie,保存在内存中。

六、Servlet的生命周期

  servlet生命周期分为4部分~类加载、初始化、服务、销毁。与生命周期有关的方法:init、service和destory。

  tomcat包括Container容器,Container容器里面有servlet容器,在servlet容器里面对应有context容器,每一个web应用对应于一个context,增加一个web应用也就会增加一个context。

  客户端发送http请求,服务器接受http请求后,解析到tomcat。tomcat在相应的web应用下新开一个线程处理这个请求。servlet的httprequest获得这个请求,转给service方法进行处理,最后将处理的结果使用httpresponse返回http请求,返回给客户端。

七、HTTP 报文包含内容

  主要包括:报文请求(方法字段、URL字段和HTTP协议版本)、报文头部(客户端请求的信息:User-Agent、Accept、Host)、空行和请求主体;

八、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

  PreparedStatement的预编译机制,使其与Statement有着显著的区别:1.PreparedStatement是预编译的,会保存下来,下次调用的时候可直接调用,更快;2.由于有预编译的存在,不会出现字段和sql语句的内容匹配,所以可防止sql注入等安全问题。 2. PreparedStatement可以很好的解决本地化的问题。 3. PreparedStatement不容易调试sql语句。

九、sendRedirect, foward区别

  sendRedirect是发送二次请求,浏览器端会看见请求url的变化,而forward是服务器再发送一个请求,浏览器并看不见这个请求的发生,只是接受了请求的最后结果。所以,forward更高效。但是有时候请求的是别的服务器的资源,就必须使用sendRedirect的方法。

十、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的。

  hibernate是一个ORM关系映射文件框架。对关系数据量进行了类的封装,使程序员可以像使用类一样操作数据库。

  hibernate的工作原理:1. 配置关系映射文件; 2. 通过configuration的实例化,读取hibernate.cfg.xml文件,建立表与表之间的映射; 3. 通过configuration的实例化,建立sessionFactory,通过sessionFactory建立session对象; 4. 通过session对象进行数据表的增删改查;

  hibernate中的状态:临时状态、持久化状态、琉璃状态;变化图如下:

  

  一级二级缓存

  [cpu速度快,内存速度慢,缓存是为了解决这两个的速度不一致而设计的。静态RAM和动态RAM:静态RAM速度快,但是体积大;所以一级缓存往往采用静态ram,二级缓存往往采用动态ram]

  Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。

十一、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化

  反射就是知道了类,通过方法获得这个类里面的方法、属性等等信息。

  反射的作用:在运行的时判定任意一个对象所属的类;运行时,构造任意一个类的对象;运行时,判定一个类所属的成员变量和方法;在运行时调用任意的一个方法;生成动态代理;

十二、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

十三、java如何实现多线程,和线程同步,并发操作怎么控制?

  java实现多线程的方法有两种:1.继承Thread类,重写run方法。2. 实现runable接口,实现run方法。都采用start开启线程。区别:由于java是单继承的,实现runable接口了还可以实现别的接口和继承别的方法,较好;runable实现的线程可以共享一份资源,可以将cpu、代码和数据分开;但是编程更复杂。Thread编程更简单。

  并发控制:java使用synchronized处理多线程并发操作,synchronized相当于一把锁,定义了锁资源以后,可以使用wait()和yield()方法控制资源。如果不加以空间可能会出现死锁,读脏数据、不可重复读、丢失更新等异常。

十四、描述struts的工作流程

   struts是工作在web层的框架,

十五、sql的优化问题

十六、JVM垃圾回收实现原理。垃圾回收的线程优先级。

十七、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

原文地址:https://www.cnblogs.com/lxq0309/p/3662694.html