java面试

原文:http://blog.csdn.net/natian306/article/details/10858097

 

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

  一共有三点:

  String(private final char value[];)

  StringBaffer,StringBuilder(char value[];)

 1.可变与不可变

  String一旦创建是不可改变的,而StringBuffer,StringBuilder是可以改变的。

 2.线程安全与不安全:

  String对象是不可变的,可以理解为常量,所以线程是安全的。

  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。

  StringBuilder没有对方法加同步锁,所以是非线程安全的。

  3.如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

 

二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么? 

  LinkList类的实现方式是链表,增加和删除的操作有更好的效率。

  ArrayList的实现方式是数值,所以查找的效率比较高。

  但是这两者线程都是不安全的。

  Vector是线程安全的,因此效率比前两者低。

 

三、HASHTABLE, HASHMAP,TreeMap区别 ?

      HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了MAP接口,因为hashmap线程不安全,所以效率比hashtable高;

  hashMap允许key或value为null,但hashTable不允许;

  hashMap去掉了hashTable的contains方法,改成containsvalue和containsKey,因为contains方法容易让人引起误解;

  HashTabel继承了Dictionary类,而HashMap实现了Map接口;

  HashTable是线程安全的,多个线程访问时不需要主动实现同步而hashMap不是线程安全的,需要主动提供外同步(需要                     Collections.synchronizedMap(hashMap),ConcurrentMap);


四、ConcurrentMap和HashMap的区别?

  hashMap允许key或value为null,ConcurrentMap不允许;

  ConcurrentMap线程安全,而hashMap不是同步的需要主动提供外同步(需要Collections.synchronizedMap(hashMap),ConcurrentMap);

  ConcurrentMap的操作都是原子操作,hashMap不是;


五、Tomcat,apache,jboss的区别 ?

  Apache是Http服务器,Tomcat是web服务器,JBoss是应用服务器。

     Apache解析静态的html文件;Tomcat可解析jsp动态页面、也可充当servlet容器。

  
六、GET POST区别 

     1. Get是从服务器端获取数据,Post则是向服务器端发送数据。

      2.在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。

      3.对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。

      4.Get方式提交的数据最多1024字节,而Post则没有限制。

      5.Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

  查询用get;添加,删除,修改用post。

 

七、SESSION, COOKIE区别 ?

  1.session是应用服务器维护的一个服务端的储存空间Cookie是客户端的储存空间,由浏览器维护

  2.用户可以通过浏览器设置决定是否保存cookie,而不能决定是否使用session,因为session是由服务端维护的。

  3.Session保存的是对象,而cookie保存的是字符窜

  4.Session和cookie不能跨窗口使用,每打开打开一个浏览器系统会赋予一个新的SessionID,此时sessionID不同,如果想跨浏览器访问数据,可以使用Aplication。

  5.session和cookie都有失效的时间,到时间会自动删除。


八、Servlet的生命周期 ?

  大概分为4部分:servlet类加载----实例化-----服务-----销毁

  1.Web客户端向servlet(Tomcat)发送Http请求

  2.servlet容器接受客户端请求

  3.servlet容器创建一个HttpRequest对象,将客户端信息封装在这个对象中

  4.servlet创建一个HttpResponse

  5.servlet调用HttpServlet的service方法,将HttpRequest对象和HttpResponse对象作为参数传递到HttpServlet对象中

  6.HttpServlet通过调用HttpRequest对象的方法,获取Http请求,并进行相应的处理

  7.处理完成HttpServlet调用HttpRequest对象的方法,返回响应数据

  8.Servlet容器把HttpServlet响应的数据结果传回浏览器。

  servlet生命周期的方法:

    init():负责初始化servlet;

    service():负责响应客户端请求;

    distory():当servlet对象推出时,释放占用资源;

 

九、HTTP 报文包含内容 ?

    1.request line;(请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔)

    2.header line;(请求头部通知服务器有关于客户端请求的信息)

    3.blank line;(通知服务器以下不再有请求头)

    4.request body;(请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是       Content-Type和Content-Length。)

 


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

  1.PreparedStatement支持动态设置参数,statememt不支持

  2.preparedStatement可以避免类似 单引号 的编码麻烦,statement不支持

  3.preparedStatement支持预编译,statement不支持

  4.sql语句出错时preparedStatement不易检查错误,statement便于检查

  5.preparedStatement可以防止sql注入,更安全,而statement不可以

  什么是sql注入:

  通过sql语句的拼接达到无参数查询访问数据库数据的目的;

     如将要执行的sql语句为 select * from table where name = "+appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1']  传入可在数据库中执行。

   因此可以采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不  行,需要手工检测。

 

