JAVA相关基础知识
1、面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解所有问题,而仅仅是选择当中的一部分,临时不用部分细节。抽象包含两个方面,一是过程抽象。二是数据抽象。
2.继承:
继承是一种联结类的层次模型,而且同意和鼓舞类的重用,它提供了一种明白表述共性的方法。
对象的一个新类能够从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类)。而原始类称为新类的基类(父类)。派生类能够从它的基类那里继承方法和实例变量,而且类能够改动或添加新的方法使之更适合特殊的须要。
3.封装:
封装是把过程和数据包围起来,对数据的訪问仅仅能通过已定义的界面。面向对象计算始于这个基本概念。即现实世界能够被描绘成一系列全然自治、封装的对象,这些对象通过一个受保护的接口訪问其它对象。
4. 多态性:
多态性是指同意不同类的对象对同一消息作出响应。多态性包括參数化多态性和包括多态性。
多态性语言具有灵活、抽象、行为共享、代码共享的优势,非常好的攻克了应用程序函数同名问题。
2、String是最主要的数据类型吗?
基本数据类型包含byte、int、char、long、float、double、boolean和short。
java.lang.String类是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提供了两类基本的异常:runtime exception和checked exception。checked 异常也就是我们常常遇到的IO异常,以及SQL异常都是这样的异常。对于这样的异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以。面对这样的异常无论我们是否愿意。仅仅能自己去写一大堆catch块去处理可能的异常。6、说出Servlet的生命周期。并说出Servlet和CGI的差别。可是第二种异常:runtime exception,也称执行时异常,我们能够不处理。当出现这样的异常时。总是由虚拟机接管。
比方:我们从来没有人去处理过NullPointerException异常,它就是执行时异常,而且这样的异常还是最常见的异常之中的一个。 出现执行时异常后。系统会把异常一直往上层抛。一直遇到处理代码。假设没有处理块,到最上层,假设是多线程就由Thread.run()抛出。假设是单线程就被main()抛出。抛出之后,假设是线程,这个线程也就退出了。
假设是主程序抛出的异常,那么这整个程序也就退出了。
执行时异常是Exception的子类,也有一般异常的特点,是能够被Catch块处理的。仅仅只是往往我们不正确他处理罢了。
也就是说。你假设不正确执行时异常进行处理,那么出现执行时异常之后,要么是线程中止,要么是主程序终止。 假设不想终止,则必须扑捉全部的执行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。
不应该因为异常数据而影响以下对正常数据的处理。在这个场景这样处理可能是一个比較好的应用,但并不代表在全部的场景你都应该如此。假设在其他场景,遇到了一些错误,假设退出程序比較好,这时你就能够不太理会执行时异常,或者是通过对异常的处理显式的控制程序退出。
Servlet被server实例化后。容器执行其init方法,请求到达时执行其service方法。service方法自己主动派遣执行与请求相应的doXXX方法(doGet。doPost)等。当server决定将实例销毁的时候调用其destroy方法。
与cgi的差别在于servlet处于server进程中,它通过多线程方式执行其service方法,一个实例能够服务于多个请求。而且事实上例一般不会销毁,而CGI对每一个请求都产生新的进程,服务完毕后就销毁,所以效率上低于servlet。
7、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据。此数组元素数大于实际存储的数据以便添加和插入元素,它们都同意直接按序号索引元素。可是插入元素要涉及数组元素移动等内存操作。所以索引数据快而插入数据慢,Vector因为使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储。按序号索引数据须要进行前向或后向遍历,可是插入数据时仅仅须要记录本项的前后项就可以,所以插入速度较快。
8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的差别,StatefulBean和StatelessBean的差别。
EJB包含Session Bean、Entity Bean、Message Driven Bean。基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完毕一些server端的业务操作,比如訪问数据库、调用其它EJB组件。EntityBean被用来代表应用系统中用到的数据。
对于客户机。SessionBean是一种非持久性对象。它实现某些在server上执行的业务逻辑。
对于客户机。EntityBean是一种持久性对象。它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还能够再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都能够将系统逻辑放在 method之中运行,不同的是 Stateful Session Bean 能够记录呼叫者的状态,因此通常来说,一个使用者会有一个相相应的 Stateful Session Bean 的实体。Stateless Session Bean 尽管也是逻辑组件,可是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless
Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来运行这个 method。换言之,非常可能数个使用者在运行某个 Stateless Session Bean 的 methods 时。会是同一个 Bean 的 Instance 在运行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比較, Stateful Session Bean 会消耗 J2EE Server
较多的内存,然而 Stateful Session Bean 的优势却在于他能够维持使用者的状态。
9、Collection 和 Collections的差别。
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
10、&和&&的差别。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。
11、HashMap和Hashtable的差别。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完毕了Map接口。主要差别在于HashMap同意空(null)键值(key),因为非线程安全。效率上可能高于Hashtable。
HashMap同意将null作为一个entry的key或者value,而Hashtable不同意。
HashMap把Hashtable的contains方法去掉了。改成containsvalue和containsKey。由于contains方法easy让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的。而HashMap不是,在多个线程訪问Hashtable时,不须要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(假设是ArrayList:List lst = Collections.synchronizedList(new ArrayList());假设是HashMap:Map map = Collections.synchronizedMap(new HashMap());)。
Hashtable和HashMap採用的hash/rehash算法都大概一样。所以性能不会有非常大的差异。
12、final, finally, finalize的差别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是运行。
finalize是Object类的一个方法,在垃圾收集器运行的时候会调用被回收对象的此方法,能够覆盖此方法提供垃圾收集时的其它资源回收,比如关闭文件等。
13、sleep() 和 wait() 有什么差别?
sleep是线程类(Thread)的方法,导致此线程暂停运行指定时间,给运行机会给其它线程。可是监控状态依旧保持,到时后会自己主动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法。对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,仅仅有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入执行状态。
14、Overload和Override的差别。Overloaded的方法能否够改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现。重载Overloading是一个类中多态性的一种表现。
假设在子类中定义某方法与其父类有同样的名称和參数,我们说该方法被重写 (Overriding)。子类的对象使用这种方法时。将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。假设在一个类中定义了多个同名的方法,它们或有不同的參数个数或有不同的參数类型。则称为方法的重载(Overloading)。
Overloaded的方法是能够改变返回值的类型。
15、error和exception有什么差别?
error 表示恢复不是不可能但非常困难的情况下的一种严重问题。比方说内存溢出。不可能指望程序能处理这种情况。
exception 表示一种设计或实现问题。也就是说,它表示假设程序执行正常。从不会发生的情况。
16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
假设数据将在线程间共享。比如正在写的数据以后可能被还有一个线程读到,或者正在读的数据可能已经被还有一个线程写过了。那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个须要花费非常长时间来运行的方法,而且不希望让程序等待方法的返回时,就应该使用异步编程,在非常多情况下採用异步途径往往更有效率。
17、abstract class和interface有什么差别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类。并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而能够创建一个变量,其类型是一个抽象类,并让它指向详细子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的全部抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其他类能够在类中实现这些方法。
接口(interface)是抽象类的变体。
在接口中,全部方法都是抽象的。多继承性可通过实现这种接口而获得。接口中的全部方法都是抽象的,没有一个有程序体。
接口仅仅能够定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)全部这种接口的方法。然后,它能够在实现了该接口的类的不论什么对象上调用接口的方法。因为有抽象类。它同意使用接口名作为引用变量的类型。通常的动态联编将生效。
引用能够转换到接口类型或从接口类型转换,instanceof
运算符能够用来决定某对象的类是否实现了接口。
18、heap和stack有什么差别。
栈是一种线形集合,其加入和删除元素的操作应在同一段完毕。栈依照后进先出的方式进行处理。
堆是栈的一个组成元素
19、forward 和redirect的差别
forward是server请求资源,server直接訪问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道server发送的内容是从哪儿来的。所以它的地址栏中还是原来的地址。
redirect就是服务端依据逻辑,发送一个状态码,告诉浏览器又一次去请求那个地址,一般来说浏览器会用刚才请求的全部參数又一次请求。所以session,request參数都能够获取。
20、EJB与JAVA BEAN的差别?
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,不论什么一个Java类都能够是一个Bean。
但通常情况下,因为Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无參的构造器。另外。通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件。它是不能被跨进程訪问的。
Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB能够被远程訪问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这种容器中。EJB客户从不直接訪问真正的EJB组件。而是通过其容器訪问。EJB容器是EJB组件的代理。EJB组件由容器所创建和管理。客户通过容器来訪问真正的EJB组件。
21、Static Nested Class 和 Inner Class的不同。
Static Nested Class是被声明为静态(static)的内部类,它能够不依赖于外部类实例被实例化。
而通常的内部类须要在外部类实例化后才干实例化。
22、JSP中动态INCLUDE与静态INCLUDE的差别?
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件里的变化,适合用于包括动态页面,而且能够带參数。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包括静态页面<%@ include file="included.htm" %>
23、什么时候用assert。
assertion(断言)在软件开发中是一种经常使用的调试方式,非常多开发语言中都支持这样的机制。
在实现中。assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;假设该值为false,说明程序已经处于不对的状态下,系统将给出警告或退出。
一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和測试时开启。
为了提高性能,在软件公布后,assertion检查一般是关闭的。
24、GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员easy出现故障的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃。Java提供的GC功能能够自己主动监測对象是否超过作用域从而达到自己主动回收内存的目的。Java语言没有提供释放已分配内存的显示操作方法。
25、short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型。须要强制转换类型)
short s1 = 1; s1 += 1;(能够正确编译)
26、Math.round(11.5)等於多少?
Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回与參数最接近的长整数。參数加1/2后求其floor.
27、String s = new String("xyz");创建了几个String Object?
两个
28、设计4个线程,当中两个线程每次对j添加1,另外两个线程对j每次降低1。写出程序。
下面程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
}
29、Java有没有goto?
java中的保留字。如今没有在java中使用。
30、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可执行状态。这意味着它能够由JVM调度并执行。这并不意味着线程就会马上执行。run()方法能够产生必须退出的标志来停止一个线程。
31、EJB包含(SessionBean,EntityBean)说出他们的生命周期。及怎样管理事务的?
SessionBean:Stateless Session Bean 的生命周期是由容器决定的。当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用。而是随便找一个现有的实例提供给客户机。
当客户机第一次调用一个Stateful Session Bean 时,容器必须马上在server中创建一个新的Bean实例,并关联到客户机上。以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例。
EntityBean:Entity Beans能存活相对较长的时间,而且状态是持续的。仅仅要数据库中的数据存在,Entity beans就一直存活。
而不是依照顾用程序或者服务进程来说的。
即使EJB容器崩溃了。Entity beans也是存活的。Entity Beans生命周期可以被容器或者 Beans自己管理。
EJB通过下面技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open)的XA接口。
32、应用server有那些?
BEA WebLogic Server。IBM WebSphere Application Server,Oracle9i Application Server。jBoss,Tomcat
33、给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException,
RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
34、接口是否可继承接口?
抽象类是否可实现(implements)接口?
抽象类是否可继承实体类(concrete class)?
接口能够继承接口。抽象类能够实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明白的构造函数。
35、List, Set, Map是否继承自Collection接口?
List,Set是,Map不是
36、说出数据连接池的工作机制是什么?
J2EEserver启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。client程序须要连接时。池驱动程序会返回一个未使用的池连接并将其表记为忙。假设当前没有空暇连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置參数决定。当使用的池连接调用完毕后,池驱动程序将此连接表记为空暇,其它调用就能够使用这个连接。
37、abstract的method是否可同一时候是static,是否可同一时候是native。是否可同一时候是synchronized?
都不能
38、数组有没有length()这种方法? String有没有length()这种方法?
数组没有length()这种方法,有length的属性。String有有length()这种方法。
39、Set里的元素是不能反复的,那么用什么方法来区分反复与否呢?
是用==还是equals()? 它们有何差别?
Set里的元素是不能反复的,那么用iterator()方法来区分反复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
40、构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但能够被重载Overloading。
41、能否够继承String类?
String类是final类故不能够继承。
42、swtich能否作用在byte上,能否作用在long上,能否作用在String上?
switch(expr1)中,expr1是一个整数表达式。
因此传递给 switch 和 case 语句的參数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
43、try {}里有一个return语句。那么紧跟在这个try后的finally {}里的code会不会被运行,什么时候被运行,在return前还是后?
会运行,在return前运行。
44、编程题: 用最有效率的方法算出2乘以8等於几?
2 << 3
45、两个对象值同样(x.equals(y) == true),但却可有不同的hash code,这句话对不正确?
不正确。有同样的hash code。
46、当一个对象被当作參数传递到一个方法后。此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递还是引用传递?
是值传递。Java 编程语言仅仅有值传递參数。
当一个对象实例作为一个參数被传递到方法中时,參数的值就是对该对象的引用。对象的内容能够在被调用的方法中改变。但对象的引用是永远不会改变的。
47、当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法?
不能,一个对象的一个synchronized方法仅仅能由一个线程訪问。
48、编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中。一个类Class仅仅有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用当中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是非常奇怪?
//注意这是private 仅仅供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部訪问本class的静态方法,能够直接訪问
public static Singleton getInstance() {
return instance;
}
}
另外一种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这种方法比上面有所改进,不用每次都进行生成对象。仅仅是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其它形式:
定义一个类,它的构造函数为private的,全部方法为static的。
一般觉得第一种形式要更加安全些
49、Java的接口和C++的虚类的同样和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性。现有的单继承机制就不能满足要求。与继承相比。接口有更高的灵活性。由于接口中没有不论什么实现代码。当一个类实现了接口以后。该类要实现接口里面全部的方法和属性,而且接口里面的属性在默认状态以下都是public static,全部方法默认情况下是public.一个类能够实现多个接口。
50、Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包含2种情况。一种是JAVA类库内置的语义检查。比如数组下标越界,会引发IndexOutOfBoundsException;訪问null的对象时会引发NullPointerException。还有一种情况就是JAVA同意程序猿扩展这样的语义检查。程序猿能够创建自己的异常。并自由选择在何时用throwkeyword引发异常。全部的异常都是java.lang.Thowable的子类。
51、垃圾回收的长处和原理。
并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序猿最头疼的内存管理的问题迎刃而解,它使得Java程序猿在编敲代码的时候不再须要考虑内存管理。
因为有个垃圾回收机制,Java中的对象不再有“作用域”的概念,仅仅有对象的引用才有“作用域”。
垃圾回收能够有效的防止内存泄露,有效的使用能够使用的内存。
垃圾回收器一般是作为一个单独的低级别的线程执行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序猿不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收。增量垃圾回收。
52、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,而且释放所持有的对象的lock。
sleep():使一个正在执行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程。而是由JVM确定唤醒哪个线程。并且不是按优先级。
Allnotity():唤醒全部处入等待状态的线程,注意并非给全部唤醒线程一个对象的锁,而是让它们竞争。
53、你所知道的集合类都有哪些?主要方法?
最经常使用的集合类是 List 和 Map。
List 的详细实现包含 ArrayList 和 Vector,它们是可变大小的列表,比較适合构建、存储和操作不论什么类型对象的元素列表。 List 适用于按数值索引訪问元素的情形。
Map 提供了一个更通用的元素存储方法。
Map 集合类用于存储元素对(称作“键”和“值”),当中每一个键映射到一个值。
54、描写叙述一下JVM载入class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java执行时系统组件。它负责在执行时查找和装入类文件的类。
55、char型变量中能不能存贮一个中文汉字?为什么?
可以定义成为一个中文的,由于java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,各自是继承Thread类与实现Runnable接口
同步的实现方面有两种,各自是synchronized,wait与notify
57、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实例
58、线程的基本概念、线程的基本状态以及状态之间的关系
线程指在程序运行过程中,可以运行程序代码的一个运行单位。每一个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态各自是:执行、就绪、挂起、结束。
59、JSP的经常使用指令
<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true”
info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>
isErrorPage(能否使用Exception对象),isELIgnored(是否忽略表达式)
<%@include file=”filename”%>
<%@taglib prefix=”c”uri=”http://……”%>
60、什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet()。为post时调用doPost()。
61、servlet的生命周期
web容器载入servlet,生命周期開始。通过调用servlet的init()方法进行servlet的初始化。
通过调用service()方法实现,依据请求的不同调用不同的do***()方法。
结束服务,web容器调用servlet的destroy()方法。
62、怎样现实servlet的单线程模式
<%@ page isThreadSafe=”false”%>
63、页面间对象传递的方法
request,session,application。cookie等
64、JSP和Servlet有哪些同样点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最基本的不同点在于,Servlet的应用逻辑是在Java文件里,而且全然从表示层中的HTML里分离开来。而JSP的情况是Java和HTML能够组合成一个扩展名为.jsp的文件。JSP側重于视图,Servlet主要用于控制逻辑。
65、四种会话跟踪技术
会话作用域ServletsJSP 页面描写叙述
page否是代表与一个页面相关的对象和属性。
一个页面由一个编译好的 Java servlet 类(能够带有不论什么的 include 指令,可是没有 include 动作)表示。这既包含 servlet 又包含被编译成 servlet 的 JSP 页面
request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(因为 forward 指令和 include 动作的关系)
session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。
一个 Web 会话能够也常常会跨越多个客户机请求
application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包含多个页面、请求和会话的一个全局作用域
66、Request对象的主要方法:
setAttribute(String name,Object):设置名字为name的request的參数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象全部属性的名字集合,结果是一个枚举的实例
getCookies():返回client的全部Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的全部值,结果是一个枚举的实例
getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得client向server端传送数据的方法
getParameter(String name):获得client传送给server端的有name指定的參数值
getParameterNames():获得client传送给server端的全部參数的名字,结果是一个枚举的实例
getParameterValues(String name):获得有name指定的參数的全部值
getProtocol():获取client向server端传送数据所根据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的client地址
getRemoteAddr():获取client的IP地址
getRemoteHost():获取client的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取server的名字
getServletPath():获取client所请求的脚本文件的路径
getServerPort():获取server的port号
removeAttribute(String name):删除请求中的一个属性
67、J2EE是技术还是平台还是框架?
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包含JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
68、我们在web应用开发过程中常常遇到输出某种编码的字符,如iso8859-1等。怎样输出一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
69、简述逻辑操作(&,|,^)与条件操作(&&,||)的差别。
差别主要答两点:a.条件操作仅仅能操作布尔型的,而逻辑操作不仅能够操作布尔型,并且能够操作数值型
b.逻辑操作不会产生短路
70、XML文档定义有几种形式?它们之间有何本质差别?解析XML文档有哪几种方式?
a: 两种形式 dtd schema,b: 本质差别:schema本身是xml的,能够被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的很厉害。这个问题是由DOM的树结构所造成的,这样的结构占用的内存较多,并且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机訪问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不须要一次所有装载整个文件。
当遇到像文件开头。文档结束,或者标签开头与标签结束时,它会触发一个事件。用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序訪问
STAX:Streaming API for XML (StAX)
71、简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要同样点:Lock能完毕synchronized所实现的全部功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自己主动释放锁,而Lock一定要求程序猿手工释放。而且必须在finally从句中释放。
72、EJB的角色和三个对象
一个完整的基于EJB的分布式计算结构由六个角色组成。这六个角色能够由不同的开发商提供。每一个角色所作的工作必须遵循Sun公司提供的EJB规范。以保证彼此之间的兼容性。这六个角色各自是EJB组件开发人员(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB server提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator)
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类
73、EJB容器提供的服务
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
74、EJB规范规定EJB中禁止的操作有哪些?
1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等)。2.不能操作awt,3.不能实现server功能,4.不能对静态属生存取,5.不能使用IO操作直接存取文件系统。6.不能载入本地库.,7.不能将this作为变量和返回。8.不能循环调用。
75、remote接口和home接口主要作用
remote接口定义了业务方法,用于EJBclient调用业务方法。
home接口是EJB工厂用于创建和移除查找EJB实例
76、bean 实例的生命周期
对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理。通常包括创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是採用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。
77、EJB的激活机制
以Stateful Session Bean 为例:其Cache大小决定了内存中能够同一时候存在的Bean实例的数量,依据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当client调用某个EJB实例业务方法时。假设相应EJB Object发现自己没有绑定相应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用相应的ejbActive和ejbPassivate方法。
78、EJB的几种类型
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种
79、客服端调用EJB对象的几个基本步骤
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。
80、怎样给weblogic指定大小的内存?
在启动Weblogic的脚本中(位于所在Domian相应server文件夹下的startServerName),添加set MEM_ARGS=-Xms32m -Xmx200m,能够调整最小内存为32M,最大200M
81、怎样设定的weblogic的热启动模式(开发模式)与产品公布模式?
能够在管理控制台中改动相应server的启动模式为开发或产品模式之中的一个。
或者改动服务的启动文件或者commenv文件。添加set PRODUCTION_MODE=true。
82、怎样启动时不需输入username与password?
改动服务启动文件,添加 WLS_USER和WLS_PW项。
也能够在boot.properties文件里添加加密过的username和password.
83、在weblogic管理制台中对一个应用域(或者说是一个站点,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件里?
保存在此Domain的config.xml文件里,它是server的核心配置文件。
84、说说weblogic中一个Domain的缺省文件夹结构?比方要将一个简单的helloWorld.jsp放入何文件夹下,然的在浏览器上就可打入http://主机:port号//helloword.jsp就能够看到执行结果了? 又比方这当中用到了一个自己写的javaBean该怎样办?
Domain文件夹server文件夹applications。将应用文件夹放在此文件夹下将能够作为应用訪问,假设是Web应用。应用文件夹须要满足Web应用文件夹要求,jsp文件能够直接放在应用文件夹中,Javabean须要放在应用文件夹的WEB-INF文件夹的classes文件夹中,设置server的缺省应用将能够实如今浏览器上无需输入应用名。
85、在weblogic中公布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同。都涉及到的配置文件包含ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还须要weblogic-cmp-rdbms-jar.xml
86、怎样在weblogic中进行ssl配置与client的认证配置或说说j2ee(标准)进行ssl的配置
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,须要配置server使用Enable SSL,配置其port,在产品模式下须要从CA获取私有密钥和数字证书,创建identity和trust keystore。装载获得的密钥和数字证书。能够配置此SSL连接是单向还是双向的。
87、怎样查看在weblogic中已经公布的EJB?
能够使用管理控制台。在它的Deployment中能够查看全部已公布的EJB
88、CORBA是什么?
用途是什么?
CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture)。由对象管理组织 (Object Management Group。缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和同意应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中执行,为不同的操作系统开发。
89、说说你所熟悉或听说过的j2ee中的几种经常使用模式?及对设计模式的一些看法
Session Facade Pattern:使用SessionBean訪问EntityBean
Message Facade Pattern:实现异步调用
EJB Command Pattern:使用Command JavaBeans代替SessionBean,实现轻量级訪问
Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性
Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性
Business Interface:通过远程(本地)接口和Bean类实现同样接口规范业务逻辑一致性
EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。
90、说说在weblogic中开发消息Bean时的persistent与non-persisten的区别
persistent方式的MDB能够保证消息传递的可靠性,也就是假设EJB容器出现故障而JMSserver依旧会将消息在此MDB可用的时候发送过来。而non-persistent方式的消息将被丢弃。
91、Servlet运行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
92、j2ee经常使用的设计模式?说明工厂模式。
Java中的23种设计模式:
Factory(工厂模式)。 Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式)。 Bridge(桥梁模式)。 Composite(合成模式)。
Decorator(装饰模式)。 Flyweight(享元模式), Proxy(代理模式),
Command(命令模式)。 Interpreter(解释器模式), Visitor(訪问者模式),
Iterator(迭代子模式), Mediator(调停者模式)。 Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
工厂模式:工厂模式是一种常常被使用到的模式,依据工厂模式实现的类能够依据提供的数据生成一组类中某一个类的实例。通常这一组类有一个公共的抽象父类而且实现了同样的方法,可是这些方法针对不同的数据进行了不同的操作。首先须要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后须要定义一个工厂类,工厂类能够依据条件生成不同的子类实例。
当得到子类的实例后,开发者能够调用基类中的方法而不必考虑究竟返回的是哪一个子类的实例。
93、EJB需直接实现它的业务接口或Home接口吗,请简述理由。
远程接口和Home接口不须要直接实现,他们的实现代码是由server产生的,程序执行中相应实现类会作为相应接口类型的实例被使用。
94、排序都有哪几种方法?请列举。用JAVA实现一个高速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、高速排序)。选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
高速排序的伪代码。
/ /使用高速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素切割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用高速排序方法对left 进行排序
递归地使用高速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
95、请对下面在J2EE中经常使用的名词进行解释(或简单描写叙述)
web容器:给处于当中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其他系统问题。主要有WEBserver来实现。比如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。
我们把遵守以上标准的WEBserver就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。
更具有行业领域特色。他提供给执行在当中的组件EJB各种管理功能。仅仅要满足J2EE规范的EJB放入该容器,立即就会被容器进行高效率的管理。
而且能够通过现成的接口来获得系统级别的服务。比如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名文件夹服务。
主要提供的功能是:提供一个文件夹系统。让其他各地的应用程序在其上面留下自己的索引,从而满足高速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。
包含点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。
提供各种分布式事务服务。应用程序仅仅需调用其提供的接口就可以。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发人员通过各种部署和自己定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。
比如,远程有一台计算机上执行一个程序。它提供股票分析服务,我们能够在本地计算机上实现对其直接调用。当然这是要通过一定的规范才干在异构的系统之间进行通信。
RMI是JAVA特有的。
96、JAVA语言怎样进行异常处理,keyword:throws,throw,try,catch,finally分别代表什么意义?在try块中能够抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中。每一个异常都是一个对象。它是Throwable类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象。该对象中包括有异常信息,调用这个对象的方法能够捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。普通情况下是用try来运行一段程序,假设出现异常,系统会抛出(throws)一个异常。这时候你能够通过它的类型来捕捉(catch)它。或最后(finally)由缺省处理器来处理。
用try来指定一块预防全部“异常”的程序。
紧跟在try程序后面,应包括一个catch子句来指定你想要捕捉的“异常”的类型。
throw语句用来明白地抛出一个“异常”。
throws用来标明一个成员函数可能抛出的各种“异常”。
Finally为确保一段代码无论发生什么“异常”都被运行一段代码。
能够在一个成员函数调用的外面写一个try语句,在这个成员函数内部写还有一个try语句保护其它代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到全部的try语句都完毕。假设下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这样的“异常”的try语句。
97、一个“.java”源文件里能否够包含多个类(不是内部类)?有什么限制?
能够。必须仅仅有一个类名与文件名称同样。
98、MVC的各个部分都有那些技术来实现?怎样实现?
MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现)。 "View" 是应用的表示面(由JSP页面产生)。"Controller" 是提供应用的处理过程控制(通常是一个Servlet),通过这样的设计模型把应用逻辑。处理过程和显示逻辑分成不同的组件实现。这些组件能够进行交互和重用。
99、java中有几种方法能够实现一个线程?用什么keyword修饰同步方法? stop()和suspend()方法为何不推荐使用?
有两种实现方法,各自是继承Thread类与实现Runnable接口
用synchronizedkeyword修饰同步方法
反对使用stop()。是由于它不安全。
它会解除由线程获取的全部锁定,并且假设对象处于一种不连贯状态,那么其它线程能在那种状态下检查和改动它们。结果非常难检查出真正的问题所在。suspend()方法easy发生死锁。调用suspend()的时候。目标线程会停下来。但却仍然持有在这之前获得的锁定。
此时。其它不论什么线程都不能訪问锁定的资源,除非被“挂起”的线程恢复执行。
对不论什么线程来说。假设它们想恢复目标线程。同一时候又试图使用不论什么一个锁定的资源。就会造成死锁。
所以不应该使用suspend(),而应在自己的Thread类中置入一个标志。指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()又一次启动线程。
100、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承。请说出他们各自是哪些类?
字节流。字符流。字节流继承于InputStream OutputStream。字符流继承于InputStreamReader OutputStreamWriter。
在java.io包中还有更多的流,主要是为了提高性能和使用方便。
101、java中会存在内存泄漏吗,请简单描写叙述。
会。
如:int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。
结果会造成溢位,导致错误。
102、java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
103、垃圾回收器的基本原理是什么?垃圾回收器能够立即回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序猿创建对象时,GC就開始监控这个对象的地址、大小以及使用情况。通常,GC採用有向图的方式记录和管理堆(heap)中的全部对象。通过这样的方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
能够。
程序猿能够手动运行System.gc(),通知GC运行,可是Java语言规范并不保证GC一定会运行。
104、静态变量和实例变量的差别?
static i = 10; //常量
class A a; a.i =10;//可变
105、什么是java序列化,怎样实现java序列化?
序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化。
能够对流化后的对象进行读写操作。也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将须要被序列化的类实现Serializable接口。该接口没有须要实现的方法,implements Serializable仅仅是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就能够将參数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
106、能否够从一个static方法内部发出对非static方法的调用?
不能够,假设当中包括对象的method();不能保证对象初始化.
107、写clone()方法时,通常都有一行代码。是什么?
Clone 有缺省行为,super.clone();他负责产生正确大小的空间。并逐位复制。
108、在JAVA中。怎样跳出当前的多重嵌套循环?
用break; return 方法。
109、List、Map、Set三个接口,存取元素时。各有什么特点?
List 以特定次序来持有元素,可有反复元素。
Set 无法拥有反复元素,内部排序。
Map 保存key-value值,value可多值。
110、J2EE是什么?
J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这种一个应用系统中,可依照功能划分为不同的组件,这些组件又可在不同计算机上。而且处于对应的层次(tier)中。所属层次包含客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
111、UML方面
标准建模语言UML。用例图,静态图(包含类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
112、说出一些经常使用的类。包,接口。请各举5个
经常使用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
经常使用的包:java.lang java.awt java.io java.util java.sql
经常使用的接口:Remote List Map Document NodeList
113、开发中都用到了那些设计模式?用在什么场合?
每一个模式都描写叙述了一个在我们的环境中不断出现的问题,然后描写叙述了该问题的解决方式的核心。通过这样的方式,你能够无数次地使用那些已有的解决方式,无需在反复同样的工作。主要用到了MVC的设计模式。
用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
114、jsp有哪些动作?
作用各自是什么?
JSP共同拥有下面6种基本动作 jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:依据浏览器类型为Java插件生成OBJECT或EMBED标记。
115、Anonymous Inner Class (匿名内部类) 能否够extends(继承)其他类,能否够implements(实现)interface(接口)?
能够继承其它类或完毕其它接口,在swing编程中经常使用此方式。
116、应用server与WEB SERVER的差别?
应用server:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
117、BS与CS的联系与差别。
C/S是Client/Server的缩写。server通常採用高性能的PC、工作站或小型机,并採用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。client须要安装专用的client软件。
B/S是Brower/Server的缩写,客户机上仅仅要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,server安装Oracle、Sybase、Informix或 SQL Server等数据库。在这样的结构下,用户界面全然通过WWW浏览器实现,一部分事务逻辑在前端实现,可是主要事务逻辑在server端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S 与 B/S 差别:
1.硬件环境不同:
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门server提供连接和数据交换服务.
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般仅仅要有操作系统和浏览器即可
2.对安全要求不同
C/S 一般面向相对固定的用户群, 对信息安全的控制能力非常强. 一般高度机密的信息系统採用C/S 结构适宜. 能够通过B/S公布部分可公开信息.
B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
3.对程序架构不同
C/S 程序能够更加注重流程, 能够对权限多层次校验, 对系统执行速度能够较少考虑.
B/S 对安全以及訪问速度的多重的考虑, 建立在须要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.
4.软件重用不同
C/S 程序能够不可避免的总体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 可以相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
C/S 程序因为总体性, 必须总体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就能够实现升级.
6.处理问题不同
C/S 程序能够处理用户面固定, 而且在同样区域, 安全要求高需求, 与操作系统相关. 应该都是同样的系统
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.
7.用户接口不同
C/S 多是建立的Window平台上,表现方法有限,对程序猿普遍要求较高
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 而且大部分难度减低,减低开发成本.
8.信息流不同
C/S 程序通常是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
118、LINUX下线程。GDI类的解释。
LINUX实现的就是基于核心轻量级进程的"一对一"线程模型。一个线程实体相应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。
GDI类为图像设备编程接口类库。
119、STRUTS的应用(如STRUTS架构)
Struts是採用Java Servlet/JavaServer Pages技术。开发Web应用程序的开放源代码的framework。
採用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Struts有例如以下的主要功能: 一.包括一个controller servlet,能将用户的请求发送到对应的Action对象。 二.JSP自由tag库,而且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 三.提供了一系列有用对象:XML处理、通过Java
reflection APIs自己主动处理JavaBeans属性、国际化的提示和消息。
120、Jdo是什么?
JDO是Java对象持久化的新的规范。为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。
JDO提供了透明的对象存储,因此对开发者来说。存储数据对象全然不须要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发者解脱出来。从而集中时间和精力在业务逻辑上。另外,JDO非常灵活,由于它能够在不论什么数据底层上执行。
JDBC仅仅是面向关系数据库(RDBMS)JDO更通用,提供到不论什么数据底层的存储功能,比方关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
121、内部类能够引用他包括类的成员吗?有没有什么限制?
一个内部类对象能够訪问创建它的外部类对象的内容
122、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
Web ServiceWeb Service是基于网络的、分布式的模块化组件,它运行特定的任务。遵守详细的技术规范。这些规范使得Web Service能与其它兼容的组件进行互操作。
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你仅仅要使用这些通用的接口,当你须要改变详细的实现时候也不须要改动代码。
JAXM(Java API for XML Messaging) 是为SOAP通信提供訪问方法和传输机制的API。
WSDL是一种 XML 格式,用于将网络服务描写叙述为一组端点,这些端点对包括面向文档信息或面向过程信息的消息进行操作。
这样的格式首先对操作和消息进行抽象描写叙述,然后将其绑定到详细的网络协议和消息格式上以定义端点。相关的详细端点即组合成为抽象端点(服务)。
SOAP即简单对象訪问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注冊中心的实现标准规范,同一时候也包括一组使企业能将自身提供的Web Service注冊。以使别的企业可以发现的訪问协议的实现标准。
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。
7.
class Something {
final int i;
public void doSomething() {
System.out.println("i = " + i);
}
}
和上面一题仅仅有一个地方不同,就是多了一个final。这难道就错了吗?
答案: 错。final int i是个final的instant variable (实例变量。或叫成员变量)。
final的instant variable没有default value。必须在constructor (构造器)结束之前被赋予一个明白的值。能够改动为"final int i = 0;"。
8.
public class Something {
public static void main(String[] args) {
Something s = new Something();
System.out.println("s.doSomething() returns " + doSomething());
}
public String doSomething() {
return "Do something ...";
}
}
看上去非常完美。
答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但细致看,main是static的。
static method不能直接call non-static methods。
可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪问non-static instant variable。
9.
此处。Something类的文件名称叫OtherThing.java
class Something {
private static void main(String[] something_to_do) {
System.out.println("Do something ...");
}
}
这个好像非常明显。
答案: 正确。
从来没有人说过Java的Class名字必须和其文件名称同样。但public class的名字必须和文件名称同样。
10.
interface A{
int x = 0;
}
class B{
int x =1;
}
class C extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
答案:错误。
在编译时会错误发生(错误描写叙述不同的JVM有不同的信息,意思就是未明白的x调用,两个x都匹配(就象在同一时候import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,能够用super.x来明白。而接口的属性默认隐含为 public static final.所以能够通过A.x来明白。
11.
interface Playable {
void play();
}
interface Bounceable {
void play();
}
interface Rollable extends Playable, Bounceable {
Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {
private String name;
public String getName() {
return name;
}
public Ball(String name) {
this.name = name;
}
public void play() {
ball = new Ball("Football");
System.out.println(ball.getName());
}
}
这个错误不easy发现。
答案: 错。
"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces。所以这里没错。
问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。
不论什么在interface里声明的interface variable (接口变量,也可称成员变量),默觉得public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。
因此编译器将在"ball = new Ball("Football");"这里显示有错。
JAVA编程题
1.如今输入n个数字,以逗号。分开。然后可选择升或者降序排序;按提交键就在还有一页面显示按什么排序,结果为,提供reset
import java.util.*;
public class bycomma{
public static String[] splitStringByComma(String source){
if(source==null||source.trim().equals(""))
return null;
StringTokenizer commaToker = new StringTokenizer(source,",");
String[] result = new String[commaToker.countTokens()];
int i=0;
while(commaToker.hasMoreTokens()){
result[i] = commaToker.nextToken();
i++;
}
return result;
}
public static void main(String args[]){
String[] s = splitStringByComma("5,8,7,4,3,9,1");
int[] ii = new int[s.length];
for(int i = 0;i<s.length;i++){
ii[i] =Integer.parseInt(s[i]);
}
Arrays.sort(ii);
//asc
for(int i=0;i<s.length;i++){
System.out.println(ii[i]);
}
//desc
for(int i=(s.length-1);i>=0;i--){
System.out.println(ii[i]);
}
}
}
2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
package test.format;
import java.text.NumberFormat;
import java.util.HashMap;
public class SimpleMoneyFormat {
public static final String EMPTY = "";
public static final String ZERO = "零";
public static final String ONE = "壹";
public static final String TWO = "贰";
public static final String THREE = "叁";
public static final String FOUR = "肆";
public static final String FIVE = "伍";
public static final String SIX = "陆";
public static final String SEVEN = "柒";
public static final String EIGHT = "捌";
public static final String NINE = "玖";
public static final String TEN = "拾";
public static final String HUNDRED = "佰";
public static final String THOUSAND = "仟";
public static final String TEN_THOUSAND = "万";
public static final String HUNDRED_MILLION = "亿";
public static final String YUAN = "元";
public static final String JIAO = "角";
public static final String FEN = "分";
public static final String DOT = ".";
private static SimpleMoneyFormat formatter = null;
private HashMap chineseNumberMap = new HashMap();
private HashMap chineseMoneyPattern = new HashMap();
private NumberFormat numberFormat = NumberFormat.getInstance();
private SimpleMoneyFormat() {
numberFormat.setMaximumFractionDigits(4);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setGroupingUsed(false);
chineseNumberMap.put("0", ZERO);
chineseNumberMap.put("1", ONE);
chineseNumberMap.put("2", TWO);
chineseNumberMap.put("3", THREE);
chineseNumberMap.put("4", FOUR);
chineseNumberMap.put("5", FIVE);
chineseNumberMap.put("6", SIX);
chineseNumberMap.put("7", SEVEN);
chineseNumberMap.put("8", EIGHT);
chineseNumberMap.put("9", NINE);
chineseNumberMap.put(DOT, DOT);
chineseMoneyPattern.put("1", TEN);
chineseMoneyPattern.put("2", HUNDRED);
chineseMoneyPattern.put("3", THOUSAND);
chineseMoneyPattern.put("4", TEN_THOUSAND);
chineseMoneyPattern.put("5", TEN);
chineseMoneyPattern.put("6", HUNDRED);
chineseMoneyPattern.put("7", THOUSAND);
chineseMoneyPattern.put("8", HUNDRED_MILLION);
}
public static SimpleMoneyFormat getInstance() {
if (formatter == null)
formatter = new SimpleMoneyFormat();
return formatter;
}
public String format(String moneyStr) {
checkPrecision(moneyStr);
String result;
result = convertToChineseNumber(moneyStr);
result = addUnitsToChineseMoneyString(result);
return result;
}
public String format(double moneyDouble) {
return format(numberFormat.format(moneyDouble));
}
public String format(int moneyInt) {
return format(numberFormat.format(moneyInt));
}
public String format(long moneyLong) {
return format(numberFormat.format(moneyLong));
}
public String format(Number moneyNum) {
return format(numberFormat.format(moneyNum));
}
private String convertToChineseNumber(String moneyStr) {
String result;
StringBuffer cMoneyStringBuffer = new StringBuffer();
for (int i = 0; i < moneyStr.length(); i++) {
cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1)));
}
//拾佰仟万亿等都是汉字里面才有的单位,加上它们
int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
int moneyPatternCursor = 1;
for (int i = indexOfDot - 1; i > 0; i--) {
cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));
moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;
}
String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));
cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length());
while (cMoneyStringBuffer.indexOf("零拾") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);
}
while (cMoneyStringBuffer.indexOf("零佰") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);
}
while (cMoneyStringBuffer.indexOf("零仟") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);
}
while (cMoneyStringBuffer.indexOf("零万") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND);
}
while (cMoneyStringBuffer.indexOf("零亿") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION);
}
while (cMoneyStringBuffer.indexOf("零零") != -1) {
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO);
}
if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)
cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length());
cMoneyStringBuffer.append(fractionPart);
result = cMoneyStringBuffer.toString();
return result;
}
private String addUnitsToChineseMoneyString(String moneyStr) {
String result;
StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr);
int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);
cMoneyStringBuffer.insert(cMoneyStringBuffer.length() - 1, JIAO);
cMoneyStringBuffer.insert(cMoneyStringBuffer.length(), FEN);
if (cMoneyStringBuffer.indexOf("零角零分") != -1)//没有零头,加整
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"), cMoneyStringBuffer.length(), "整");
else
if (cMoneyStringBuffer.indexOf("零分") != -1)//没有零分,加整
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"), cMoneyStringBuffer.length(), "整");
else {
if(cMoneyStringBuffer.indexOf("零角")!=-1)
cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),cMoneyStringBuffer.indexOf("零角")+2);
// tmpBuffer.append("整");
}
result = cMoneyStringBuffer.toString();
return result;
}
private void checkPrecision(String moneyStr) {
int fractionDigits = moneyStr.length() - moneyStr.indexOf(DOT) - 1;
if (fractionDigits > 2)
throw new RuntimeException("金额" + moneyStr + "的小数位多于两位。"); //精度不能比分低
}
public static void main(String args[]) {
System.out.println(getInstance().format(new Double(10010001.01)));
}
}
3、继承时候类的运行顺序问题,一般都是选择题,问你将会打印出什么?
答:父类:
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
4、内部类的实现方式?
答:演示样例代码例如以下:
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
5、Java 的通信编程,编程题(或问答)。用JAVA SOCKET编程,读server几个字符,再写入本地显示?
答: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:"+Remo
###############################################################################################
###【第二部分:难度比較大】###
###############################################################################################
某公司Java面试题及部分解答(难度较大)
1。
请大概描写叙述一下Vector和ArrayList的差别,Hashtable和HashMap的差别。
这两个类都实现了List接口(List接口继承了Collection接口)。他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后能够按位置索引號取出某个元素,。而且当中的数据是同意反复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不能够按索引號去检索当中的元素,也不同意有反复的元素(本来题目问的与hashset没有不论什么关系,但为了说清楚ArrayList与Vector的功能。我们使用对例如式。更有利于说明问题)。 接着才说ArrayList与Vector的差别,这主要包含两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。假设仅仅有一个线程会訪问到集合,那最好是使用ArrayList,由于它不考虑线程安全。效率会高些;假设有多个线程会訪问到集合,那最好是使用Vector,由于不须要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的。是java一诞生就提供了的。它们是线程安全的。ArrayList与HashMap是java2时才提供的。它们是线程不安全的。所以,我们讲课时先讲老的。(2)数据增长: ArrayList与Vector都有一个初始的容量大小。当存储进它们里面的元素的个数超过了容量时,就须要添加ArrayList与Vector的存储空间,每次要添加存储空间时。不是仅仅添加一个存储单元。而是添加多个存储单元,每次添加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。
Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明白规定(从源码看到的是增长为原来的1.5倍)。ArrayList与Vector都能够设置初始的空间大小。Vector还能够设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍。ArrayList添加原来的0.5倍。
HashMap同意将null作为一个entry的key或者value,而Hashtable不同意。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。由于contains方法easy让人引起误解。
Hashtable继承自Dictionary类。而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程訪问Hashtable时,不须要自己为它的方法实现同步。而HashMap 就必须为之提供外同步。
2。
请问你在什么情况下会在你的JAVA代码中使用可序列化?(5)
为什么放到HttpSession中的对象必需要是可序列化的?(5)
为什么要序列化呢? 由于在我们的系统中,某些类实例化为对象后,将会在网络中传送。而我们知道,网络传输仅仅能2进制文件。 这就像你要搬一个大家俱通过一个小门。你得先把家俱拆散,到屋里后再把这些组件又一次组合为你的大家俱。 也就是说,当你的对象会被通过网络来传送时。那就必需要序列化。 放到httpSession中的对象。必然会被使用网络来传输的。
3。为什么在重写了equals()方法之后也必须重写hashCode()方法?(10)
我们都知道Java语言是全然面向对象的,在java中,全部的对象都是继承于Object类。
Ojbect类中有两个方法equals、hashCode。这两个方法都是用来比較两个对象是否相等的。
对于值对象,==比較的是两个对象的值,对于引用对象。比較的是两个对象的地址。默认的equals方法同==。一般来说我们的对象都是引用对象,要重写equals方法。再举一个样例,如今有一个学生对象,有属性学号跟姓名,如今我新建了一个学生对象。又从数据里查出一个学生对象。这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?普通情况下,除非你有特殊需求要处理。这两个对象是相等的。可假设用==去比較,返回的结果是错误的。
这时候我们就必须重写equlas方法了。假设学号是主键,在equals方法里,我们觉得仅仅要学号同样。就能够返回true。
hashCode方法也是能够用来比較两个对象是否相等的。可是我们非常少使用,应该说是非常少直接使用。
hashCode方法返回的是一个int值,能够看做是一个对象的唯一编码,假设两个对象的hashCode值同样。我们应该觉得这两个对象是同一个对象。一般假设使用java中的Map对象进行存储时,他会自己主动调用hashCode方法来比較两个对象是否相等。所以假设我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证同样的对象返回同样的hash值。不同的对象返回不同的hash值。如上面的学生样例,假设学号同样,无论姓名相不同样。返回的hash值一定要是一样的,这时我们的hash值仅仅与学号有关。
4。sleep()和wait()有什么差别?(10)
第一种解释:
功能差点儿相同,都用来进行线程控制,他们最大本质的差别是:sleep()不释放同步锁,wait()释放同步缩.
还实使用方法的上的不同是:sleep(milliseconds)能够用时间指定来使他自己主动醒过来,假设时间不到你仅仅能调用interreput()来强行打断;wait()能够用notify()直接唤起.
另外一种解释:
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程运行,比如:
try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
}
catch(IntrruptedException e) {
}
wait是Object的方法。也就是说能够对随意一个对象调用wait方法。调用wait方法将会将调用者的线程挂起,直到其它线程调用同一个对象的notify方法才会又一次激活调用者,比如:
//Thread 1
try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}
第三种解释:
这两者的施加者是有本质差别的.
sleep()是让某个线程暂停执行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比方说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不马上烧水,我要歇息一段时间再烧.对于执行的主动权是由我的流程来控制.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是堵塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该运行1后运行2,再运行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不运行3,但正个流程并没有结束,我一直想去煮饭,但还没被同意, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就能够煮饭了,这个被暂停的线程就会从暂停处 继续运行.
事实上两者都能够让线程暂停一段时间,可是本质的差别是一个线程的执行状态控制,一个是线程之间的通讯的问题
在java.lang.Thread类中,提供了sleep(),
而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
sleep()能够将一个线程睡眠。參数能够指定一个时间。
而wait()能够将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds).
sleep和wait的差别有:
1,这两个方法来自不同的类各自是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁。使得其它线程能够使用同步控制块或者方法。
3。wait,notify和notifyAll仅仅能在同步控制方法或者同步控制块里面使用,而sleep能够在
不论什么地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不须要捕获异常
有三种: (1)继承Thread类,重写run函数 创建: class xx extends Thread{ public void run(){ Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态。并释放资源 }} 开启线程: 对象.start() //启动线程,run函数运行 (2)实现Runnable接口,重写run函数 开启线程: Thread t = new Thread(对象) //创建线程对象 t.start() (3)实现Callable接口,重写call函数 Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程运行的任务。 Callable和Runnable有几点不同: ①Callable规定的方法是call(),而Runnable规定的方法是run(). ②Callable的任务运行后可返回值,而Runnable的任务是不能返回值的 ③call()方法可抛出异常。而run()方法是不能抛出异常的。 ④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完毕的方法,以等 待计算的完毕,并检索计算的结果.通过Future对象可了解任务运行情况,可取消任务的运行,还可获取任务运行的结果
5。编程题:用最有效率的方法算出2乘以17等于多少?(5)
6。
JAVA是不是没有内存泄漏问题?看以下的代码片段。并指出这些代码隐藏的问题。
(10)
Object[] elements = new Object[10];
int size;
...
public Object pop() {
if (size == 0)
return null;
Object o = elements[--size];
return o;
}
7。请阐述一下你对JAVA多线程中“锁”的概念的理解。(10)
8。
全部的递归实现都能够用循环的方式实现。请描写叙述一下这两种实现方式各自的优劣。
并举例说明在什么情况下能够使用递归,而在什么情况下仅仅能使用循环而不能使用递归?(5)
9。请简要讲一下你对測试驱动开发(TDD)的认识。(10)
10。
请阐述一下你对“面向接口编程”的理解。(10)
11。
在J2EE中有一个“容器(Container)”的概念,无论是EJB、PICO还是Spring都有他们
各自实现的容器,受容器管理的组件会具有有生命周期的特性。请问,为什么须要容器?
它的优点在哪里?它会带来什么样的问题?(15)
12。请阐述一下你对IOC(Inversion of Control)的理解。
(能够以PICO和Spring的IOC作为样例说明他们在实现上各自的特点)(10)
13。以下的代码在绝大部分时间内都执行得非常正常。请问在什么情况下会出现故障?问题的根源在哪里?(10)
import java.util.LinkedList;
public class Stack {
LinkedList list = new LinkedList();
public synchronized void push(Object x) {
synchronized(list) {
list.addLast( x );
notify();
}
}
public synchronized Object pop()
throws Exception {
synchronized(list) {
if( list.size() <= 0 ) {
wait();
}
return list.removeLast();
}
}
}
解答:
。请大概描写叙述一下Vector和ArrayList的差别。Hashtable和HashMap的差别。(5)线程安全与否
2。
请问你在什么情况下会在你的JAVA代码中使用可序列化?(5)cluster中session复制,缓存persist与reload
为什么放到HttpSession中的对象必需要是可序列化的?(5)没必须,只是session反序列化过程会导致对象不可用.
3。为什么在重写了equals()方法之后也必须重写hashCode()方法?(10)API规范
4。
sleep()和wait()有什么差别?(10)前者占用CPU,后者空暇CPU
5。
编程题:用最有效率的方法算出2乘以17等于多少?(5)17>>1
6。JAVA是不是没有内存泄漏问题?看以下的代码片段,并指出这些代码隐藏的问题。(10)不是
...
...没发现内存泄漏的问题
7。
请阐述一下你对JAVA多线程中“锁”的概念的理解。
(10)同步因子,在某段代码上添加同步因子,那么整个JVM内部仅仅能最多有一个线程运行这段,其余的线程按FIFO方式等待运行.
8。全部的递归实现都能够用循环的方式实现。请描写叙述一下这两种实现方式各自的优劣。
并举例说明在什么情况下能够使用递归。而在什么情况下仅仅能使用循环而不能使用递归?(5)没发现全部的递归都能够用循环实现的,尤其是那种不知道循环重数的递归算法.递归的长处是简炼,抽象性好;循环则更直观.递归一般用于处理一级事务能转化成更简的二级事务的操作.归纳不出二级事务或者二级事务更复杂的情况不能用.
9。请简要讲一下你对測试驱动开发(TDD)的认识。(10)不认识
10。请阐述一下你对“面向接口编程”的理解。(10)1,利于扩展;2,暴露更少的方法;
11。在J2EE中有一个“容器(Container)”的概念。无论是EJB、PICO还是Spring都有他们
各自实现的容器。受容器管理的组件会具有有生命周期的特性,请问,为什么须要容器?
它的优点在哪里?它会带来什么样的问题?(15)组件化,框架设计...
12。请阐述一下你对IOC(Inversion of Control)的理解。(能够以PICO和Spring的IOC作为样例说明他们在实现上各自的特点)(10)不理解
13。以下的代码在绝大部分时间内都执行得非常正常,请问在什么情况下会出现故障?问题的根源在哪里?(10)wait和notify使用目的不能达到,wait()的obj,自身不能notify().出题人对wait和notify机制不够理解.
import java.util.LinkedList;
public class Stack {
LinkedList list = new LinkedList();
public synchronized void push(Object x) {
synchronized(list) {
list.addLast( x );
notify();
}
}
public synchronized Object pop()
throws Exception {
synchronized(list) {
if( list.size() <= 0 ) {
wait();
}
return list.removeLast();
}
}
}
你拿了多少分?
1。请大概描写叙述一下Vector和ArrayList的差别,Hashtable和HashMap的差别。(5)
// thread-safe or unsafe, could contain null values or not
2。请问你在什么情况下会在你的JAVA代码中使用可序列化?(5)
为什么放到HttpSession中的对象必需要是可序列化的?(5)
// save, communicate
3。
为什么在重写了equals()方法之后也必须重写hashCode()方法?(10)
// implementations of dictionaries need hashCode() and equals()
4。sleep()和wait()有什么差别?(10)
// threads communication: wait() and notifyAll()
5。编程题:用最有效率的方法算出2乘以17等于多少?(5)
// 2<<4+2
6。JAVA是不是没有内存泄漏问题?看以下的代码片段。并指出这些代码隐藏的问题。(10)
...
Object[] elements = new Object[10];
int size;
...
public Object pop() {
if (size == 0)
return null;
Object o = elements[--size];
return o;
}
// elements[size] = null;
7。请阐述一下你对JAVA多线程中“锁”的概念的理解。(10)
// optimistic lock, pessimistic lock, signal, dead lock, starvation, synchronization
8。
全部的递归实现都能够用循环的方式实现,请描写叙述一下这两种实现方式各自的优劣。
并举例说明在什么情况下能够使用递归,而在什么情况下仅仅能使用循环而不能使用递归?(5)
// recursive: when you need a stack and stack memory is enough
// non-recursive: when you need a queue
9。请简要讲一下你对測试驱动开发(TDD)的认识。
(10)
// write unit testing code first
10。请阐述一下你对“面向接口编程”的理解。(10)
// adapter, listener, bridge, decorator, proxy... patterns
11。
在J2EE中有一个“容器(Container)”的概念,无论是EJB、PICO还是Spring都有他们
各自实现的容器。受容器管理的组件会具有有生命周期的特性。请问。为什么须要容器?
它的优点在哪里?它会带来什么样的问题?(15)
// encapsulation
12。
请阐述一下你对IOC(Inversion of Control)的理解。(能够以PICO和Spring的IOC作为样例说明他们在实现上各自的特点)(10)
// reduce classes' dependencies
13。以下的代码在绝大部分时间内都执行得非常正常,请问在什么情况下会出现故障?问题的根源在哪里?(10)
import java.util.LinkedList;
public class Stack {
LinkedList list = new LinkedList();
public synchronized void push(Object x) {
synchronized(list) {
list.addLast( x );
notify();
}
}
public synchronized Object pop()
throws Exception {
synchronized(list) {
if( list.size() <= 0 ) {
wait();
}
return list.removeLast();
}
}
}
// dead lock, synchronized on both 'list' and 'this'