文档库 最新最全的文档下载
当前位置:文档库 › JAVA工程师面试总结

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可用来修饰类,变量,方法。

1.final修饰变量:final修饰变量时,表示该变量一旦获得了初始值之后就不可改变。

1.修饰成员变量:与普通成员变量不同的是,final成员变量(实例属性和类属性)必须由程序员显示初始化,系统不会对final成员变量进行隐式初始化。

非final修饰的成员变量初始化过程:当进行静态初始化时,可对类属性初始化,当执行普通初始化块,构造器时可对实例属性初始化,因此:非final成员变量的初始值,可以在定义该变量时指定初始值,可以在初始化块,构造器中执行初始化值,否则成员变量的初始值是由系统自动分配的初始值。

final修饰的类属性,实例属性指定初始值的地方:

类属性:静态初始化块,声明该属性时指定初始值。

实例属性:非静态初始化块,构造器,声明该属性时指定初始化值。

二.final修饰局部变量:

1.系统不会对局部变量进行初始化,必须由程序员显示初始化。

如果在定义final变量时没有指定初始值,则可以在后面代码中进行对final变量赋初始值,但只能一次,不能重复赋值,,如果final修饰的局部变量在定义时已经指定默认值,则后面的代码中不能再对该变量赋值。

2.final修饰形参不能被赋值,因为形参在调用该方法时,有系统传入的参数来完成初始化。

3.final修饰基本类型变量与引用类型变量的区别:

1.final修饰基本类型变量时,不能对基本变量重新赋值,因为基本类型变量不能被改变。

2.final修饰引用类型变量时,仅仅保持的是这个引用所引用的地址不会改变,既一直引用同一个对象。但这个对象完全可以改变(对象的属性)

例如:final person p=new person();

//改变person对象的age属性,合法。

p.SetAge(23);

//对p引用重新赋值,不合法。

p=null;

注意:如果final修饰变量是基本数据类型,且在编译时就可以确定该变量的值,于是把该变量当做常量来处理:常量命名规则:多个有意义的单词连接,所有字符大写,单词之间用下划线分割。

如果final修饰变量是引用类型,final变量无法在编译时就获得值,而必须在运行时才能得到值如:final TestClass t=new TestClass();编译时系统不会创建一个TestClass对象赋给t变量,所以t不需要当做常量来处理,无需使用常量命名规则。

4.final方法:

1.final修饰的方法不可被重写。

2.java提供的Object类有一个final方法:getClass(),因为java 不希望任何一个类重写这个方法。

3.对于private方法,仅在当前类中可见,子类无法访问,所以也就无法重写该方法,如果子类中定义了一个与父类private方法有相同方法名,相同形参列表,相同返回值类项的方法,也不是方法重写,只是重新定义了一个方法,因此使用final修饰的一个private访问权限的方法,依然可以在其子类中定义与该方法有相同方法名,相同形参列表,相同返回值类型的方法。

4.final修饰的方法不能被重写但完全可以被重载。

5.final类:

1.final修饰的类不可有子类,https://www.wendangku.net/doc/7816455774.html,ng.Math类就是一个final类,它不可以有子类。

三JQuery绑定事件的方法

.bind()

$('a').bind('click',function(){alert("That tickles!")});

这是最直接的绑定方法。jQuery扫描文档找到所有$(‘a’)元素,然后给每一个找到的元素的click事件绑定处理函数。

.live()

$('a').live('click',function(){alert("That tickles!")});

Query绑定处理函数到$(document)元素,并把‘click’和‘a’作为函数的参数。有事件冒泡到document节点的时候,检查这个事件是不是click事件,target element能不能匹配‘a’css选择器,如果两个条件都是true,处理函数执行。

.delegate()