十一、redirect, foward区别 ?

  foward是服务器端控制页面转向,在客户端的浏览器不会显示转向后的urlredirect则是完全跳转浏览器会显示跳转后的url地址并从新发送请求链接。

  原理:forward是服务器请求资源,服务器直接访问目标地址的url,把那个url的内容读取过来,再将这些内容返回给浏览器,浏览器不知道这些数据是哪来的,所以地址栏不变。

  redirect是服务器根据逻辑,发送一个状态码,告诉浏览器去请求那个地址,浏览器会使用刚才所有的参数从新发送新的请求。

 


十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态, 
几个对象,几个属性,几个方法?

  因为java实例化出来的对象都放在堆内存中所以如果实例化一百次,就会产生一百个对象,属性和方法都是属于一个整体,但是如果属性和方法是静态的,那么属于类属性和类的方法在内存中只会产生一个。   

 

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

  Hibernate是一个开发的对象关系映射框架。它对jdbc进行了非常对象的封装,Hibernate允许程序员使用面向对象的方式来操作数据库。

  优点:

  1.程序更面向对象

  2.提高了开发效率

  3.方便移植

  4.无入侵性

  缺点:

  1.效率比jdbc差

  2.不适合批量操作

  3.只能配置一种关联关系

  hibernate四种查询:

  1.get,load方法,根据ID查找对象

  2.hibernate query language(HQL)

  3.标准语言查询

  4.通过sql查询

  hibernate的工作原理:

  1.配置hibernate对象 关系映射文件,启动服务器

  2.服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据需求建表以及表之间的关联关系

  3.通过实例化Configuration对象创建SessionFactory,通过sessionFactory实例创建session对象。

  4.通过session对象完成对数据库的操作

  hibernate的状态转移:

  临时状态

  1.不处于session缓存中

  2.数据库中没有对应的记录

  java是如何进入临时状态的:1.通过new语句创建一个对象时;2.刚调用session的delete方法时,从session缓存中删除一个对象时。

  持久化状态

  1.处于session缓存中

  2.持久化数据库中没有对象记录

  3.session在特定时刻会保存两者同步

  java如何进入持久化状态:1.session的save()方法。2.session的load().get()方法返回的对象。3.session的find()方法返回的集合中的对象。4.session的update().save()方法。

  游离状态

  1.不在位于session缓存中

  2.游离对象有持久化状态转变而来,数据库还没有相应的记录

  java是如何进入游离状态的:1.Session的close()方法。session的 evict()方法,从缓存中删除一个对象。

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

  

  

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

  反射机制的定义:

    在运行状态中,对于任意的一个类,都能知道这个类的属性和方法对任意一个对象都能够通过反射机制调用一个类的任意一个方法这种动态获取类信息及动态调用类对象方法的功能称为反射机制。

  反射的作用:

    1.动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类。

    2.应用程序需要在运行时从某个特定的程序中载入一个特定的类。

 
十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些 ?

  1.Hibernate偏向于对象的操作达到对数据库数据的操作的目的;而ibatis更偏向于sql语句的优化

  2.hibernate使用的查询语句是自己的HQL,而ibatis是标准的sql语句

  3.hibernate相对复杂,不易学习; ibatis类似于sql语句,易学习

  性能方面:

  1.如果系统数据处理量巨大,性能要求极为严苛时,往往需要人工编写高性能的sql语句或存储过程时,此时ibatis具有更好的可控性,因此 性能优于hibernate

  2.同样需求下,由于hibernate会自动生成hql 语句,而ibatis需要手动写sql 语句,此时hibernate性能优于ibatis。

 


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

  Spring是一个开源框架,处于MVC中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次他提升了性能,因为通过依赖倒置(IOC),系统中用到的对象不在是系统加载是就全部实例化,

 


十七、线程同步,并发操作怎么控制 
十八、描述struts的工作流程。 
十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制 
二十、关于Cache(Ehcache,Memcached) 
二一、sql的优化相关问题 
二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查? 
二三、如何分析ORACLE的执行计划? 
二四、 DB中索引原理,种类,使用索引的好处和问题是什么? 
二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。 
二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

posted @ 2016-10-27 18:14  夏文杰  阅读(309)  评论(0编辑  收藏  举报