2014年5月整理java面试题

2024-05-19 02:32
文章标签 面试题 2014 java 整理

本文主要是介绍2014年5月整理java面试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Overload(方法重载)和override(方法覆盖)的区别:

overload是指函数的名称相同,但是属性不同(返回类型除外) 

override是对父类的虚函数进行“个性化”,要求属性必须与父类中声明的一致,不然会变成overload!

 

overload是完全隐藏了父类中函数的实现,相当于定义了一个同名函数 

override是继承父类中函数实现,同时增加自己的功能

 

overload是在一个类里面实现同名不同参的函数重载 

override是子类对父类虚函数的重载

 

overload:函数重载 

override:虚函数,子类对父类同名同参同返回类型函数的特化-----形成多态性 

特别注意:与JAVA不同,在C++中子类的函数名称与父类函数名称相同但参数不同时不会是重载,是覆盖,即父类中的那个函数此时已经不可见(除非你在子类有特别说明)。

1> override要求参数签名必须一致,而overload要求参数签名必须不一致

2> override要求返回类型必须一致,而overload对此不做限制

3> override只能用于子类覆盖父类的方法,overload用于同一个类的所有方法

4> 父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次

 

2.面向对象的特征有哪些方面:
1.抽象:(abstract)

  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

  一、当抽象作为动词时,就是指抽象的思维过程

  二、当抽象作为形容词时,可用来修饰类和方法。若一个方法被abstract修饰,则表明这个方法没有具体的实现,若一个类被abstract修饰,则表明这个不能被实例化。

抽象是一种由具体到抽象、由复杂到简洁的思维方式。

抽象只指从特定的角度出发,从已经存在的一些事物中抽取我们所关注的特性,形成一个新的事物的思维过程。
2.继承:(extends)
  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。继承是一种提高代码的可重用性,以及提高系统的可扩展性的有效手段。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

JAVA语言不支持多继承,即一个类只能直接继承一个父类,但是他可以有多个间接父类。所有的java类都直接或间接地继承了java.lang.Object类,Object是所有java类的祖先
3.封装:
  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。

Public:对外公开,访问级别最高

Protected:只对子类或同一个包中的类公开

默认:只对同一个包中的类公开

Private:不对外公开,只能在对象内部访问,访问级别最低

不写时默认为friendly


4. 多态性:
  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

 

3.String是最基本的数据类型吗?

基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类(StringBuffer是字符串变量,它的对象是可以扩充和修改的。)

 

4.String和StringBuffer的区别?

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据

String类用来表示那些创建后就不会再改变的字符串,它是immutable的。而StringBuffer类用来表示内容可变的字符串,并提供了修改底层字符串的方法。
  当我们进行字符拼接时,请使用StringBuffer类而非String类,因为前者将比后者快上百倍。 
  的确,在程序的太多场合我们都会进行字符串拼接工作,简单的代码示例如下: 
String str="You are nice."; 
str+="I love you so much."; 
  如果用StringBuffer类的话,代码如下: 
