JAVA精髓面试题.docx
《JAVA精髓面试题.docx》由会员分享,可在线阅读,更多相关《JAVA精髓面试题.docx(18页珍藏版)》请在冰点文库上搜索。
JAVA精髓面试题
1.Java有没有goto?
有,java中的保留字,现在没有在java中使用.
2."=="和equals方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
equals方法是用于比较两个独立对象的内容是否相同,如比较两个人的长相是否相同,它比较的两个对象是独立的。
3.Integer与int的区别?
int是java提供的8种原始数据类型之一。
Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况.
4.接口与抽象类的区别?
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以有普通成员变量,接口中没有普通成员变量.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为publicabstract类型。
抽象类中可以包含静态方法,接口中不能包含静态方法.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。
一个类可以实现多个接口,但只能继承一个抽象类。
5.String是最基本的数据类型吗?
不是。
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。
6.JAVA中String与StringBuffer,StringBuilder应用的区别?
在java中有3个类来负责字符的操作。
1.Character是进行单个字符操作的,
2.String对一串字符进行操作。
不可变类。
3.StringBuffer也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型,为不可变对象,一旦被创建,就不能修改它的值。
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,它只能通过构造函数来建立,StringBuffersb=newStringBuffer();
注:
不能通过赋值符号对他进行赋值sb="welcometohere!
";//错误
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.sb.append("hello");
StringBuilder:
是一个可变对象,和StringBuffer相比,不是线程安全的,一般用在单个线程操作的时候(这种情况很普遍,所以一般优先选用StringBuilder),速度比StringBuffe快很多。
字符串连接操作中StringBuffer的效率要比String高。
7.final,finally,finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object中的方法,在垃圾回收器执行的时候会调用被回收对象的该方法用于释放一些资源,例如关闭文件等。
JVM不保证此方法总被调用。
8.运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的操作中可能遇到的异常,是一种常见运行错误。
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
9.error和exception有什么区别?
error表示恢复不是不可能但很困难的情况下的一种严重问题。
比如说内存溢出。
不可能指望程序能处理这样的情况。
exception表示一种设计或实现问题。
也就是说,它表示如果程序运行正常,从不会发生的情况。
10.Java中的异常处理机制的简单原理和应用。
异常是指java程序运行时(非编译)所发生的非正常情况或错误。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:
Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题,例如,说内存溢出和线程死锁等系统问题。
Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,例如,数组脚本越界。
java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。
11.sleep()和wait()有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
12.请说出你所知道的线程同步的方法。
wait():
使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():
使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():
唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():
唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
13.GC是什么?
为什么要有GC?
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法
14.垃圾回收的优点和原理。
并考虑2种回收机制.
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。
由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
15.请说说集合类都有哪些?
主要方法?
最常用的集合类是List和Map。
List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。
List适用于按数值索引访问元素的情形。
Map提供了一个更通用的元素存储方法。
Map集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。
16.Collection和Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
17.HashMap和Hashtable的区别.
一.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的三.值:
只有HashMap可以将空值作为一个表的条目的key或value。
18.List,Set,Map是否继承自Collection接口?
List,Set是,Map不是。
19.List、Map、Set三个接口,存取元素时,各有什么特点?
List以特定次序来持有元素,可有重复元素。
Set无法拥有重复元素,内部排序。
Map保存key-value值,value可多值。
20.ArrayList和Vector的区别?
一.同步性:
Vector是线程安全的,也就是同步的,而ArrayList是线程不安全的,不是同步的。
二.数据增长:
当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。
21.说出ArrayList,Vector,LinkedList的存储性能和特性?
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
22.描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,JavaClassLoader是一个重要的Java运行时系统组件。
它负责在运行时查找和装入类文件的类。
23.说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
24.如何用OGNL取得session和request中的变量值?
OGNL(Object-GraphNavigationLanguage)。
是一种可以方便地操作对象属性的开源表达式语言#session.userName,#request.userName
25.jsp中内置对象有几个?
分别是什么?
JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request:
用户端请求,此请求会包含来自GET/POST请求的参数
response:
网页传回用户端的回应
pageContext:
网页的属性是在这里管理
session:
与请求有关的会话期
application:
ervlet正在执行的内容
out:
用来传送回应的输出
config:
servlet的构架部件
page:
JSP网页本身
exception:
针对错误网页,未捕捉的例外
26、filter和interceptor的区别是什么?
比较一:
filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
比较二:
filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。
而interceptor与servlet容器无关。
比较三:
Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
比较四:
Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤。
27.char、varchar、nchar、nvarchar的区别?
Char,nchar是定长,varchar,nvarchar是变长。
Char和varchar是前缀n就表示Unicode字符
Unicode或非Unicode
数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。
如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。
Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
28.trycatchfinally的执行顺序,和finally是在retrun之前还是在之后执行。
1.不管有没有出现异常,finally块中代码都会执行;
2.当try和catch中有return时,finally仍然会执行;
3、finally是在return表达式运算后前执行的,所以函数返回值是在finally表达式运算后前执行的,执行前确定的;执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try的return,否则程序会提前退出。
29.web.xml中配置filter和listener,说说它们是干什么的?
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。
其工作原理是:
在web.xml文件配置好要拦截的客户端请求,它会拦截到所有请求,此时就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。
它是随着web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当web应用停止或重新部署的时候才销毁.
Servlet的监听器Listener,它是实现了是javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
主要作用是:
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
30.拦截器与过滤器的区别?
拦截器:
是在面向切面编程的就是在service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。
过滤器:
是在javaweb中,传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.。
具体区别:
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
31.hibernate中get和load的区别?
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
32.ssh中spring的作用是什么?
Ioc,aop切面事物,和依赖注入。
33.hibernate中什么是lazy(惰性加载)如何使用lazy,在什么情况下使用比较好?
延迟加载,设置标签中的lazy="true",需要用到数据的时候再发送查询语句来降低系统开销。
34.strust2中如何调用自带的验证方式?
Action继承actionsupport并在action类中重写vaildate方法。
或vaildateXxx方法
35.简单说明使用Hibernate进行数据库操作的步骤
建立一个Hibernateconfiguration对象
使用Hibernateconfiguration对象来建立一个Hibernatefactory对象。
使用Hibernatefactory对象来建立一个Hibernatesession对象。
使用Hibernatesession对象来开始一个事务(可选)
使用Hibernatesession对象来建立、读取、更新、删除数据库里的数据
提交事务(可选)
关闭session
36.介绍一下Spring的事务管理
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。
Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
--通用事务管理器-->
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
--声明一个通知,用以指出要管理哪些事务方法及如何管理-->
adviceid="txAdvice"transaction-manager="TransactionManager">
attributes>
--对get/load/search开头的方法要求只读事务-->
methodname="get*"propagation="SUPPORTS"
read-only="true"/>
methodname="load*"propagation="SUPPORTS"
read-only="true"/>
methodname="search*"propagation="SUPPORTS"
read-only="true"/>
--对其它方法要求事务-->
methodname="*"propagation="REQUIRED"/>
attributes>
advice>
--声明一个config,用以将通知和目标业务类关联起来-->
config>
--添加事务支持,因为前面配置的transactionManager是专对Hibernate的事务管理器-->
pointcutid="bizMethods"expression="execution(*demo.*.*(..))"/>
--织入-->
advisoradvice-ref="txAdvice"pointcut-ref="bizMethods"/>
config>
37.spring中的BeanFactory与ApplicationContext的作用有哪些?
1.BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2.ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a.国际化支持
b.资源访问:
Resourcers=ctx.getResource(”classpath:
config.properties”),“file:
c:
/config.properties”
c.事件传递:
通过实现ApplicationContextAware接口
38.spring中的核心类有那些,各有什么作用?
BeanFactory:
产生一个新的实例,可以实现单例模式
BeanWrapper:
提供统一的get及set方法
ApplicationContext:
提供框架的实现,包括BeanFactory的所有功能
39.什么是aop,aop的作用是什么?
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
除了类(classes)以外,AOP提供了切面。
切面对关注点进行模块化,例如横切多个类型和对象的事务管理。
Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP。
提供声明式企业服务,特别是为了替代EJB声明式服务。
最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上,允许用户实现自定义切面,用AOP来完善OOP的使用,可以把SpringAOP看作是对Spring的一种增强
40.解释一下Dependencyinjection(DI,依赖注入)和IOC(Inversionofcontrol,控制反转)?
依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:
把一个数据库连接已参数的形式传到一个对象的结构