java面试总结(一)

    以下为本人面试时遇到的问题总结,本人是刚毕业,所以问题深度不够,当然也只适合实习或刚毕业的人看,大概了解下。

首先要看完张孝祥老师总结的面试题题库,我这里有链接:

1.ibatis中传入多个参数时解决方法:

wKioL1YbeOTh9eOFAAFKTW1OmuI083.jpg

wKiom1YbeOuhqzkRAAKfjc8EZFE547.jpg

wKiom1YbeRLDhMRGAAFlDeCn1Xk893.jpg

wKiom1YbeTqRqd08AALejCbSOBA765.jpg

2.#与$区别:

#是占位符,$字符串拼接。#方式能够很大程度防止sql注入。

1.#是把传入的数据当作字符串,如#field#传入的是id,sql语句生成是这样,order by "id",这当然会报错..

2.$传入的数据直接生成在sql里,如#field#传入的是id,sql语句生成是这样,order by id, 这就对了. 

 $方式一般用于传入数据库对象.例如传入表名.

#方式一般用于传入插入/更新的值或查询/删除的where条件

3.JDK各个版本的新特性:

http://www.cnblogs.com/langtianya/p/3757993.html

4.谈谈对tomcat的了解

Tomcat服务器是一个免费的开放源代码的Web 应用服务器。

TomcatApache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由ApacheSun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

这里的诀窍是,当配置正确时,Apache HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,TomcatIISApacheWeb服务器一样,具有处理HTML页面的功能,另外它还是一个ServletJSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

 

5.ibatismybatis区别

这个区别不是很大,最主要的区别就是mybatis简化了编码的过程,不需要去写dao的实现类,直接写一个dao的借口,再写一个xml配置文件,整个mybatis就配置好了,也就是数据库就连接好了,然后再service里面调用dao就可以了,但是ibatis则不可以,必须要写dao的实现类,在写个什么return getSqlMapClientTemplate().queryForList()神马的,所以说mybatisibatis的升级版本,也就是在这里,不用写dao的实现类,还有些区别就是xml里面的sql语句的写法有些小变化,但是不大。

http://blog.csdn.net/techbirds_bao/article/details/9235309

6.谈谈spring注入方式:

所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

7.谈谈spring的事务:

8.谈谈springMVC:

9.缓存:

10.高并发:

11.JS闭包:

12.冒泡算法

publicclass BubbleSort{

 public static void main(String args[]){

   int[] values={3,1,6,2,9,0,7,4,5};

   sort(values);

   for(int i=0;i<values.length;i++){//排序后打印数组中的元素

     System.out.println("Index: "+i+"  value: "+values[i]);

   }

 }

 public static void sort(int[] values){

   int temp;

   for(int i=0;i<values.length;i++){//趟数

     for(int j=0;j<values.length-i-1;j++){//比较次数

       if(values[j]>values[j+1]){

         temp=values[j];

         values[j]=values[j+1];

         values[j+1]=temp;

       }

     }

   }

 }

}

13.写出一个单例模式:

第一种形式是饿汉式单例类,第二种是懒汉式单例类;可以如此速记,饿汉式太饿了,所以迫不及待在内部new出一个实例,而懒汉式太懒了,所以知道应用时才检查有没有实例存在,如不存在才new一个实例出来。

第一种形式定义一个类,它的构造函数为private的,它有一个staticprivate的该类变量,在类初始化时实例话,通过一个publicgetInstance方法获取对它的引用,继而调用其中的方法。

Public class Singleton {

            private Singleton(){}

            //在自己内部定义自己一个实例,是不是很奇怪?

     //注意这是private 只供内部调用

     private static Singleton instance = new Singleton();

     //这里提供了一个供外部访问本class的静态方法,可以直接访问  

     public static Singleton getInstance() {

     return instance; 

     }

}

第二种形式:

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton getInstance() {

   //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次    

   //使用时生成实例,提高了效率!

     if (instance==null)

   instancenew Singleton();

            return instance; 

    }

}

14.递归求阶乘

long fuction(int n){

   if (n==0) return 1;

else      

     return n* fuction(n-1);   

以下为非递归

long s=1;

for(int i=2;i<=n;i++)

{

      s*=i;

}

15.九大内置对象及作用

request:代表客户端的请求信息;

response:代表对客户端的响应;

session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态;

application对象可将信息存在在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效,比session生命周期更长;

out用于在浏览器内输出信息;

pageContext:页面上下文对象;

config:配置对象;

exception:显示异常信息;

page:页面对象

16.八种基本数据类型

byteshortcharintlongdoublefloatboolean

17、数据库查询优化举例

a.正确使用unionunion all当使用UNION时,它相当于在结果集上执行SELECT DISTINCT。换句话说,UNION将联合两个相类似的记录集,然后搜索重复的记录并排除。如果你使用UNION联合的两个记录集没有重复记录,那么使用UNION会浪费资源,因为它要寻找重复记录,即使你确定它们不存在。所以如果你知道你要联合的记录集里没有重复,那么你要使用UNION ALLUNION ALL联合记录集,但不搜索重复记录。

select语句需要有相同的列数,类似的数据类型,且列的顺序相同,另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

b.尽量不使用select *

c.使用表的别名Alias:当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上,这样可以减少解析的时间并减少那些由Column歧义引起的语法错误。

d.避免使用having子句:HAVING只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序、统计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

e.使用存储过程:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般sql语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

f.建立索引;g.使用缓冲池

18.struts拦截器

在访问struts2中某个action之后或者之前,会自动调用的类,就是struts2中的拦截器,他具有的最大特点就是实现了AOP(面向切面编程),他是可插拔式的,也就是说它可以在需要使用的时候通过配置xml文件来实现,而在不使用的时候又不会影响整个框架的效果,这让struts2的拦截器具有非常好的扩展性。

Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口声明了三个方法分别为init()destroy()iterceptor(ActionInvocation invocation)

struts.xml中配置拦截器:

wKiom1YbeXzxZmxyAAEhQC4hjQQ395.jpg

Interceptor标签即用来声明拦截器,其中有两个属性一个是name用来为声明的拦截器命名,方便以后的调用;另一个为class用来声明拦截器类。

Interceptor-stack即为声明拦截器栈的标签,他有个name属性用来给拦截器栈命名,该标签中可以定义子标签interceptor-ref,用来指定拦截器,其中的name属性即为拦截器或拦截器栈的名称。

package标签下也可以通过填写default-interceptor-ref来指定该package下的所有action中默认的拦截器,但如果action已经指定拦截器或栈则默认的无效。

<default-interceptor-ref name="testInter"></default-interceptor-ref>

在声明好后可以在action中添加interceptor-ref标签可以指定该action调用哪个拦截器或拦截器栈,如下例

wKiom1YbeaSB3he1AAEVKkgjPTk136.jpg

不需要拦截的方法名

<param name="excludeMethods">不需拦截的方法名以逗号隔开</param>

需要拦截的方法名

<param name="includeMethods">需拦截的方法名以逗号隔开</param>

excludeMethodincludeMethod属性都存在时,则includeMethod属性更高。

拦截器的执行顺序和在struts.xml的配置顺序是有关,也就是说如果a拦截器在b拦截器之前被声明,则会先进入a拦截器,然后进入b拦截器。值得注意的是b拦截器执行之后会回到a拦截器继续执行之后的内容。


你可能感兴趣的:(java面试笔试题)