StringBuffer str= new StringBuffer("You are nice."); 
str.append("I love you so much."); 

  从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情: 
  经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"You are nice."和"I love you so much."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。 
  而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String("I love you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。 

  可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换

 

5.Int和Integer的区别?

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类:
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
  引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

 

6.运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

 

7.throw与throws有何异同?

区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;

throw语法:throw <异常对象>

在方法声明中,添加throws子句表示该方法将抛出异常。
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。

区别二: throws可以单独使用,但throw不能;

区别三: throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

7.说出Servlet的生命周期,并说出Servlet和CGI的区别?

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

CGI(Common Gateway Interface通用网关接口)程序来实现数据在Web上的传输,使用的是如Perl这样的语言编写的,它对于客户端作出的每个请求,必须创建CGI程序的一个新实例,这样占用大量的内存资源。由此才引入了Servlet技术。

Servlet是一个用java编写的应用程序,在服务器上运行,处理请求信息并将其发送到客户端。对于客户端的请求,只需要创建Servlet的实例一次,因此节省了大量的内存资源。Servlet在初始化后就保留在内存中,因此每次作出请求时无需加载。
  与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

 

Servlet的生命周期分为5个阶段:
实例化:Servlet容器创建Servlet类的实例。
初始化:该容器调用init()方法,通常会申请资源。
服务:由容器调用service()方法,(也就是doGet()和doPost())。
释放:在释放Servlet实例之前调用destroy()方法,通常会释放资源。
不可用:释放内存的实例。

7.说出ArrayList,Vector, LinkedList的存储性能和特性?

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

 

ArrayList与Vector的区别主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

 

8.Collection 和 Collections的区别?

Collection(java.util.Collection)是集合类的上级接口,Collection接口在java类库中有很多具体的实现,继承于他的接口主要有Set 和List.

Collections(java.util.Collections)是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

 

9.&和&&的区别?
      &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

10.HashMap和Hashtable的区别?

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
  HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
  Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
  Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 

Collection:List (ArrayList,Vector,LinkedList)

          Set (HashSet,TreeSet)

 

Map:HashMap

HashTable

TreeMap

 

Collection、List、Set、Map都是接口,不能实例化。Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)
Map提供key到value的映射

 

Collection框架中实现比较要实现Comparable 接口和 Comparator 接口

JAVA类实现序例化的方法是实现java.io.Serializable接口

 

集合框架的优点:
提供一组可用的集合接口,可以方便地扩展或改写集合;
接口和算法的可重用性提高了软件的可重用性;
提供了有效的数据结构和算法,减少了编程工作。

 

11.final, finally, finalize的区别?

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

(final具有“不可改变的”的含义,他可以修饰非抽象类,非抽象成员方法和变量。用final修饰的类,不可继承,没有子类。用final修饰的方法,不能被子类的方法覆盖。用final修饰的变量表示常量,只能被赋一次值。)

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

 

12.sleep() 和 wait() 有什么区别?
   sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
  wait是Object类的方法,对此对象调用wait本方法导致线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

第一:
sleep是Thread对象里面的方法;
wait是Object对象里面的方法;
第二:
当一个synchorized成员sleep的时候并不会释放掉synchorized;
但是当一个synchorized成员wait的时候是会释放掉synchorized的;

第三:
一个对象在sleep的时候是有时间设定限制的,除非在sleep设定时间内被中途打断,就会抛出InterruptedException异常;
一个对象在wait的时候没有时间限制,会让对象一直暂停下去,当有其他对象去调用他的notify或者调用全局的notifyAll的时候才会开始继续执行。

 

13.error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

 

14.同步和异步有何异同,在什么情况下分别使用他们?举例说明

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
  当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

举个例子:普通B/S模式(同步)AJAX技术(异步)
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

(关于AJAX工作机理:)

从客户端发送一个http请求到ajax(XMLHttpRequest)对象中,ajax对象向后台服务器异步发送请求,服务器执行完操作后返回数据,再通过javascript相应到网页上。

也就是客户端和服务器都不必再互相等待,而是可以进行一些并发的操作。用户在发送请求以后可以继续当前工作,包括浏览或提交信息。在服务器响应完成后,ajax引擎会将更新的数据显示给用户,而用户则根据响应内容决定自己下一步的行为。

 

15.abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。(instanceof 运算符,确定某对象是否属于指定的类)

 

16.heap和stack有什么区别?

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
  堆是栈的一个组成元素

 

17.forward 和redirect的区别?

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
     redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

 

18.JSP中动态INCLUDE与静态INCLUDE的区别?

动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
  静态INCLUDE用include伪码实现,一定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>

 

19.GC是什么? 为什么要有GC?
 GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

 

20.启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。启动线程肯定要用start()方法。run()不过是线程生命周期中的一个步骤,当用start()开始一个线程后,线程就进入就绪状态,当cpu分配给它时间时,才开始执行run()方法。

 

21.说出数据连接池的工作机制是什么?

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。

 

22.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
   都不能

 

23.数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法

 

24.简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

 

