以下为本人面试时遇到的问题总结,本人是刚毕业,所以问题深度不够,当然也只适合实习或刚毕业的人看,大概了解下。
首先要看完张孝祥老师总结的面试题题库,我这里有链接:
1.ibatis中传入多个参数时解决方法:
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 应用服务器。
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了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。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
5.ibatis与mybatis区别:
这个区别不是很大,最主要的区别就是mybatis简化了编码的过程,不需要去写dao的实现类,直接写一个dao的借口,再写一个xml配置文件,整个mybatis就配置好了,也就是数据库就连接好了,然后再service里面调用dao就可以了,但是ibatis则不可以,必须要写dao的实现类,在写个什么return getSqlMapClientTemplate().queryForList()神马的,所以说mybatis是ibatis的升级版本,也就是在这里,不用写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的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
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)
instance=new 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.八种基本数据类型
byte、short、char、int、long、double、float、boolean
17、数据库查询优化举例
a.正确使用union与union all:当使用UNION时,它相当于在结果集上执行SELECT DISTINCT。换句话说,UNION将联合两个相类似的记录集,然后搜索重复的记录并排除。如果你使用UNION联合的两个记录集没有重复记录,那么使用UNION会浪费资源,因为它要寻找重复记录,即使你确定它们不存在。所以如果你知道你要联合的记录集里没有重复,那么你要使用UNION ALL,UNION 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中配置拦截器:
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调用哪个拦截器或拦截器栈,如下例
不需要拦截的方法名
<param name="excludeMethods">不需拦截的方法名以逗号隔开</param>
需要拦截的方法名
<param name="includeMethods">需拦截的方法名以逗号隔开</param>
注:当excludeMethod和includeMethod属性都存在时,则includeMethod属性更高。
拦截器的执行顺序和在struts.xml的配置顺序是有关,也就是说如果a拦截器在b拦截器之前被声明,则会先进入a拦截器,然后进入b拦截器。值得注意的是b拦截器执行之后会回到a拦截器继续执行之后的内容。