$('#container').delegate('a','click',function(){alert("That tickles!")}); jQuery扫描文档找到$(‘#container’),绑定处理函数到他的click事件,’a’css选择器作为函数的参数。当有事件冒泡到$(‘#container’),检查事件是不是click,并检查target element是不是匹配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必须为整数。

Select CONVERT(varchar(100),GETDATE(),23):2006-05-16

CONVERT(data_type(length),data_to_be_converted,style)data_type(length)规定目标数据类型(带有可选的长度)。data_to_be_converted含有需要转换的值。style规定日期/时间的输出格式。

六.oracle存储过程

1.存储过程异常处理

create or replace procedure peace_insert(c_n in varchar2)

is

error EXCEPTION;

begin

if c_n='OK'

then

insert into course(course_name)values(c_n);

elsif c_n='NG'then

insert into course(course_name)values(c_n); raise error;

else

Dbms_Output.put_line('c_n'||c_n);

end if;

commit;

exception

when error then

rollback;

Dbms_Output.put_line('ERRO');

end;

关于游标if,for的例子

create or replace procedure peace_if

is

cursor var_c is select*from grade;

begin

for temp in var_c loop

if temp.course_name='OS'then

dbms_output.put_line('Stu_name='||temp.stu_name); elsif temp.course_name='DB'then

dbms_output.put_line('DB');

else

dbms_output.put_line('feng la feng la');

end if;

end loop;

end;

---关于游标for,case的例子1

create or replace procedure peace_case1

is

cursor var_c is select*from test_case;

begin

for temp in var_c loop

case temp.vol

when1then

dbms_output.put_line('haha1');

when2then

dbms_output.put_line('haha2');

when3then

dbms_output.put_line('haha3');

when4then

dbms_output.put_line('haha4');

else

dbms_output.put_line('qita');

end case;

end loop;

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变量设置成0.0,逻辑值设置成false。所以用new关键字来新建一个对象的时间开销是很大的,如表1所示。

表1一些操作所耗费时间的对照表

运算操作示例标准化时间

本地赋值i=n 1.0

实例赋值this.i=n1.2

方法调用Funct()5.9

新建对象New Object()980

新建数组New int[10]3100

从表1可以看出,新建一个对象需要980个单位的时间,是本地赋值时间的980倍,是方法调用时间的166倍,而若新建一个数组所花费的时间就更多了。

再看清除对象的过程。我们知道,Java语言的一个优势,就是Java程序员勿需再像C/C++程序员那样,显式地释放对象,而由称为垃圾收集器(Garbage Collector)的自动内存管理系统,定时或在内存凸现出不足时,自动回收垃圾对象所占的内存。凡事有利总也有弊,这虽然为Java程序设计者提供了极大的方便,但同时它也带来了较大的性能开销。这种开销包括两方面,首先是对象管理开销,GC为了能够正确释放对象,它必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。其次,在GC开始回收“垃圾”对象时,系统会暂停应用程序的执行,而独自占用CPU。

因此,如果要改善应用程序的性能,一方面应尽量减少创建新对象的次数;同时,还应尽量减少T1、T3的时间,而这些均可以通过对象池技术来实现。

实现一个对象池,一般会涉及到如下的类:

1)对象池工厂(ObjectPoolFactory)类

该类主要用于管理相同类型和设置的对象池(ObjectPool),它一般包含如下两个方法:createPool:用于创建特定类型和设置的对象池;

destroyPool:用于释放指定的对象池;

同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见下述getInstance方法的实现:

public static ObjectPoolFactory getInstance(){if(poolFactory==null)

{poolFactory=new ObjectPoolFactory();}return poolFactory;

}

2)参数对象(ParameterObject)类

该类主要用于封装所创建对象池的一些属性参数,如池中可存放对象的数目的最大值(maxCount)、最小值(minCount)等。

3)对象池(ObjectPool)类

用于管理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般包含如下两个方法:

getObject:用于从池中借出对象;

returnObject:将池化对象返回到池中,并通知所有处于等待状态的线程;

4)池化对象工厂(PoolableObjectFactory)类

该类主要负责管理池化对象的生命周期,就简单来说,一般包括对象的创建及销毁。该类同ObjectPoolFactory一样,也可将其实现为单实例。

变量的生命周期和作用域

Java允许在任何块中声明变量,(块:由‘{‘开始由‘}’结束)。

一个”块”定义一个作用域.作用域决定了哪些变量对程序的其他部分是可视的,同时还确定了这些对象的生命周期.