25.简要描述Struts,spring,hibernate?

 S-S-H是一个基于MVC框架组合,struts是一个具有良好可管理性的web应用框架,主要负责视图(使用struts标签来构建页面视图并且使用ActionSupport来接收并处理页面表单传回来的数据),spring是一个轻量级的容器,他的目标是来实现一个全方位的整合框架,利用spring框架来整合其他子框架,例如整合struts和hibernate;(比如说项目中的action和service都托管给spring来管理,达到一个全方位的整合框架,项目的action和service都通过xml配置文件来描述这个bean,spring通过配置路径直接加载这些bean,从而来管理这些javabean)hibernate是一个数据持久化中间件,他使业务逻辑和数据实现了松耦合,并且封装了所有的数据访问细节,使业务逻辑层专注于实现业务逻辑。(项目中在对数据库操作<增删改查>的时候,因为hibernate托管给了spring,spring将使用他框架中的hibernate支持类(HibernateDaoSupport)的find,save,upedate,delete,deleteall等方法对数据库进行增删改查,若需要复杂的查询可以使用nativesql,常规查询)

 

26.页面间对象传递的方法?
request(接收请求的一个对象),session(记录在服务器端,是属于单个浏览器一个session),application(记录在服务器端,是一个公用的对象),cookie(记录在客户端的)等

 

Session保留在服务器端,给每个客户分配一个唯一的ID,作为每个客户的标识,用session.Abandon 只会注销当前客户.
Cookies是保留在客户端的,每次发出页面请求时,都会把里面的数据发送给服务器端.
Cookies适合做保存用户的个人设置,爱好等,Session适合做客户的身份验证.

 

27.APPlication,Session和Cookie的区别

方法

信息量大小

保存时间

应用范围

保存位置

Application

任意大小

整个应用程序的生命期

所有用户

服务器端

Session

小量,简单的数据

用户活动时间+一段延迟时间(一般为20分钟)

单个用户

服务器端

Cookie

小量,简单的数据

可以根据需要设定

单个用户

客户端

1.Application对象
    Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合

2.Session对象
    Session用于保存每个用户的专用信息.她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择.使用Session对象保存信息的代码如下:

//存放信息
Session["username"]="zhouhuan";
//读取数据
string UserName=Session["username"].ToString();

   3.Cookie对象
    Cookie用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4096,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性.使用Cookie对象保存的代码如下:

//存放信息
Response.Cookies["UserID"].Value="0001";
//读取信息
string UserID=Response.Cookies["UserID"].Value;

 

28.JSP和Servlet有哪些相同点和不同点,他们之间的联系?

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

 

29.JSP的内置对象及方法?

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
    response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
     out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
     pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
     session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
     applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
      config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
      page表示从该页面产生的一个servlet实例

 exception 没有被Throwable捕获的错误,转向errorpage的URL

 

30.线程的基本概念、线程的基本状态以及状态之间的关系

线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
  Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

 

31.多线程有几种实现方法,都是什么?同步有几种实现方法?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify

 

32.Java中的异常处理机制的简单原理和应用?

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

 

33.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

 

34.请说出你所知道的线程同步的方法?

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

 

35.char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文汉字的,因为java中以unicode编码,一个char占16个字节,所以放一个中文汉字是没问题的,一个汉字占2个字节,一个英文字母占1个字节.

 

36. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
答:父类:
package test;
public class FatherClass
{
public FatherClass()
{
System.out.println("FatherClass Create");
}
}
子类:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass
{
public ChildClass()
{
System.out.println("ChildClass Create");
}
public static void main(String[] args)
{
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
输出结果:
C:">java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create

 

37. 内部类的实现方式?
答:示例代码如下:
package test;
public class OuterClass
{
private class InterClass
{
public InterClass()
{
System.out.println("InterClass Create");
}
}
public OuterClass()
{
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args)
{
OuterClass oc = new OuterClass();
}
}
输出结果:
C:">java test/OuterClass
InterClass Create
OuterClass Create

 

 

 

再一个例题:
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3. Which two inner class declarations are
valid?(Choose two.)


A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
说明如下:
一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。故 A、B 错
二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。

故 D 错
三.非静态内部类的非静态成员可以访问外部类的非静态变量。故 C 正确

四.答案为C、E

 

38. 垃圾回收机制,如何优化程序?

 

垃圾回收是又jvm控制的,我们不能控制jvm进行垃圾回收  
  为了优化程序我们所能做的就是把我们不需要的资源处理成符合jvm垃圾回收条件  
  例如  
  Integer   i=new   Integer(88);  
  ...  
  //这时候我们不需要这个类了,我们希望jvm尽早进行垃圾回收,那么。。  
  i=null;//这样这个类就符合垃圾回收的条件了

 

39. float型float f=3.4是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4

 

 

40. Java中异常处理机制,事件机制?

事件代表了组件之间的交互。是一种在源对象和监听对象之间,某种状态发生变化的传递机制。
  通过事件处理机制,可以让一些组件作为事件源,发出可被组件环境或其它组件接收的事件。这样,不同的组件就可以组合在一起,组件之间通过事件传递进行通信,构成一个应用。
在java中实现事件机制的事件模型由三个部分构成:一个事件对象用于描述事件源的状态变化;一个事件源将会产生事件,提供注册的事件监听器的方法,把事件发送到监听器;事件监听器接收事件通知,实现该事件的监听器接口。

异常实际上是程序中错误导致中断了正常的指令流的一种事件.

Java异常处理用于在方法中能检查出错误但不能处理错误的情况,在这样的方法中将抛出一个异常。如果一个异常与某个catch程序块中的参数匹配,那么就执行该catch块中的代码。

 

41. 抽象类与接口?
答:抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。

 

42. Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?
答:Server端程序:
package test;
import java.net.*;
import java.io.*;

public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();

}
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client端程序:
package test;
import java.io.*;
import java.net.*;

public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}
public static void main(String[] args)
{
new Client();
}
};

 

43. Class.forName的作用?为什么要用?


答:调用该方法返回一个以字符串指定类名的类的对象。

Class.forName(xxx.xx.xx) 返回的是一个类

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。 

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 
A a = (A)Class.forName("pacage.A").newInstance(); 
这和你 
A a = new A(); 
是一样的效果。 

关于补充的问题 
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

Class.forName(xxx.xx.xx) 返回的是一个类 
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 
String str = 用户输入的字符串 
Class t = Class.forName(str); 
t.newInstance();

 在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的 区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。 

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如: 
class c = Class.forName(“Example”); 
factory = (ExampleInterface)c.newInstance(); 

其中ExampleInterface是Example的接口,可以写成如下形式: 
String className = "Example"; 
class c = Class.forName(className); 
factory = (ExampleInterface)c.newInstance(); 

进一步可以写成如下形式: 
String className = readfromXMlConfig;//从xml 配置文件中获得字符串 
class c = Class.forName(className); 
factory = (ExampleInterface)c.newInstance(); 

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。 

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。 

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。 

最后用最简单的描述来区分new关键字和newInstance()方法的区别: 
newInstance: 弱类型。低效率。只能调用无参构造。 
new: 强类型。相对高效。能调用任何public构造。

44. Java笔试常有的题

不能免俗的,又要开始去应聘了,铺一些常见的题上来:
实践题

1.

abstract class Name {
private String name;
public abstract boolean isStupidName(String name) {}
}

这有何错误?

答案: 错。abstract method必须以分号结尾,且不带花括号。

2.

public class Something {
void doSomething () {
private String s = "";
int l = s.length();
}
}

有错吗?

答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

3.

abstract class Something {
private abstract String doSomething ();
}

这好像没什么错吧?

答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎 么可以用private把abstract method封锁起来呢? (同理,abstract method前不能加final)。

4.

public class Something {
public int addOne(final int x) {
return ++x;
}
}

这个比较明显。

答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。

5.

public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}

class Other {
public int i;
}

和上面的很相似,都是关于final的问题,这有错吗?

