这套面试题主要目的是帮助那些尚未java软件开发实际工做经验,而正在努力寻找java软件开发工做的学生在笔试/面试时更好地赢得好的结果。因为这套试题涉及的范围很泛,很广,很杂,你们不可能一天两天就看完和学完这套面试宝典,即便你已经学过了有关的技术,那么至少也须要半个月的时间才能消化和掌握这套面试宝典,因此,你们应该早做准备,从拿到这套面试宝典之日起,就要坚持在天天闲暇之余学习其中几道题目,日积月累,等到出去面试时,一切都水到渠成,面试时就天然会游刃有余了。前端
答题时,先答是什么,再答有什么做用(怎么用)——100java
若是不会回答,能够说本身的思路(伪代码)——80,能够说一些相关的东西——60;程序员
,能够表示不会这个问题你下一步要作什么——20web
说:不知道,没记住,——0面试
好比说面试官问:给我介绍一下ORM?sql
较好回答:数据库
一、 ORM就是Object Relational Mapping,就是对象关系映射;编程
二、 做用:咱们在写程序的时候,用的是面向对象的方法,可是在关系型数据库里,存的是一条条的记录;为了用纯面向对象的思想解决问题,因此须要将程序中的对象和数据库中的记录创建起映射关系,ORM就是将对象和数据库中的记录创建起映射的技术;api
答案要井井有条,条理清晰,从这些表面的东西也能够看出一我的的习惯、办事风格、条理、思惟逻辑性等。数组
答题不局限于什么格式和形式,就是要将本身的掌握的技术内容展示出来,好比能够采用举例的说法:
须要特别注意的是,由于面试官自己水平良莠不齐,不要由于人家题目问的模棱两可(或者题目问的不许确),你就内心胆怯和没底气了,不敢回答了。你要大胆地提出对方题目中你不清楚的地方,但愿对方能从新明确的提出问题?
例如,你能够问:您提的问题,我刚才没有彻底听明白,能不能再说一遍。
在进行技术面试前,提醒你们,必需要准备好项目介绍,即须要准备好你的简历中列的全部项目的项目介绍!
面试时关于项目,面试官常见的问题及回答(以银行柜台系统为例):
l 你给我简要介绍一下银行柜台系统(功能)?
回答时,站在用户的角度来描述系统。
一、简易银行柜台系统是模拟银行柜台的基本功能而作的一个系统。
二、系统分前台和后台部分,前台部分是银行柜台人员操做的,包括:注册登陆模块、开销户模块、账号管理模块、存取钱转帐模块、柜台人员信息管理;后台部分是银行管理者操做的,包括查看日志模块、管理柜台人员信息模块;
三、我主要负责的是前台的所有功能;
l 你详细介绍一下你负责的模块的功能?
问功能的时候,要记住,仍是站在用户角度去描述;
一、我负责的注册登陆模块和柜台人员信息模块其实是管理柜台人员信息的,内容比较简单;
二、开销户模块、账号管理模块、存取钱转帐模块是为银行储户服务的模块。其中开销户就是为储户开户、销户的功能,帐户管理模块就是帮储户冻结账号、修改密码等功能,存取钱转帐模块就是为储户存钱、取钱,帮储户转帐的功能;
l 最容易接的下一个问题:你怎么实现的?
功能套在技术点上,把流程再说一遍! 说业务逻辑;
l 问细节:
记得清楚的说,记不清楚的说思路,说伪代码.
l 这个项目几我的作的?用了多长时间?
一、 这个项目比较小,由2我的合做完成的,我负责的是前台部分;
二、 项目大概用了4天左右的时间;
l 这个项目使用了什么技术?
一、 这个项目使用Struts二、Hibernate3和MySQL
最容易接下来问的是,**技术/框架你是怎么理解的?怎么完成映射的?怎么处理事务?Session是怎么管理的?Struts怎么作数据传输和转换的?
l 你在作这个项目的时候,遇到了什么困难,怎么解决的?
一、 好比在Hiberante的使用,关于表之间关联关系的配置,我开始操做的时候不太熟悉,后来经过查文档、和其余同窗沟通的方式,这个问题也获得了解决;
备注:若是你在这里提到了表之间关联关系的配置,那么这个问题面试官很是有可能接下去就问这个技术问题,因此务必认真准备这个技术问题。
注:基础题是面试官最在乎的,这些内容几乎是0容错的。
一、这两个语句均可以用于跳出循环的;
二、break是停止循环,执行循环体之后的语句,而continue是跳出本次循环,执行下一次循环;
一、能够是char、byte、short、int,不能够是long、String等其余类型;
二、从JDK1.7开始,支持String类型;
Java里采用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而一个汉字也是占用2个字节,因此能够存储中文汉字。
备注:C语言里,char占用1个字节,不用存汉字。
&和&&均可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,则结果为false。
&&还具备短路的功能,即若是第一个表达式为false,则再也不计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,因此不会出现NullPointerException若是将&&改成&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增加,If(x==33 && ++y>0)不会增加
&还能够用做位运算符,当&操做符两边的表达式不是boolean类型时,&表示按位与操做,咱们一般使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
备注:这道题先说二者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来代表本身理解透彻深刻、实际经验丰富。
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须建立了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,因此也称为类变量,不用建立任何实例对象,静态变量就会被分配空间,静态变量就能够被使用了。总之,实例变量必须建立对象后才能够经过这个对象来使用,静态变量则能够直接使用类名来引用。
不能够。由于非static方法是要与对象关联在一块儿的,必须建立一个对象后,才能够在该对象上进行方法调用,而static方法调用时不须要建立对象,能够直接调用。也就是说,当一个static方法被调用时,可能尚未建立任何实例对象,若是从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪一个对象上的呢?这个逻辑没法成立,因此,一个static方法内部发出对非static方法的调用。
(单独把一个东西说清楚,而后再说清楚另外一个,这样,它们的区别天然就出来了,混在一块儿说,则很难说清楚)
==操做符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操做符。
若是一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象自己占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另外一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,若是要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就须要用==操做符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就比如去比较两我的的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句建立了两个对象,而后用a,b这两个变量分别指向了其中一个对象,这是两个不一样的对象,它们的首地址是不一样的,即a和b中存储的数值是不相同的,因此,表达式a==b将返回false,而这两个对象中的内容是相同的,因此,表达式a.equals(b)将返回true。
在实际开发中,咱们常常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
若是一个类没有本身定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码以下:
boolean equals(Object o){
return this==o;
}
这说明,若是一个类没有本身定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操做符,也是在比较两个变量指向的对象是不是同一对象,这时候使用equals和使用==会获得一样的结果,若是比较的是两个独立的对象则总返回false。若是你编写的类但愿可以比较该类建立的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你本身写代码来决定在什么状况便可认为两个对象的内容是相同的。
注意hashcode,及相关的Comparable和Comparator接口。
一、int是基本数据类型,Integer是包装类;
二、int的默认值是0,Interger的默认值是null;
这四个做用域的可见范围以下表所示。
说明:若是在修饰的元素上面没有写任何访问修饰符,则表示friendly。
做用域 当前类 同一package 子孙类 其余package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
备注:只要记住了有4种访问权限,4个访问范围,而后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
Overload是重载的意思,Override是覆盖的意思,也就是重写。
重载是指在一个类里,方法名相同,参数不一样;
重写是指子类继承父类,子类里从新编写了父类中的同名(同参数)方法,也就是覆盖了父类的方法;
不是!由于重载必需要求参数列表不一样!
接口能够继承接口。抽象类能够实现(implements)接口,抽象类是否可继承具体类。
备注:只要明白了接口和抽象类的本质和做用,这些问题都很好回答。
只有记住抽象类与普通类的惟一区别就是不能建立实例对象和容许有abstract方法。
一、面向对象有封装、继承 、抽象、多态等4个主要的特征。
二、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不但愿公开的,或者说被其余对象访问的,因此咱们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),经常使用的是get、set方法,能够操做这些被隐藏的属性,其余类能够经过调用这些方法,改变隐藏属性的值!
下面的回答是更高要求,不须要学生必须掌握:
封装是保证软件部件具备优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变更影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。
三、抽象:抽象就是找出一些事物的类似和共性之处,而后将这些事物归为一个类,这个类只考虑这些事物的类似和共性之处,而且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。
四、继承:在定义和实现一个类的时候,能够在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中能够加入若干新的内容,或修改原来的方法使之更适合特殊的须要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提升了软件的可重用性和可扩展性。
五、多态:多态就是在声明时使用父类,在实现或调用时使用具体的子类;即不修改程序代码就能够改变程序运行时所绑定的具体代码,让程序能够选择多个运行状态,这就是多态性,多态加强了软件的灵活性和扩展性。这里能够举个例子,好比声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。
多态依赖于向上转型和后期绑定。
一、抽象类里面能够用普通方法,而接口中的方法所有都是抽象的;
二、在应用范围上来讲,接口每每在程序设计的时候,用来定义程序模块的功能,方便各模块协同工做;抽象类是对类似类进行抽象,造成一个抽象的父类可供重用!
一、String是个类,不是基本数据类型;
二、基本数据类型包括byte、int、char、long、float、double、boolean和short。
一、String是个不可变长度的字符串,而StringBuffer是个可变长度的字符串;
二、在对String类进行操做的时候(例如增长字符),其实是在内存中产生了一个新的String对象; 而StringBuffer是给原对象增长字符,不是新建立一个对象;
三、StringBuilder是线程非安全的,StringBuffer是线程安全的,两者的方法都是同样的。
数组没有length()这个方法,有length的属性。String有length()这个方法。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示老是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,能够覆盖此方法提供垃圾收集时的其余资源回收,例如关闭文件等。JVM不保证此方法总被调用
全部异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。Error 表示恢复不是不可能但很困难的状况下的一种严重问题。好比说内存溢出。不可能期望程序能处理这样的状况。Exception 表示一种设计或实现问题。也就是说,它表示若是程序运行正常,从不会发生的状况。
Exception表示程序还可以克服和恢复的问题,其中又分为系统异常(RuntimeException)和普通异常,系统异常是软件自己缺陷所致使的问题,也就是软件开发人员考虑不周所致使的问题,软件使用者没法克服和恢复这种问题,但在这种问题下还可让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所致使的问题,是用户可以克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不该该死掉。
java为系统异常和普通异常提供了不一样的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,因此普通异常也称为checked异常,而系统异常能够处理也能够不处理,因此,编译器不强制用try..catch处理或用throws声明,因此系统异常也称为unchecked异常。
常见异常好比:
1、空指针异常;
2、数组下标越界;
3、类型转换异常;
4、算数异常,例如除数为零;
5、IO异常,好比说找不到文件;
6、找不到类异常;
7、sql异常,例如sql语句不能正常运行;
8、…
一、是程序执行流的最小单元。在单个程序中同时运行多个线程完成不一样的工做,称为多线程。
二、开始时:就绪状态,等待cpu调用后进入运行状态,运行过程当中遇到阻塞事件,进入阻塞状态,等待阻塞事件结束后,从新进入就绪状态;若是没有阻塞事件,运行结束后,则进入结束状态。
sleep就是暂停当前线程一段时间,把cpu让给其余线程使用,到时后会自动恢复。调用sleep不会释放对象锁。 wait方法致使本线程放弃对象锁,进入等待,只有等到本对象的notify方法(或notifyAll)后本线程才进入就绪状态,等待执行。
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
启动一个线程是调用start()方法,使线程就绪状态,之后能够被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
一、Set是无序的,元素不可重复;List是有序的,元素能够重复;
二、List存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的);
一、HashMap和Hashtable都完成了Map接口;
二、HashMap非线程安全的,而Hashtable是线程安全的,缘由是Hashtable里面的方法使用Synchronize关键字修饰的;
三、由于Hashtable使用了Synchronize关键字修饰,其性能比较差;(具体缘由不作详细说明)
一、ArrayList和LinkedList都完成了List接口;
二、ArrayList底层是用数组实现的,而LinkedList使用链表实现的;
三、ArrayList在插入、删除时,须要移动数组元素,故性能较差;可是在按下标访问时,由于是连续的数组,因此查询速度快;LinkedList正好相反,新增删除较快,而按下标访问时较慢。
字节流继承于InputStream、OutputStream,字符流继承于Reader 、Writer。
字节流的读写单元为字节或字节数组,字符流的读写单元为字符或字符数组(字符串)。
咱们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其余计算机,这个过程咱们能够本身写代码去把一个java对象变成某个格式的字节流再传输,可是,jre自己就提供了这种支持,咱们能够调用OutputStream的writeObject方法来作,若是要让java 帮咱们作,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才能够被writeObject方法操做,这就是所谓的序列化。须要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有须要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,若是对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。若是对象要通过分布式系统进行网络传输或经过rmi等远程调用,这就须要在网络上传输对象,被传输的对象就必须实现Serializable接口。
一、泛型
二、For-Each循环
三、自动装包/拆包
四、枚举
五、静态导入
六、Annotation
一、避免在开发程序的时候,建立出一个类的多个实例(占用空间,性能问题),因此使用单例模式,保证该类只建立一个对象;
二、通常单例模式一般有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回本身的实例;实行形式有两种,懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
能够,但在应用的时候,须要用本身的类加载器去加载,不然,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈做用不一样的内存,通常用于存放不放在当前方法栈中的那些数据,例如,使用new建立的对象都放在堆里,因此,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
一、B/S:浏览器 服务器模式;
二、C/S:客户端 服务器模式;
一、在web.xml里为每个Servlet配置初始化参数;
二、经过ServletConfig对象实现对Servlet初始化对象的获取;
一、Ajax是采用了异步请求的方式,解决了页面无刷新式提交的问题,改善了页面的用户体验效果;经常使用在google地图,注册时用户名重复性校验,百度搜索下拉列表框;
二、经常使用的Ajax框架:底层框架:JQuery、Prototype;高层框架:DWR、DOJO、EXTJS、YUI;
Get和Post都是提交表单的方式之一;
一、get方式表单中的数据放到HTTP数据包的头部,post方式放到body中;
二、get方式提交后,数据会在地址栏中显示出来,而post方式不会,因此post更安全;
三、get方式在提交数据的时候,数据长度是有限制的;而post方式在理论上对提交数据的大小是无限制的;
四、get提交表单永远使用字符方式提交;而post方式提交表单能够是字节方式也能够是字符方式
Servlet生命周期包括加载和实例化、初始化、处理请求以及服务结束;
Servlet生命周期是由容器进行管理的,不能够被程序员手工销毁;
Servlet被服务器实例化后(用户第一次访问该Servlet时),容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
一、forward是请求转发,而reditect是重定向;
二、请求转发是服务器将客户端的请求转发到另外一个地址去处理,而后将响应返回给客户端;其实是1次请求,1次响应,对客户端而言是透明的;而重定向是服务器根据客户端发来的请求,返回给一个客户端一个新的地址,客户端根据这个返回的地址再发送请求,获得响应;其实是2次请求,2次响应,并且客户端的地址是第二次访问的地址;
三、转发只能转发到本身的资源,重定向无限制。
JSP共有如下9个内置的对象:
request 用户端请求
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application
out 用来传送回应的输出
config
page JSP网页自己
exception页面中的异常和错误
一、Session和Cookie都是会话跟踪技术;
二、Session是保存在服务器端的技术(保持用户登陆状态的检查经常使用Session),而Cookie是保存在客户端的技术;
三、Cookie只能存字符串,Session能够存对象;
一、静态包含属于编译期包含(包含页面和被包含的页面在编译期造成一个jsp文件),动态包含属于运行期包含(包含页面和被包含的页面分别编译成两个文件,而后运行时把两个文件组装起来);
二、动态包含能够带参数;
重要备注:此数据库部分面试题不含SQL语句(含各种函数)面试具体的题目,关于SQL语句的使用,请学生本身准备!
数据定义:create Table,Alter Table,Drop Table, Create/Drop Index等(学生须要了解)
数据操纵:select ,insert,update,delete(这个最重要,学生须要开展学习准备)
数据控制:grant,revoke
经常使用的数据库对象包括:表、视图、索引、函数、存储过程、触发器等。
一、视图是一个虚拟表,是由查询语句产生的,不是真实存在的表;同真实的表同样,视图包含一系列带有名称的列和行数据。
二、它主要出于两种缘由:
首先是简化查询,将复杂查询封装到视图中,使用者只需用简单查询从视图中提取数据。
另一个是安全缘由, 视图能够隐藏一些数据,如:员工信息表,能够用视图只显示姓名,年龄、性别等通用信息,而隐藏工资等敏感信息。还需经过受权屏蔽用户(含开发人员)对基表的访问,而对试图开放访问权限,这样才能完全屏蔽敏感数据。
一、索引是一种特殊的查询表,简单的理解就是在数据库中,将数据按必定的顺序进行排列(分物理索引:只有1个 和逻辑索引:能够有多个),查询的时候,能够有效提升查询速度。
二、若是一个表要频繁的进行添加和删除记录的操做(不是查询),不建议创建多个索引,由于添加和删除记录,都须要调整索引,增长数据库负担,影响性能。
一、游标是对查询出来的结果集进行处理的一个对象,游标至关于一个定位器,能够定在该集合中的特定行,从而能够先后移动游标来处理某一行数据。
一、事务是一系列的数据库操做,是数据库应用的基本逻辑单位,事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操做组成。
二、事务具备以下特性:(其中原子性最为重要,必须掌握)
原子性(atomicity) 一个事务是一个不可分割的工做单位,事务中包括的诸操做要么都作,要么都不作。
一致性(consistency) 事务必须是使数据库从一个一致性状态变到另外一个一致性状态。
隔离性(isolation) 一个事务的执行不能被其余事务干扰。即一个事务内部的操做及使用的数据对并发的其余事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability) 持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其余操做或故障不该该对其有任何影响。
日志的做用是记录全部对数据库数据的修改,主要是保护数据库以防止故障发生后,对数据库进行恢复;
一、主键和外键是用来创建数据库表之间关联关系的;
二、举例来讲,有一个学生表(学生学号、姓名、班级编号等信息)和一个班级表(班级编号、班级名称),经过编辑编号创建班级表和学生表之间一对多的关联,则班级表中班级编号是主键,学生表中的班级编号是外键。
一、数据库中的存储过程是用于定义的一系列的sql语句的集合(含控制语句),涉及特定表和其余对象的任务,用户能够调用存储过程(有些相似java里的方法);
二、触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,好比当对一个表进行操做( insert,delete, update)时就会激活它执行。
三、存储过程的好处:
SQL语句已经预编绎过了,所以运行的速度比较快;
经常使用功能的集合,提升了重用性;
用户只须要调用存储过程,不须要逐个写存储过程当中的语句,减小了数据传输量;
一、内链接是保证两个表中全部的行都要知足链接条件,而外链接则否则。
二、在外链接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另外一个表的行。分左链接、右链接、全链接(笛卡尔集)三种。
一、数据库链接池技术,在程序启动时会创建必定数量的数据库链接(也称为池链接),并一直维持很多于此数目的池链接。
二、客户端程序须要链接数据库时,数据库链接池会返回一个空闲的池链接给数据库使用。若是当前没有空闲链接,数据库链接池就新建必定数量的链接。当使用的池链接调用完成后,链接池将此链接标记为空闲(回收),其余调用就可使用这个链接。这样作的目的是提升了应用程序访问数据库的性能。
一、MySQL:3306
二、Oracle:1521
三、SQL Server:1433
在SQL Server中使用TOP分页,
在Oracle中用ROWNUM,或分析函数ROW_NUMBER,
在MySQL中用Limit。
一、先优化SQL语句;
二、表级别优化:好比说创建索引;
三、数据库级别优化:好比说数据库参数设置,例如链接池数量;
一、加载JDBC驱动程序;
二、建立数据库的链接;
三、建立一个Statement对象;
四、执行SQL语句;
五、返回并处理结果(有多是结果集,有多是影响行数);
六、关闭链接;
一、PreparedStatement是Statement的子接口;
二、PreparedStatement有绑定参数的功能,避免SQL注入,安全性更好;
三、PreparedStatement对SQL语句有预编译的功能,因此性能更好;——由于SQL是须要进行数据库权限验证、解析为关系代数和执行过程
一、有DOM,SAX等
二、DOM:处理大型文件时性能比较差,缘由是DOM须要把整个文档装入内存,适合对XML的随机访问;
三、SAX:是事件驱动型的XML解析方式,它顺序读取XML文件,不须要一次所有装载整个文件,当遇到像文档开头、文档结束或标签开头和结束时,会触发一个事件,用户能够进行处理;
一、配置文件中使用XML文档;
二、XML是标准的文件传输格式,异构系统数据交换常采用XML;
一、M:Model 模型层 主要用来处理业务逻辑,承载数据;
二、V:View 视图层 主要用来作页面显示的
三、C:Control 控制层 主要用来进行业务流程控制;
四、经常使用的MVC框架包括:Struts、Struts二、SpringMVC;
备注:下面的描述必须转换成本身的语言进行表述!!!这道题很是重要,面试官关于Struts的不少问题均可以从本题中找到答案。
一、Struts是一个应用于Web层的MVC框架;
二、以ActionServlet做为核心控制器,接收用户全部请求,并将请求分发到不一样的Action中进行处理,并将响应结果返回给客户端;
三、咱们能够在web.xml文件中将符合某种特征的全部请求交给这个核心控制器进行处理,这个狠心控制器再参照一个配置文件(一般为/WEB-INF/struts-config.xml)将各个请求分别分配给不一样的Action去处理。
四、ActionServlet把请求交给Action去处理以前,会将请求参数封装成一个formbean对象。
备注:若是面试官须要解释一下formbean,则按以下思路回答:
ActionServlet把formbean对象传递给action的execute方法以前,可能会调用formbean的validate方法进行校验,只有校验经过后才将这个formbean对象传递给action的execute方法,不然,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)做者为何将这里命名为input属性,而不是error属性,咱们后面结合实际的运行效果进行分析。
五、Action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象经过struts-config.xml配置文件中的配置关联到某个jsp页面,由于程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样能够实现action程序代码与返回的jsp页面名称的解耦。
备注:下面的描述必须转换成本身的语言进行表述!!!这道题很是重要,面试官关于Struts2的不少问题均可以从本题中找到答案。
一、客户端发送一个指向Servlet容器(例如Tomcat)的请求
二、这个请求通过一系列的过滤器(Filter)
三、接着FilterDispatcher被调用,将request中所携带的数据放入值栈(ValueStack);
四、 FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个Action,把请求的处理交给ActionProxy;
五、 ActionProxy经过Configuration Manager询问框架的配置文件(struts.xml),找到调用的Action类;
六、 ActionProxy建立一个ActionInvocation的实例;
七、 ActionInvocation在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用;
八、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果(JSP显示结果)。
备注:下面的描述必须转换成本身的语言进行表述!!!
一、都是MVC的WEB框架;
二、struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter;
三、struts1的action须要继承Action类,struts2的action能够不继承任何类;struts1对同一个路径的全部请求共享一个Action实例,struts2对同一个路径的每一个请求分别使用一个独立Action实例对象,全部对于struts2的Action不用考虑线程安全问题。
四、在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。
五、struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,能够指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验。
优势:
1、 框架是一个半成品,将不少开发中的常见任务都已经封装好,好比请求参数到javaBean的转换,这样能够减轻程序开发的工做量,提高开发效率;
2、 struts框架实现了MVC模式,规范了代码结构,提升了代码可维护性;
3、 有丰富的页面标签能够用 ,能大大简化页面的开发;
一、实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现;
二、有丰富的tag能够用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提升开发效率;
三、经过配置文件,使系统的脉络更加清晰。一个配置文件,便可把握整个系统各部分之间的联系,这对于后期的维护有着很大的好处。
四、Struts提供了两周异常处理方式,声明式异常处理和编程式异常处理——此处学生须要本身多看看相关资料,可以进一步回答面试官问题;
五、对国际化进行支持,支持I18N;
缺点:
一、实现MVC模式,代码复杂度提高;
二、须要维护配置文件,比较麻烦;
一、Hibernate是一个操做数据库的框架,实现了对JDBC的封装;
二、Hibernate是一个ORM框架,咱们在写程序的时候,用的是面向对象的方法,可是在关系型数据库里,存的是一条条的记录;为了用纯面向对象的思想解决问题,因此须要将程序中的对象和数据库中的记录创建起映射关系,ORM就是将对象和数据库中的记录创建起映射的技术,而Hibernate就是这样一个ORM框架;
三、Hibernate简化了代码编写,原来JDBC须要写一堆代码完成的功能,Hibernate须要少许的代码便可以实现;
四、Hibernate屏蔽了数据库的差别,增长了对不一样数据库的可移植性(经过方言);
五、使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、获取/建立Session对象,启动事务,完成CRUD操做,提交事务,关闭Session对象;
六、使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库链接信息和方言等,还要为每一个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中须要登记每一个hbm.xml文件。
一、update针对的是已存在的实体对象,数据库中若是没有实体所对应的数据记录,将会抛出异常;
二、saveOrUpdate()对象存在与否都不会有任何影响,有则更新,没则插入。
一、瞬时态:用new建立的对象,它没有被持久化,没有处于Session中,处于此状态的对象叫临时对象;
二、持久态:已经持久化,拥有持久化标识,在数据库中有一条对应的数据;同时它处于Session上下文中。如经过Session的save方法,能够将对象从瞬时态转换为持久态;从数据库中加载出来的数据也是持久态的,关联加载出的对象也是持久态的。
三、游离态(托管态): 持久化对象脱离了Session以后就是游离态,Session缓存被清空后的对象。特色:曾经被持久化,拥有持久化标识,在数据库中有对应的数据条目,但不在Session缓存中。处于此状态的对象叫游离对象;游离态的对象经过Session的saveOrUpdate或者update方法从新回到持久态。
一、get()采用当即加载方式;而load()采用延迟加载;
二、get()方法执行的时候,会当即向数据库发出查询语句,而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句;
三、若是数据库中没有对应的记录,get()方法返回的是null。而load()方法出现异常ObjectNotFoundException 。
一、Hibernate是一个全自动的orm映射工具,它能够自动生成sql语句;ibatis须要咱们本身在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大不少。由于hibernate自动生成sql语句,咱们没法控制该语句,咱们就没法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate能够很好帮咱们完成,可是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,由于ibatis仍是由咱们本身写sql语句;
二、相同点:屏蔽jdbc api的底层访问细节,使用咱们不用与jdbc api打交道,就能够访问数据。
三、jdbc api编程流程固定,还将sql语句与java代码混杂在了一块儿,常常须要拼凑sql语句,细节很繁琐。
四、ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。
一、按照如下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为何还要有二级缓存,(3)最后再说如何配置Hibernate的二级缓存。
2.一、缓存就是把之前从数据库中查询出来和使用过的对象保存在内存中,当之后要使用某个对象时,先查询缓存中是否有这个对象,若是有则使用缓存中的对象,若是没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。
2.二、Hibernate中Session内置了一种缓存,咱们一般将之称为Hibernate的一级缓存(Session级别的),当想使用session从数据库中查询出一个对象时,Session也是先从本身内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在本身内部。因为Session表明一次会话过程,一个Session与一个数据库链接相关连,因此Session最好不要长时间保持打开,一般仅用于一个事务当中,在事务结束时就应关闭。
2.三、二级缓存是SessionFactory级别的缓存,能被此SessionFactory里的全部Session共享。多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一个厂家的缓存产品,接着须要配置该缓存产品本身的配置文件,最后要配置Hibernate中的哪些实体对象要归入到二级缓存的管理中。
一、AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),能够经过预编译方式和运行期动态代理实如今不修改源代码的状况下给程序动态统一添加功能的一种思想。
二、利用AOP能够对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度下降,提升程序的可重用性,同时提升了开发的效率。 当项目中须要编写大量相同功能重复代码时,能够考虑使用AOP的形式来实现。如声明式事务管理、权限校验等。
备注:若是面试官问你是否用过AOP,必定要说用过(Spring的事务处理机制就是AOP的思想来实现的)——很是重要!!!
1、 IOC:原来咱们对依赖的对象的建立是由主对象来完成的,如今由IOC容器来建立对象并管理对象间的依赖关系,由于控制权从本质上发生了转变,因此咱们称之为控制反转。(这样带来的好处是,下降代码的耦合度,更加符合开闭原则;)
2、 DI和IOC是相同的概念,不一样的表述,它侧重描述了容器的行为——建立对象并为对象装配其依赖的对象。
备注:学生须要知道怎么在配置文件里配置相关信息,面试官可能会问。
一、Set注入
二、构造器注入
一、singleton