java工程师找工作中面试遇到的专业知识问题总结.docx
《java工程师找工作中面试遇到的专业知识问题总结.docx》由会员分享,可在线阅读,更多相关《java工程师找工作中面试遇到的专业知识问题总结.docx(17页珍藏版)》请在冰点文库上搜索。
java工程师找工作中面试遇到的专业知识问题总结
java工程师找工作中面试遇到的专业知识问题总结
篇一:
java工程师面试总结
一.@autowired和@resource的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。
如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2.如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
final可用来修饰类,变量,方法。
修饰变量:
final修饰变量时,表示该变量一旦获得了初始值之后就不可改变。
1.修饰成员变量:
与普通成员变量不同的是,final成员变量(实例属性和类属性)必须由程序员显示初始化,系统不会对final成员变量进行隐式初始化。
非final修饰的成员变量初始化过程:
当进行静态初始化时,可对类属性初始化,当执行普通初始化块,构造器时可对实例属性初始化,因此:
非final成员变量的初始值,可以在定义该变量时指定初始值,可以在初始化块,构造器中执行初始化值,否则成员变量的初始值是由系统自动分配的初始值。
final修饰的类属性,实例属性指定初始值的地方:
类属性:
静态初始化块,声明该属性时指定初始值。
实例属性:
非静态初始化块,构造器,声明该属性时指定初始化值。
二.final修饰局部变量:
1.系统不会对局部变量进行初始化,必须由程序员显示初始化。
如果在定义final变量时没有指定初始值,则可以在后面代码中进行对final变量赋初始值,但只能一次,不能重复赋值,,如果final修饰的局部变量在定义时已经指定默认值,则后面的代码中不能再对该变量赋值。
修饰形参不能被赋值,因为形参在调用该方法时,有系统传入的参数来完成初始化。
修饰基本类型变量与引用类型变量的区别:
修饰基本类型变量时,不能对基本变量重新赋值,因为基本类型变量不能被改变。
修饰引用类型变量时,仅仅保持的是这个引用所引用的地址不会改变,既一直引用同一个对象。
但这个对象完全可以改变(对象的属性)
例如:
finalpersonp=newperson();
//改变person对象的age属性,合法。
(23);
//对p引用重新赋值,不合法。
p=null;
注意:
如果final修饰变量是基本数据类型,且在编译时就可以确定该变量的值,于是把该变量当做常量来处理:
常量命名规则:
多个有意义的单词连接,所有字符大写,单词之间用下划线分割。
如果final修饰变量是引用类型,final变量无法在编译时就获得值,而必须在运行时才能得到值如:
finalTestClasst=newTestClass();编译时系统不会创建一个TestClass对象赋给t变量,所以t不需要当做常量来处理,无需使用常量命名规则。
方法:
修饰的方法不可被重写。
提供的Object类有一个final方法:
getClass(),因为java不希望任何一个类重写这个方法。
3.对于private方法,仅在当前类中可见,子类无法访问,所以也就无法重写该方法,如果子类中定义了一个与父类private方法有相同方法名,相同形参列表,相同返回值类项的方法,也不是方法重写,只是重新定义了一个方法,因此使用final修饰的一个private访问权限的方法,依然可以在其子类中定义与该方法有相同方法名,相同形参列表,相同返回值类型的方法。
修饰的方法不能被重写但完全可以被重载。
类:
修饰的类不可有子类,类就是一个final类,它不可以有子类。
三JQuery绑定事件的方法
.bind()
$('a').bind('click',function(){alert("Thattickles!
")});
这是最直接的绑定方法。
jQuery扫描文档找到所有$(‘a’)元素,然后给每一个找到的元素的click事件绑定处理函数。
.live()
$('a').live('click',function(){alert("Thattickles!
")});
Query绑定处理函数到$(document)元素,并把‘click’和‘a’作为函数的参数。
有事件冒泡到document节点的时候,检查这个事件是不是click事件,targetelement能不能匹配‘a’css选择器,如果两个条件都是true,处理函数执行。
.delegate()
$('#container').delegate('a','click',function(){alert("Thattickles!
")});jQuery扫描文档找到$(‘#container’),绑定处理函数到他的click事件,’a’css选择器作为函数的参数。
当有事件冒泡到$(‘#container’),检查事件是不是click,并检查targetelement是不是匹配css选择器,如果两者都符合,执行函数。
注意这次和.live()方法很相似,除了把事件绑定到特定元素与跟元素的区别。
精明的JS’er或许会总结成$(‘a’).live()==$(document).delegate(‘a’),真的是这样吗?
不,不全是。
四。
spring事务管理
Spring+Hibernate的实质:
就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,
都交给Spring管理。
那么再没整合之前Hibernate是如何实现事务管理的呢?
通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。
一.事务的4个特性:
原子性:
一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。
一致性:
数据不会因为事务的执行而遭到破坏。
隔离性:
一个事务的执行,不受其他事务(进程)的干扰。
既并发执行的个事务之间互不干扰。
持久性:
一个事务一旦提交,它对数据库的改变将是永久的。
二.事务的实现方式:
实现方式共有两种:
编码方式;声明式事务管理方式。
基于AOP技术实现的声明式事务管理,实质就是:
在方法执行前后进行拦截,然后在目标方法开始之
前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
声明式事务管理又有两种方式:
基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。
三.创建事务的时机:
是否需要创建事务,是由事务传播行为控制的。
读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。
一种常见的事务管理配置:
事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式。
五。
oracle通用函数
sum(),max(),min(),count(),decode(),case,avg(),to_date(),
如nvl(字段,‘x’)字段值等于null就这个函数得到的结果就是'x',
ABS(x)函数,此函数用来返回一个数的绝对值。
CEIL(x)函数,用来返回大于或等于X的最小整数。
FLOOR(x)函数,用来返回小于或等于X的最大整数。
ROUND(x[,y])函数,返回舍入到小数点右边Y位的X值。
Y缺省为0,这将X舍入为最接近的整数。
如果Y是负数,那么舍入到小数点左边相应的位上,Y必须为整数。
SelectCONVERT(varchar(100),GETDATE(),23):
XX-05-16
CONVERT(data_type(length),data_to_be_converted,style)data_type(length)规定目标数据类型(带有可选的长度)。
data_to_be_converted含有需要转换的值。
style规定日期/时间的输出格式。
六.oracle存储过程
1.存储过程异常处理
createorreplaceprocedurepeace_insert(c_ninvarchar2)
is
errorEXCEPTION;
begin
ifc_n='OK'
then
insertintocourse(course_name)values(c_n);
elsifc_n='NG'then
insertintocourse(course_name)values(c_n);
raiseerror;
else
Dbms__line('c_n'||c_n);
endif;
commit;
exception
whenerrorthen
rollback;
Dbms__line('ERRO');
end;
关于游标if,for的例子
createorreplaceprocedurepeace_if
is
cursorvar_cisselect*fromgrade;
begin
fortempinvar_cloop
if_name='OS'then
dbms__line('Stu_name='||_name);
elsif_name='DB'then
dbms__line('DB');
else
dbms__line('fenglafengla');
endif;
endloop;
end;
---关于游标for,case的例子1
createorreplaceprocedurepeace_case1
is
cursorvar_cisselect*fromtest_case;
begin
fortempinvar_cloop
case
when1then
dbms__line('haha1');
when2then
dbms__line('haha2');
when3then
dbms__line('haha3');
when4then
dbms__line('haha4');
else
dbms__line('qita');
endcase;
endloop;
end;
七。
java对象作用范围
Java对象的生命周期大致包括三个阶段:
对象的创建,对象的使用,对象的清除。
因此,对象的生命周期长度可用如下的表达式表示:
T=T1+T2+T3。
其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间。
由此,我们可以看出,只有T2是真正有效的时间,而T1、T3则是对象本身的开销。
下面再看看T1、T3在对象的整个生命周期中所占的比例。
我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用。
另外,默认情况下,调用类的构造函数时,Java会把变量初始化成确定的值:
所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成,逻辑值设置成false。
所以用new关键字来新建一个对象的时间开销是很大的,如表1所示。
表1一些操作所耗费时间的对照表
运算操作示例标准化时间
本地赋值i=n
实例赋值=n
方法调用Funct()
新建对象NewObject()980
新建数组Newint[10]3100
从表1可以看出,新建一个对象需要980个单位的时间,是本地赋值时间的980倍,是方法调用时间的166倍,而若新建一个数组所花费的时间就更多了。
再看清除对象的过程。
我们知道,Java语言的一个优势,就是Java程序员勿需再像C/C++程序员那样,显式地释放对象,而由称为垃圾收集器(GarbageCollector)的自动内存管理系统,定时或在内存凸现出不足时,自动回收垃圾对象所占的内存。
凡事有利总也有弊,这虽然为Java程序设计者提供了极大的方便,但同时它也带来了较大的性能开销。
这种开销包括两方面,首先是对象管理开销,GC为了能够正确释放对象,它必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。
其次,在GC开始回收“垃圾”对象时,系统会暂停应用程序的执行,而独自占用CPU。
因此,如果要改善应用程序的性能,一方面应尽量减少创建新对象的次数;同时,还应尽量减少T1、T3的时间,而这些均可以通过对象池技术来实现。
实现一个对象池,一般会涉及到如下的类:
1)对象池工厂(ObjectPoolFactory)类
该类主要用于管理相同类型和设置的对象池(ObjectPool),它一般包含如下两个方法:
createPool:
用于创建特定类型和设置的对象池;
destroyPool:
用于释放指定的对象池;
同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见下述getInstance方法的实现:
publicstaticObjectPoolFactorygetInstance(){if(poolFactory==null)
篇二:
我常用的十个中级java工程师面试题
1,如何理解多态?
类与对象的区别是什么?
2,如何理解()方法,它的作用是什么?
3,Collections类的作用?
Arrays类的作用?
4,问号,星号,加号在正则中分别表示什么?
成对的小括号在正则表达式里的作用是什么?
5,JSP文件与JAVA文件的区别
6,forward和redirect的区别
7,oracle:
A表有10条记录,以下查询可以查出几条?
select*fromAwhererownum>5
8,mysql有几种索引类型?
使用索引时都有那些地方要注意?
sql优化原则?
mysql用那个关键字分析sql语句性能?
9,
publicstaticvoidtest(Stringstr){
str="hello";
}
publicstaticvoidmain(Stringargs[]){
Stringstr="beijing";
test(str);
sysout(str);//这里输出什么?
}
10,linux下
ulimit,scp,less命令的作用分别是什么?
文件重命名的命令是什么?
篇三:
java软件工程师面试常见问题
1、面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。
对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4.多态性:
多态性是指允许不同类的对象对同一消息作出响应。
多态性包括参数化多态性和包含多态性。
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2、String是最基本的数据类型吗
基本数据类型包括byte、int、char、long、float、double、boolean和short。
类是final类型的,因此不可以继承这个类、不能修改这个类。
为了提高效率节省空间,我们应该用StringBuffer类
3、int和Integer有什么区别
Java提供两种不同的类型:
引用类型和原始类型(或内置类型)。
Int是java的原始数据类型,Integer是java为int提供的封装类。
Java为每个原始类型提供了封装类。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。
引用类型和原始类型具有不同的特征和用法,它们包括:
大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。
对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。
4、String和StringBuffer的区别
JAVA平台提供了两个类:
String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。
这个String类提供了数值不可改变的字符串。
而这个StringBuffer类提供的字符串进行修改。
当你知道字符数据要改变的时候你就可以使用StringBuffer。
典型地,你可以使用StringBuffers来动态构造字符数据。
5、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
6、说出Servlet的生命周期,并说出Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
7、说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许
直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历
8、EJB是基于哪些技术实现的?
并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
EJB包括SessionBean、EntityBean、MessageDrivenBean,基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。
EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
SessionBean还可以再细分为StatefulSessionBean与StatelessSessionBean,这两种的SessionBean都可以将系统逻辑放在method之中执行,不同的是StatefulSessionBean可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的StatefulSessionBean的实体。
StatelessSessionBean虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫StatelessSessionBean的时候,EJBContainer并不会找寻特定的StatelessSessionBean的实体来执行这个method。
换言之,很可能数个使用者在执行某个StatelessSessionBean的methods时,会是同一个Bean的Instance在执行。
从内存方面来看,StatefulSessionBean与StatelessSessionBean比较,StatefulSessionBean会消耗J2EEServer较多的内存,然而StatefulSessionBean的优势却在于他可以维持使用者的状态。
9、Collection和Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
10、&和&&的区别。
&是