答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference
(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable (成员变量),而o的reference并没有改变。

6.

class Something {
int i;
public void doSomething() {
System.out.println("i = " + i);
}
}

有什么错呢? 看不出来啊。

答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

这篇关于2014年5月整理java面试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995766

相关文章

使用ig507金融数据库的股票API接口经验有感:Java与Python

一、Java技术: 1. Java调用ig507金融数据库(ig507.com)股票API接口 引言: 随着金融科技的不断发展,数据驱动的投资策略变得越来越重要。本文将介绍如何使用Java语言调用ig507金融数据库的股票API接口,以获取实时股票数据,并展示基本的编程步骤和注意事项。 步骤一:引入依赖库 在Java项目中,首先需要引入用于处理HTTP请求和网络通信的库,如Apache

Android Apk瘦身方案1——R.java文件常量内联

R.java 文件结构 R.java 是自动生成的,它包含了应用内所有资源的名称到数值的映射关系。先创建一个最简单的工程,看看 R.java 文件的内容: R文件生成的目录为app/build/generated/not_namespaced_r_class_sources/xxxxxDebug/processXXXXDebugResources/r/com/xxx/xxx/R.java

Java常用垃圾收集器

垃圾收集器 Serial 单线程,使用复制算法用于新生代的垃圾回收进行GC时必须暂停所有其他工作线程适用于内存不太大的桌面应用 Serial Old Serial的老年代版本单线程,使用标记-整理算法 ParNew Serial的多线程版本,可与CMS配合使用用于新生代的垃圾回收CPU数量多的时候才能发挥优势,适用于Server上的应用 Parallel Scavenge 目标上达

SpringCloud Hystrix初体验

文章目录 简介实验步骤bookstore应用初始化应用主程序应用配置访问应用 reading应用初始化应用主程序BookService应用配置运行应用 参考资料 简介 Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电

SpringCloud Zuul初体验

文章目录 简介Zuul服务搭建后端服务book搭建创建一个web应用主程序配置application.properties访问book服务 Zuul服务搭建创建应用添加一个pre过滤器主程序配置application.properties通过Zuul服务网关访问book服务 参考资料 简介 Zuul在SpringCloud微服务架构中扮演服务网关的角色,对外部应用访问后端服务进

SpringCloud Eureka初体验

文章目录 Eureka Server创建Eureka Server项目配置application.properties增加@EnableEurekaServer注解访问Eureka Server Eureka Client创建Eureka Client项目配置bootstrap.properties编写EurekaclientApplication.java访问Eureka Client在E

配置SpringCloud Config Client连上Config Server

SpringCloud Config Client实际上就是连接到Config Server的普通应用,前面一篇文章 SpringCloud Config Server搭建 已经介绍了如何搭建一个Config Server,本文介绍如何让一个Spring应用连上Config Server并使用Config Server上的配置信息。 创建一个Spring应用 不知道为什么,在https://s

SpringCloud Config Server搭建

文章目录 1 创建Git仓库2 创建应用配置文件3 将应用配置文件commit到Git仓库中4 创建Config Server应用5 配置运行Config Server6 访问Config Server SpringCloud Config Server的作用实际上是充当Spring应用和存放在Git中的配置文件之间的媒介,为其他应用提供一个统一的配置管理中心,架构图如下:

SpringCloud Config简介

简介 Spring Cloud Config为分布式系统的外部配置提供服务端(server)和客户端(client)的支持。Config服务端提供了一个集中的地方来管理所有环境下各个应用的配置,Config客户端即普通的Spring应用,但不局限于Spring应用,理论上任意应用都可以作为Config的客户端。Config服务端和客户端的概念都源自于Spring的Environment和Prop

SpringMVC应用和RESTful应用的区别

SpringMVC应用的控制器需要依赖表现层(view)技术,在服务端把数据渲染成html后返回给浏览器,而RESTful应用的控制器直接返回一个对象,这个对象会被spring转成json格式写到http响应中。 以下是一个简单的RESTful控制器: @RestControllerpublic class GreetingController {private static final St