定义作用域由一个方法和它的左’{‘开始,如果方法带有参数,那么它们也在方法的作用域之内。

一般规则是:在一个作用域内声明的变量对外部的作用域定义的程序不可视(不可访问),因此,在一个作用域中声明变量时,就是在使变量本地化并受其保护而拒绝未经授权的访问和修改.其实,作用域规则为变量提供了封装的功能.作用域可以嵌套,每次创建一个新的,嵌套的作用域,外部作用域就封入到内部作用域,这就意味着外部作用域声明的对象在内部作用域中的代码是可以访问的,反之则是不正确的。

变量的作用域影响了其生命周期。进入到变量的作用域创建变量,离开变量的作用域则清除变量。也就是说变量离开了它的作用域则不再保存它的值.

因此变量的生命周期受其作用域限制。

Java对象的作用域

作用域public,private,protected,以及不写时的区别

答:区别如下:

作用域当前类同一package子孙类其他package

public√√√√

protected√√√×

friendly√√××

private√×××

不写时默认为friendly

JavaBean作用域

在Web应用中,JavaBean存储许多不同的属性集合中。每一个不同的属性集合都有不同的生命周期规则。该规则定义了生命周期和可见性我们称之为作用域(Scope),JSP定义的作

用域如下:

1.page Bean在当前请求的单个JSP页面可见(相当于Servlet的service方法中的局部

变量)

2.Request Bean不仅在单个页面可见,也可以在被页面包含(include)的页面或servlet

中可见,或者转向(Forward)的页面可见。

3.Session Bean在特殊用户session的所有JSP或Servlet中可见。

4.Application Bean在WEB应用中的所有JSP,或Servelt中可见。

必须记住的是JSP和Servlet在同一个WEB应用中共享同一组Bean。例如一个Bean在Servlet中存在request的属性中:

MyCart mycart=new MyCart(...);

request.setAttribute("cart",mycart);

Mycart在该Servlet转向的JSP页面中马上可见。你可以在JSP中如下声明它。

八,sql连接查询

join_type指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同。

1、内连接又分为等值连接、自然连接和不等连接三种。

2、外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN 或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

3、交叉连接(CROSS JOIN)没有WHERE子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON(join_condition)子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info FROM pub_info AS p1INNER JOIN pub_info AS p2ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的

列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT*FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city

SELECT a.*,p.pub_id,p.pub_name,p.country FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city又如使用自然连接,在选择列表中删除authors 和publishers表中重复列(city和state):

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件(WHERE搜索条件或HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

1、left join或left outer join(左外连接)

左外连接:(也叫左外连接,给出两个表的配匹行,并且以左边的表为准,如果左边表有而右边表没有的行,则在右边表的相应行选择的列显示为NULL,允许左边的基准表对应右边表多条满足条件的记录)左连接就是返回左边的匹配行,不考虑右边的表是否有相应的行

select field1,field2from table1left join table2on field1=field2(基准字段,可以多个)where table1.field3=table2.field32、right join或right outer join(右外连接)

右连接:(也叫右外连接,给出两个表的配匹行,并且以右边的表为准,如果右边表有而左边表没有的行,则在右边表的相应行选择的列显示为NULL,允许右边的基准表对应左边表多条满足条件的记录)

语法与做链接差不多!

(三)交叉连接

交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接

检索到的记录数将等于6*8=48行。

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

九。删除表中重复记录 A.B.C.D.E五列数据相同为重复数据,重复数据中只保留id 为最小的一条

delete from abc awhere(a.A,a.B,a.C,a.D,a.E)in

(select A,B,C,D,E from abc where G>cast('2014-06-01'as datetime) group by A,B,C,D,E having count(*)>1)

and autoid not in(select min(autoid)from abc where G> cast('2014-06-01'as datetime)group by A,B,C,D,E having count(*)>1)

十。多线程

1.什么是多线程编程?什么时候使用?

多线程一般用于当一个程序需要同时做一个以上的任务。多线程通常用于GUI交互程序。一个新的线程被创建做一些耗时的工作,当主线程保持界面与用户的交互。

2.为什么wait(),notify()和notifyall()函数定义在Object类里面?

因为所有类都是继承于Object类,这样所有类就可以简单的进行多线程编程了。

3.wait()方法和sleep()方法有什么不同?

sleep()方法执行后仍然拥有线程,只是延时。而wait方法放弃了线程控制,其它线程可以运行,想要再次运行是要重新开始。

4.Thread和Runnable有什么不同?JAVA线程控制着程序执行的主路径。当你用java 命令调用JVM时,JVM创建了一个隐式线程来执行main方法。

Thread

类提供了主线程调用其它线程并行运行的机制。

Runnable接口定义了一个能被hread运行的类。实现Runnable的类只需要实行run方法。可以很灵活的扩展现在的已经继承自其它父类的类。而

thread则不可以,因为java只允许继承一个父类。

Runnable可以共享数据,Thread是一个类,而Runnable是一个接口

5.我可以重载start()方法么?可以重载,重载后还要重载run()

十一。单例模式

单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。

Java Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用:

1、控制资源的使用,通过线程同步来控制资源的并发访问;

2、控制实例产生的数量,达到节约资源的目的。

3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信

单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。

Mysql导出

1.cmd进入到导出文件存放位置cd d:

2.mysqldump-u root-p edubook>edubook.sql

3.输入密码

Mysql导入

1.创建数据库

2.Mysql管理器 https://www.wendangku.net/doc/7816455774.html,e baseName;

b.SOURCE d:/edubook.sql

相关文档