Java面试集锦

来源:互联网 发布:bim软件怎么安装 编辑:程序博客网 时间:2024/06/05 21:01

㈠ JAVA相关基础知识:
1面向对象的特征有哪些方面?
⑴抽象:
①忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面;
②抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
③抽象包括两个方面:一是过程抽象;二是数据抽象。
⑵继承:
①继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性
的方法;
②对象的一个新类可以从现有的类中派生,这个过程成为类继承;
③新类继承了原始类的特性,新类成为原始类的派生类(子类),而原始类成为新类的基类
(父类);
④派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之
更适合特殊的需要。
⑶封装:
①封装就是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
②面向对象计算始于这个基本概念,即现实世界可被描绘成一系列完全自治、封装的对象;
③这些对象通过一个受保护的接口访问其他对象。
⑷多态性:
①多态性:指允许不同类的对象对同一消息作出响应;
②多态性:包括参数化多态性和包含多态性;
③多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数
同名问题。

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为每个原始类型提供了封装类,原始类型封装类如下:
boolean Boolean char Character byte Byte
short Short int Integer long Long
float Float double Double
⑷引用类型和原始类型的行为完全不同,并且它们具有不同的意义;
⑸引用类型和原始类型具有不同的特征和用法,包括:大小和速度问题,这种类型以哪种类
型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。
⑹对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。

4 String和StringBuffer的区别:
⑴JAVA平台提供了两个类:String和StringBuffer,可以存储和操作字符串,即包含多个字
符的字符数据;
⑵String类:提供了数值不可改变的字符串;StringBuffer类:提供的字符串可以修改;
⑶如果字符数据要改变,使用StringBuffer:可以使用StringBuffers来动态构造字符数据。

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

6 说出Servlet的生命周期,并说出Servlet和CGI的区别?
⑴Servlet被服务器实例化后,容器运行其init方法,请求到达时运行去service方法,
service方法自动派遣运行与请求 对应的doXXX方法(doGet,doPost)等,当服务器决定将
实例销毁的时候调用其destroy方法;
⑵与CGI的区别:在于servlet处理服务器进程中,它通过多舷窗那个方式运行其service方
法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生
新的进程,服务完成后就销毁,所以效率上要低于servlet。

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

8 EJB是基于哪些技术实现的?并说出Session和EntityBean的区别:
⑴EJB包括SessionBean(会话)、EntityBean(实体)、MessageDrivenBean(消息驱动);
①SessionBean:在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据
库、调用其他EJB组件;是一种非持久性对象,它代表一个存储在持久性存储器中的实
体的对象视图,或是一个由于现有企业应用程序实现的实体;
ⅰ.Stateful SessionBean:将系统逻辑放在method之中执行,可以记录呼叫者的状态;
可以维持使用者的状态;通常来说,一个使用者会有一个相对应的Stateful
SessionBean的实体;
ⅱ.Stateless SessionBean:也是逻辑组件,不负责记录使用者状态,但消耗内存较少;
②EntityBean :被用来代表应用程序系统用到的数据;
⑵EJB基于:JNDI(Java命名与目录接口)、RMI(远程消息调用)、JAT(Java事务管理)等实现;

9 Collection和Collections的区别?
⑴Collection是集合类的上级接口,继承与他的接口主要有:Set和List;
⑵Collections是针对集合类的一个帮助类,他提供了一系列静态方法实现对各种集合的搜
索、排序、线程安全化等操作;

10 &和&&的区别?
⑴& :是位运算符,表示按位与运算;
⑵&& :是逻辑运算符,表示逻辑与(and);

11 HashMap和Hashtable的区别?
⑴HashMap :是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口;
⑵HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable;
⑶允许将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算法都大概一样,所以性能不会有很大的差异。

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类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类,取而
代之,在子类中实现该方法,知道其行为的其他类可以在类中实现这些方法。
⑵接口(inteface):是抽象类的实体,在接口中,所有方法都是抽象的,多继承性可通过实
现这样的接口而获得。
①接口中的所有方法都是抽象的,没有一个有程序体;
②接口只可以定义static final成员变量;接口的实现与子类相似,除了该实现类不能从
接口定义中继承行为;
③当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法;
④然后,它可以在实现了该接口的类的任何对象上调用接口的方法;
⑤由于有抽象类,它允许使用该接口名作为引用变量的类型。通常的动态联编将生效。引
用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的
类是否实现了接口。

18 heap和stack有什么区别?
⑴栈:是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方
式进行处理;
⑵堆:是栈的一个组成元素。

19 forward和redirect的区别?
⑴forward: 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容
读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的
内容是从哪里来的,所以它的地址栏中还是原来的地址。转发时并不通知客
户机,对象可以存储在请求中,并发给下一个资源使用,并且完全在服务器
上面进行;
⑵redirect:就是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,
一般来说,浏览器会用刚才请求的所有参数重新请求,所以session,request
参数都可以获取。重定向导致浏览器发出了新的请求,在重定向之前存储为
请求属性的任何对象都会消失,这是最大的区别。

20 EJB和JAVA BEAN的区别?
⑴JAVA BEAN是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java
类都可以是一个Bean;
⑵通常情况下,由于Java Bean实际上是被容器所创建(如Tomcat)的,所以Java Bean应具有
一个无参的构造器,另外,JavaBean还要实现Serializable接口用于实现Bean的持久性。
⑶Java Bean相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的;
⑷Enterprise JavaBean:相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)
技术的,所以EJB可被远程访问(跨进程、跨计算机),但EJB必须被部署在诸如Webspere、
WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件, 而是通过其容器访问;
⑸EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的
EJB操作。

21 Static Nested Class和Inner Class的区别?
⑴Static Nested Class是被声明为静态(static)的内部类,可不依赖外部类实例被实例化;
⑵通常的Inner Class需要在外部类实例化后才能实例化。

22 JSP动态INCLUDE与静态INCLUDE的区别?
⑴动态INCLUDE:用jsp:include动作实现 “true”/>,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
⑵静态INCLUDE用include伪码实现,它不会检查所含文件的变化,适用于包含静态页面
<%@ include file=”included.htm”%>。

23 什么时候用assert?
⑴assertion(断言):在软件开发中是一种常用的调试方式,很多开发语言都支持这种机制;
⑵在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个
正确程序必须保证这个boolean表示式的值为true;如果该值为false,说明程序已经处于
不正确的状态下,系统将给出警告或退出;
⑶一般来说,assertion用于保证程序最基本、关键的正确性。Assertion检查通常在开发和
测试时开启;
⑷为了提高性能,在软件发布后,assertion检查通常是关闭的。

24 GC是什么?为什么要有GC?
⑴GC:是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,
忘记或错误的内存回收会导致程序或系统的不稳定甚至崩溃,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 设计四个线程,其中两个线程每次对j增加1,另外两个线程对j减少1。写出程序:
⑴以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题;
⑵程序代码如下:

public class ThreadTest1{                                                   private int j;                                                  public static void main(Stringp[] 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?
goto是java中的保留字,现在没有在java中使用。

30 启动一个线程是run()还是start()?
⑴启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味
着它可以由JVM调度并执行;
⑵这并不意味着线程就会立即执行。Run()方法可以产生必须退出的标志来停止一个线程。

31 EJB包括(SessionBean,EntityBean)说出它们的生命周期,及如何管理事务的?
⑴SessionBean:
①Stateless SessionBean的生命周期是由容器决定的,当客户机发出请求要建立一个
Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便
找一个现有的实例提供给客户机;
②当客户机第一次调用一个Stateful SessionBean时,容器必须立即在服务器中创建一
个新的Bean实例,并关联到客户机上,以后客户机调用Stateful SessionBean的方法
时容器会将调用分派到与此客户机相关联的Bean实例;
⑵EntityBean:
①EntityBean能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,
EntityBeans就一直存活。而不是按照应用程序或服务进程来说的;
②即使EJB容器崩溃了,Entity Beans也是存活的。EntityBeans生命周期能够被容器或
Beans自己管理。
⑶EJB通过以下技术管理事务:
①对象管理组织(OMG)的对象事务服务(OTS),Sun Microsystems的Transaction Service
(JTS)、Java Transaction API(JTA),开发组(X/Open)的XA接口。

32 常用的应用服务器有哪些?
常用的应用服务器有: BEA WebLogic Server, IBM WebSphere Application Server,
Oracle9i Application Server, jBoss , Tomcat

33 给我一个你最常见的runtime exception?
最常见的runtime exception是:
⑴ArithmeticException,ArrayStoreException,BufferOverflowException,
⑵CannotRedoException,CannotUndoException,ClassCastException, CMMException,
⑶DOMException,EmptyStackException,IllegalArgumentException,
⑷IllgalPathStateException,IllegalStateException,IndexOutOfBoundsException,
⑸NegativeArraySizeException,NoSuchElementException,NullPointerException,
⑹SystemException,UndeclaredThrowableException,UnsupportedOperationException。

34 接口是否可以继承接口?抽象类是否可以实现(implements)接口?抽象类是否可继承实
体类(concrete class)?
⑴接口可以继承接口;
⑵抽象类可实现(implements)接口;
⑶抽象类是否可继承实体类,前提是实体类必须有明确的构造函数;

35 List,Set,Map是否继承自Collection接口?
List,Set是继承自Collection接口,但是Map不是。

36 说出数据库连接池的工作机制是什么?
⑴J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接;
⑵客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙;
⑶如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参
数决定;
⑷当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这
个连接。

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是否可被orverride?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

41 是否可以继承String类?
String类是final类,因此不可以继承。

42 switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是
int、short、char或byte。 long,String都不能作用于switch上。

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 Sington(){}                                                     private static Singleton instance=new Singleton();                                                      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允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自
由选择在何时用throw关键字引发异常,所有的异常都是java.lang.throwable的子类。

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可以存
储用户的状态信息;
⑹application对象:表示一个javax.servlet.ServletContext对象。这有助于查找有关
servlet引擎和servlet环境的信息;
⑺config对象:表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet
实例的初始化参数;
⑻page对象:表示从该页面产生的一个servlet实例。

58 线程的基本概念、线程的基本状态以及状态之间的关系?
⑴线程:是指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有
一个线程,也就是程序本身;
⑵Java中的线程有四种状态:运行、就绪、挂起和结束。

59 JSP的常用指令?
⑴<%@page language=”java” contentType=”test/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 四种会话跟踪技术?
⑴会话作用域ServletJSP页面描述:
①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() :返回客户端的所有Cookie对象,结果是一个Cookie数组
⑸getCharacterEncoding() :返回请求中的字符编码方式
⑹getContentLength() :返回请求的Body的长度
⑺getHeader(String name) :获得HTTP协议定义的文件头信息
⑻getHeaders(String name) :返回指定名字的request Header的所有值,
结果是一个枚举的实例
⑼getHeaderNames() :返回所有request Header的名字,结果是一个枚举的实例
⑽getInputStream() :返回请求的输入流,用于获得请求中的数据
⑾getMethod() :获得客户端向服务器端传送数据的方法
⑿getParameter(String name) :获得客户端传送给服务器端的有name指定的参数值
⒀getParameterNames() :获得客户端传送给服务器端的所有参数的名字,
结果是一个枚举的实例
⒁getParameterValues(String name) :获得有name指定的参数的所有值
⒂getProtocol() :获取客户端向服务器端传送数据所依据的协议名称
⒃getQueryString() :获得查询字符串
⒄getRequestURI() :获取发出请求字符串的客户端地址
⒅getRemoteAddr() :获取客户端的IP地址
⒆getRemoteHost() :获取客户端的名字
⒇getSession([Boolean create]) :返回和请求相关Session
[21]getServletName() :获取服务器的名字
[22]getServletPath() :获取客户端所请求的脚本文件的路径
[23]getServletPort() :获取客户端的端口号
[24]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 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?
⑴条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而已可以操作数值型;
⑵逻辑操作不会产生短路。

70 XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
⑴XML文档有两种形式:dtd和schema;
⑵本质区别:schema本身是xml的,可以被xml解析器解析(这也是从DTD上发展schema的
(根本目的);
⑶解析xml文档有: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);
②部署者(Deployer);
③EJB服务器提供者(EJB Server Provider);
④应用组合者(Application Assembler);
⑤EJB容器提供者(EJB Container Provider);
⑥系统管理员(System Administrator);
⑶三个对象是:Remote(Local)接口、Home(LocalHome)接口和Bean类。

73 EJB容器提供的服务?
主要提供:声明周期管理,代码产生,持续性管理,安全,事务管理,锁和并发性管理等服务。

74 EJB规范规定EJB中禁止的操作有哪些?
⑴不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等);
⑵不能操作awt;
⑶不能实现服务器功能;
⑷不能对静态属性存取;
⑸不能使用IO操作直接存取文件系统;
⑹不能加载本地库;
⑺不能将this作为变量和返回;
⑻不能循环调用。

75 remote接口和home接口主要作用?
⑴remote接口:定义了业务方法,用于EJB客户端调用业务方法;
⑵home接口 :是EJB工厂用于创建和移除查找EJB实例。

76 bean实例的声明周期?
⑴对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理;
⑵而对于Entity Bean和Stateful Session Bean存在Cache管理;通常包含创建实例,设置
上下文、创建EJB Object(create)、业务方法调用、remove等过程;
⑶对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度
机制不断重用实例;
⑷而对于存在cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例
数量。

77 EJB的激活机制?
以Stateful Session Bean为例:其Cache大小决定了内存中可以同时存在的Bean实例的数
量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某
个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的脚本中(位于所在Domain对应服务器目录下的startServerName),
增加setMEM_ARGS=-Xms32m-Xmx200m,可以调整最小内存为32M,最大200M。

81 如何设定WebLogic的热启动模式(开发模式)与产品发布模式?
⑴可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一;
⑵或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。

82 如何启动时不需要输入用户名与密码?
⑴修改服务启动文件,增加WLS_USER和WLS_PW项;
⑵也可以在boot.properties文件中增加加密过的用户名和密码。

83 在weblogic管理控制台中对一个应用域(或者说一个网站,Domain)进行jms及ejb或连接池等
相关信息进行配置后,实际保存在什么文件中?
保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

84 说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目
录下,然后在浏览器上就可以打入http://主机:端口号//helloWorld.jsp就可以看到运行
结果了?又比如这其中用到了一个自己些的javaBean该如何办?
⑴Domain目录\服务器目录\applications,将应用目录放在此目录下将可以作为应用访问;
⑵如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,
JavaBean需要放在应用目录的WEB-INF目录的classes目录中;
⑶设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。

85 在WebLogic中发布ejb需涉及到哪些配置文件?
⑴不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括:ejb-jar.xml,
weblogic-ejb-jar.xmlCMP
⑵实体Bean一般还需要:WebLogic-cmp-rdbms-jar.xml

86 如何在WebLogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置?
⑴缺省安装中使用DemoIdentity.jks和DemoTrust.jks;
⑵KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从
CA获取有密钥和数字证书,创建identity和trustKeystore,装载获得的密钥和数字证书。
可以配置此SSL连接是单向还是双向的。

87 如何查看在WebLogic中已经发布的EJB?
可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB。

88 CORBA是什么?用途是什么?
⑴CORBA标准:是公共对象请求代理结构(Common Object Request Broker Architecture),
由对象管理组织(Object Management Group,缩写为OMG)标准化;
⑵它的组成是接口定义语言(IDL),语言绑定(binding;也译为联编)和允许应用程序间
互相操作的协议;
⑶其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。

89 说说你熟悉或听说过的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(责任链模式)
⑵工厂模式:是一种经常被使用到的模式,根据工程模式实现的类可以根据提供的数据生
成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现
了相同的方法,但是这些方法针对不同的数据进行不同的操作。首先,需要
定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后,需
要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类
的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个
子类的实例。

90 EJB架构?
⑴Session Façade Pattern :使用SessionBean访问EntityBean;
⑵Message Façade Pattern :实现异步调用;
⑶EJB Command Pattern :使用Command JavaBeans取代SessionBean,实现轻量级访问;
⑷Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性;
⑸Generic Attribute Access:通过AttributeAccess接口简化EntityBean的数据提供特性;
⑹Business Interface :通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性;
⑺EJB架构的设计好坏将直接影响系统的性能,可扩展性,可维护性,组件可重用性及开发效率;
⑻项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

91 说说在weblogic中开发消息Bean时的persistent与non-persistent的差别?
⑴persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS
服务器仍然会将消息在此MDB可用的时候发送过来;
⑵而non-persistent:方式的消息将被丢弃。

92 Servlet执行时一般实现哪几个方法?
⑴public void init(ServletConfig config)
⑵public ServletConfig getServletConfig()
⑶public String getServletInfo()
⑷public void service(ServletRequest request,Servlet response)
⑸public void destroy()

93 EJB需要直接实现它的业务接口或Home接口吗?请简述理由。
⑴远程接口和Home接口不需要直接实现,它们的实现代码是由服务器产生的;
⑵程序运行中对应实现类会作为对应接口类型的实例被使用。

94 排序都有哪几种方法?请列举,用Java实现一个快速排序。
⑴排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),
选择排序(直接选择排序、堆排序)、归并排序、分配排序(箱排序、基数排序)、
⑵快速排序的伪代码:使用快速排序方法对a[0:n-1]排序
①从a[0:n-1]中选择一个元素作为middle,该元素为支点;
②把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中
的元素都大于等于支点;
③递归地使用快速排序方法对left进行排序;
④递归地使用快速排序方法对right进行排序;
⑤所得结果为left+middle+right。

95 请对以下在J2EE中常用的名词进行解释(或简单描述)?
⑴Web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,是JSP,SERVLET直接
给跟容器中的环境变量接口交互,不必关注其它系统问题。
①主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WENSPHERE等;
②该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION标准;
③我们把遵守以上标准的WEB服务器就叫做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语言如何进行异常处理,关键字: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语句都完成
。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这
种”异常”的try语句。

97 一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。必须只是一个类名与文件名相同。

98 MVC的各个部分都有哪些技术来实现?如何实现?
⑴MVC是Model-View-Controller的简写;
⑵”Model”代表的是应用的业务逻辑(通过JavaBean,EJB组件实现);
⑶”View”是应用的表示面(由JSP页面产生);
⑷”Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用
逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。

99 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?Stop()和suspend()
方法为何不推荐使用?
⑴有两种方法可以实现线程,分别是:继承Thread类与实现Runnable接口;
⑵用synchronized关键字修饰同步方法;
⑶反对使用stop(),是因为它不安全。它会接触由线程获取的所有锁定,而且如果对象处于
一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的
问题所在;
⑷suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但仍然持有在
这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被”挂起”的线程恢
复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资
源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,
指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。
若标志指出线程应当恢复,则用一个notify()重新启动线程。

100 JAVA中有哪几种类型的流?JDK为每种类型的流提供了一个一些抽象类以供继承,请说出
它们分别是哪些类?
⑴java中有:字节流、字符流;
⑵字节流继承于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,FileWriter,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 应用服务器与WEB SERVER的区别?
应用服务器:WebLogic、Tomcat、Jboss、WebSphere等;
WEB SERVER:IIS、Apache等。

117 BS与CS的联系与区别?
⑴C/S是Client/Server的简写。服务器通常采用高性能的PC、工作站或小型机,并采用大
型数据库系统,如Oracle、SybaseInformix或SQL Server。客户端安装专用的客户端软件。
⑵B/S是Browser/Server的缩写,客户端只要安装一个浏览器(Browser),如Netscape
Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或SQL Server
等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实
现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server同数据库进行交互。
⑶C/S与B/S区别:
①硬件环境不同:
Ⅰ.C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务
器提供连接和数据交换服务;
Ⅱ.B/S建立在广域网之上的,不必是专门的网络硬件环境,例与电话上网,租用设备,
信息自己管理,有比C/S更强的适应范围,一般只要有操作系统和浏览器就行。
②对安全要求不同:
Ⅰ.C/S一般面向相对固定的用户群,对信息安全的控制能力很强,一般高度机密的信息
系统采用C/S结构适宜,可以通过B/S发布部分可公开信息;
Ⅱ.B/S建立在广域网之上的,对安全的控制能力相对弱,可能面向不可知的用户。
③对程序架构不同:
Ⅰ.C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑;
Ⅱ.B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上,比C/S有
更高的要求;B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000
Exchange 2000等,全面支持网络的构件搭建的系统,SUN和IBM推出的JavaBean
构件技术等,是B/S更加成熟。
④软件重用不同:
Ⅰ.C/S程序不可避免的整体性考虑,构件的重用性不如B/S要求下的构件的重用性好。
Ⅱ.B/S对的多重结构,要求构件相对独立的功能,能够相对较好的重用,就如买来的
餐桌可以再利用,而不是做在墙上的石头桌子。
⑤系统维护不同:
Ⅰ.C/S程序由于整体性,必须整体考察,处理出现的问题以及系统升级,升级难,
可能是再做一个全新的系统;
Ⅱ.B/S构件组成,方面构件个别的更换,实现系统的无缝升级,系统维护开销减到最
小,用户从网上自己下载安装就可以实现升级。
⑥处理问题不同:
Ⅰ.C/S程序可以处理用户面固定,并且在相同区域,安全要求高需求,与操作系统相
关,应该都是相同的系统;
Ⅱ.B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S无法做到的,
与操作平台关系最小。
⑦用户接口不同:
Ⅰ.C/S多是建立在Window平台上,表现方法有限,对程序员普遍要求较高;
Ⅱ.B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流,并且大部分难度
减低,减低开发成本。
⑧信息流不同:
Ⅰ.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 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注册,以使别的企业能够发现的访问协议的实现标准。

123 Servlet的生命周期详解?
Servlet的生命周期可以被归纳为以下几步:
⑴装载Servlet:这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,
用于在Servlet启动时强制装载和初始化特定的Servlet。
⑵Servelt创建一个Servlet实例;
⑶Servelt调用Servlet的init()方法;
⑷一个客户端到达Server;
⑸Servlet创建一个请求对象;
⑹Servlet创建一个响应对象;
⑺Servlet激活Servlet的service方法,传递请求和响应对象作为参数;
⑻service方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息;
⑼service方法使用响应对象的方法。将响应传回Server,最终到达客户端。Service方法
可能激活其他方法以处理请求。如doGet,doPost或其他程序员自己开发的方法;
⑽对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此servlet的service
方法,将这两个对象作为参数传递给它,如此重复以上的循环,但无需再次调用init方法
Servlet一般只初始化一次;
⑾当Server不再需要Servlet时,比如当Server要关闭时,Server调用Servlet的destroy。

㈡ JSP方面

1 JSP有哪些内置对象?作用分别是什么?
JSP共有一下9种基本内置组件(可以ASP的6种内部组件相对应):
⑴request:用户端请求,此请求会包含来自GET/POST请求的参数;
⑵response:网页传回用户端的回应;
⑶pageContext:网页的属性是在这里管理;
⑷session :与请求有关的会话期;
⑸application servlet:正在执行的内容;
⑹out :用来传送回应的输出;
⑺config servlet的构架部件;
⑻page :JSP网页本身;
⑼exception :针对错误网页,未捕捉的例外。

2 两种跳转方式分别是什么?有什么区别?
有两种,分别为:


前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面,
执行完后还会回来,相当于函数调用。并且可以带参数;
后者完全转向新页面,不会再回来。相当于go to语句。

3 JSP页面的注释标记是什么?
JSP页面的注释标记分为两种:
⑴一种注释客户端看不到,比如
<%– 这是我的注释 –%> 或者
<%
//我的单行注释
/*我的
多行注释*/
%>
⑵另一种注释可以这么写:

这种注释客户端可以看到。

4 各种注释标记?
⑴HTML注释标记:
说明:注释标记,在“”之间的内容将不在浏览器中显示。
⑵JavaScript中的注释标记是: //
⑶properties属性文件中的注释标记是: #
⑷XML中的注释: 在XML文件里,注释部分是放在“〈!–”与“–〉”标记之间的部分。
⑸JAVA中的注释: // 或 /* */

5 JSP的优点?
⑴一次编译,多次、多处运行,代码的执行效率高;同时,JSP也支持现在大部分平台;
⑵组件的重用性;
⑶将内容的生成和显示进行分离。

6 说出在JSP页面里是怎么分页的?
页面需要保存以下参数:
⑴总行数 : 根据sql语句得到总行数;
⑵每页显示行数: 设定值
⑶当前页数 : 请求参数
⑷页面根据当前页数和每页行数计算出当前页第一个行数,定位结果集到此行,对结果集
取出每页显示行数的行即可。

㈢ Struts、Hibernate和Spring

1 Struts的流程?
一般先定义好数据库的结构,确定字段后,把form写好,然后作jsp,然后作action,
最后配置一下struts-config。。

2 Struts的优点和缺点?
⑴优点:
①struts框架具有组件的模块化、灵活性和重用性的优点,简化了基于MVC应用程序开发;
②Struts跟Tomcat、Turbine等许多Apache项目一样,是开源软件;使开发者能够深入的
了解其内部实现机制;
③主要体现在Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开
发效率;页面导航使系统的脉络更加清晰,有利于后期的维护。
④Struts是业界”标准”(很多成功案例),学习资源丰富,HTML标签非常优秀。
⑵缺点:
①Taglib对于初学者而言,需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,
②Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的
复杂度;
③ActionForms使用不便、无法进行单元测试(StrutsTestCase只能用于集成)。

3 Struts中actionForm的类型?
⑴普通actionForm:
⑵动态DynaActionForm:DynaActionForm根据配置文件中的属性在初始化的时候来生成
ActionForm。维护一个具体的ActionForm是要耗费时间的。通过在Struts的配置文件
中列出属性,类型和默认值来替代以前的定义一个新类,并且添加getter/setter方法。
⑶后端映射ActionForm:输入表单是动态生成的。因此表单的AtionForm的属性不能提前
知道,Struts允许你将ActionForm属性存储在MAP中而不是JAVA的原子对象。

4 struts里面的资源文件的注意事项?
资源文件是国际化时候用的,资源文件声明在struts-config,这个文件必须放在class
同一个目录下,因为程序只查询当前的目录。

5 Hibernate简介?
Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,
使得Java程序员可以随心所欲的使用对象编程思想来操纵数据库。

6 Hibernate的优点和缺点?
⑴Hibernate的优点:
①Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性;
②Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色;
③它支持多种关系数据库,从一对一到多对多的各种复杂关系。
⑵Hibernate的缺点:
它限制您所使用的对象模型,如一个持久性类不能映射到多个表,其独有的界面和可怜的
市场份额也让人不安。

7 Hibernate的性能优化?
⑴在运行的情况下使用最新版本的Hibernate发行版,如hibernate3中经过优化的批量处理
机制,代理机制、属性的延迟加载支持等。(*)
⑵指定合理的缓存策略,通过系统压力测试得到最佳的缓存性能;
⑶采用合理的Session管理机制,避免无谓的数据库开销和临时对象的反复创建;
⑷尽量使用延迟加载特性,以避免系统资源的无谓消耗;
⑸设定合理的批处理参数(batch_size);
⑹如果可能,使用UUID作为主键生成器;
⑺如果可能,使用基于version的乐观锁策略替代悲观锁;
⑻开发过程中,打开Hibernate的SQL日志文件(hibernate.show_sql),通过观察Hibernate
生成的SQL语句进一步了解其实现原理,从而指定更好的实现策略;
⑼数据库本身的优化也起着至关重要的作用,合理的索引、缓存和数据分区策略都会对持久
层性能带来客观提升。

8 Spring简介?
⑴Spring是一个开源的项目,而且目前非常活跃;它基于IOC(Inversion of Control,反向
控制)和AOP的架构多层j2ee系统的框架;
⑵Spring不强迫你必须在每一层中使用Spring,因为它模块化的很好,允许你根据自己的
需要选择使用它的某一个模块,实现了很优雅的MVC,对不同的数据访问技术提供了统一
的接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现
Transaction Management,等等。

9 Spring的优点和缺点?
⑴Spring的优点:
①Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB;
②Spring能消除在许多工程中常见的对Singleton的过多使用。(因为它降低了系统的可
测试性和面向对象的程度);
③通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样
自定义格式的属性文件的需要。Inversion of Control的使用帮助完成了这种简化;
④通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的
编程习惯;
⑤Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的
大多数业务对象没有依赖于Spring;
⑥使用Spring构建的应用程序易于单元测试;
⑦Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用
POJOs或local EJBs来实现业务接口,却不会影响调用代码;
⑧Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,他们适用
于许多web应用。例如:Spring能使用AOP提供声明性事务管理而不通过EJB容器;
⑨Spring为数据存取提供了一个一致的框架不论使用的是JDBC还是O/R mapping产品。
⑵Spring的缺点:
①使用人数不多,jsp中要写很多代码;
②控制器过于灵活,缺少一个公用控制器。

㈣ 数据库方面?

1 存储过程和函数的区别?
⑴存储过程是用户定义的一系列sql语句的集合,涉及特定表或其他对象的任务,用户可以
调用存储过程;
⑵函数通常是数据库已定义的方法,它接受参数并返回某种类型的值并且不涉及特定用户表。

2 事务是什么?
⑴事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为
ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能完成一个事务。
⑵原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行;
⑶一致性:事务在完成时,必须使所有的数据都保持在一致状态;
⑷隔离性:由并发事务所作的修改必须与任何其他并发事务所作的修改隔离;
⑸持久性:事务完成后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直
保持。

3 游标的作用?如何知道游标已经到了最后?
⑴游标用于定位结果集的行;
⑵通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错
或者到了最后。

4 触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?
⑴事前触发器:运行于触发事件发生之前,而事后触发器运行于触发事件发生之后;通常
事前触发器可以获取事件之前和新的字段值。
⑵语句级触发可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

㈤ 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(){                                                    private abstract String doSomething();                                              }
错。abstract的methods不能以private修饰。abstract的methods就是让子类implement                                               (实现)具体细节的,怎么可以用private把abstractmethod封锁起来呢? (同理,                                                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;                                             }
正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o                                         的reference(比如: o = newOther();),那么如同上例这题也是错的。但这里修改的是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 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 Balll("football");                                                 System.out.println(ball.getName());                                               }                                             }
错。"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 。                                         

12

class Example{                                                String str;                                                 public Example(){                                                 str="example";                                                }                                               public Example(String s){                                                 str=s;                                                }                                             class Demo extends Example{  }                                              public class Test{                                                public void f(){                                                  Demo d=new Demo("Good");                                                  }                                             }
上面程序会出现错误的语句是:Demo d=new Demo("Good");  没有相应的构造函数                                           

13 switch(m){
case 0:System.out.println(“Condition 0”);
case 1:System.out.println(“Condition 1”);
case 2:System.out.println(“Condition 2”);
case 3:System.out.println(“Condition 3”);break;
default:System.out.println(“Other Condition”);
}
当m的值为什么时输出”Condition 2”? A B C
A: 0
B: 1
C: 2
D: 3
E: 4
F: None

14 outer: for(int i=0;i<3;i++)
inner: for(int j=0;j<2;j++)
{
if(j==1) continue outer;
System.out.println(j+” and ” +i);
}
下面代码执行后的输出是什么? A D G
A: 0 and 0
B: 0 and 1
C: 0 and 2
D: 1 and 0
E: 1 and 1
F: 1 and 2
G: 2 and 0
H: 2 and 1
I: 2 and 2

15 已知如下代码:
public class Test{
long a[]=new long[10};
public static void main(String arg[]){
System.out.println(a[6]);
}
}
请问哪个语句是正确的? C
A: Output is null;
B: Output is 0;
C: When compile,some error will occur;
D: When running,some error will occur;

16 已知表达式int m[]={0,1,2,3,4,5,6};下面哪个表达式的值与数组下标量总数相等? B
A: m.length() 只有String类型的值有方法length()方法
B: m.length 数组类型的长度用length属性
C: m.length()+1
D: m.length+1

17 哪个类可用于处理Unicode? A
A: InputStreamReader
B: BufferedReader
C: Writer
D: PipedInputStream

㈥ 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 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
父类:

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();                                               }                                             }
输出结果:   FatherClass Create                                                       FatherClass Create                                                      ChildClass Create                                          

3 内部类的实现方式?
示例代码如下:

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");                                                  }                                               pubilc static void main(String[] args){                                                   OuterClass oc=new OuterClass();                                               }                                             }
输出结果:         InterClass Create                                                            OuterClass Create                                            

4 一个例题:
public class OuterClass{
private double d1=10;
//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.pubilc 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端程序:

package test;                                               import java.net.*;                                              import java.io.*;                                               public class Server{                                                  public static void main(String[] args) {                                                  System.out.println("Waiting for client ...");                                                   try {                                                     ServerSocket server = new ServerSocket(4004);                                                   Socket s=server.accept();                                                   System.out.println("Connected to client!");                                                     InputStream in=s.getInputStream();                                                      BufferedReader br=new BufferedReader(new InputStreamReader(in));                                                    OutputStream os=s.getOutputStream();                                                    PrintWriter pw=new PrintWriter(os);                                                     String str="";                                                      while(!str.equalsIgnoreCase("stop")){                                                     str=br.readLine();                                                      System.out.println("From client:"+str);                                                     str="Received:"+str;                                                        pw.println(str);                                                        pw.flush();                                                   }                                                   pw.close();                                                     br.close();                                                   }                                                   catch (IOException ex) {                                                  }                                             }                                               Client端程序:                                              import java.net.*;                                              import java.io.*;                                               public class Client {                                                 public static void main(String[] args) {                                                  System.out.println("Connect to server ...");                                                    try {                                                     Socket client = new Socket("localhost", 4004);                                                      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                                                   InputStream in=client.getInputStream();                                                     BufferedReader br2=new BufferedReader(new InputStreamReader(in));                                                   OutputStream out = client.getOutputStream();                                                    PrintWriter pw=new PrintWriter(out);                                                    String k="";                                                    while(!k.equalsIgnoreCase("stop")){                                                       k=br.readLine();                                                        pw.println(k);                                                      pw.flush();                                                     k=br2.readLine();                                                       System.out.println(k);                                                    }                                                   pw.close();                                                     br.close();                                                   }                                                   catch (UnknownHostException ex) {                                                   }                                                   catch (IOException ex) {                                                    }                                                 }                                             }

6 快速排序法?
基本思路:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另
一部分的记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
快速排序的主要原理是先选定一个标志值,对数组进行粗排序,大于这个标志的排在左边,
大于这个数的排在右边,再对两边进行粗排序,一直到每个数都被排序。

public class QuickSort {                                                  public static void main(String[] args) {                                                  int[] array=initArray();                                                    sort(array,0,array.length-1);                                                   displayArray(array);                                                  }                                               public static void sort(int[] a,int left,int right){                                                  if(left<right){                                                   int pivotIndex=getPivotIndex(a,left,right);                                                     sort(a,left,pivotIndex-1);                                                      sort(a,pivotIndex+1,right);                                                   }                                                 }                                               public static int getPivotIndex(int[] a,int low,int high){                                                    int pivotIndex=low,pivot=a[low];                                                    for(int i=low+1;i<=high;i++){                                                     if(a[i]<pivot && ++pivotIndex!=i){                                                        swap(a,pivotIndex,i);                                                     }                                                 }                                                   swap(a,low,pivotIndex);                                                 return pivotIndex;                                                }                                               public static void swap(int[] a, int left, int right) {                                                   int temp = a[left];                                                 a[left] = a[right];                                                 a[right] = temp;                                                  }                                               public static int[] initArray() {                                                 int[] a = new int[ (int) (Math.random() * 10 + 10)];                                                    for (int i = 0; i < a.length; i++) {                                                      a[i] = (int) (Math.random() * 100);                                                     System.out.print(a[i]);                                                     System.out.print(" ");                                                    }                                                   System.out.println();                                                   return a;                                                 }                                               public static void displayArray(int a[]) {                                                    for (int i = 0; i < a.length; i++) {                                                      System.out.print(a[i]);                                                     System.out.print(" ");                                                    }                                                   System.out.println();                                                 }                                             }   

7 冒泡排序方法?
冒泡排序算法的基本思路是把当前数据序列中的各相邻数据两两比较,发现任何一对数据间
不符合要求的升序或降序关系则立即调换它们的顺序,从而保证相邻数据间符合升序或将序
的关系。

public class BubbleSortDemo {                                                 public static void main(String[] args) {                                                  int[] sortArray = initArray();                                                  BubbleSort(sortArray);                                                  showArray(sortArray);                                                   sort(sortArray);                                                    System.out.println("");                                                 showArray(sortArray);                                                 }                                               public static int[] initArray() {                                                 System.out.println("The array got as follow:");                                                 int[] a = new int[ (int) (Math.random() * 50)];                                                 for (int i = 0; i < a.length; i++) {                                                      a[i] = (int) (Math.random() * 100);                                                     System.out.print(a[i] + " ");                                                   if ( (i + 1) % 10 == 0) {                                                     System.out.println("");                                                   }                                                 }                                                   System.out.println("");                                                 return a;                                                 }                                               public static void BubbleSort(int[] array) {                                                  int temp;                                                   for (int i = 0; i < array.length; i++) {                                                      for (int j = i + 1; j < array.length; j++) {                                                      if (array[i] > array[j]) {                                                        temp = array[i];                                                        array[i] = array[j];                                                        array[j] = temp;                                                      }                                                     }                                                 }                                                 }                                               /* 冒泡排序算法 */                                                public static void sort(int[] m) {                                                    int intLength=m.length;                                                 for(int i=0;i<intLength-1;i++){                                                   for(int j=0;j<intLength-1-i;j++){                                                     if(m[j]>m[j+1]){                                                          int temp=m[j];                                                          m[j]=m[j+1];                                                        m[j+1]=temp;                                                      }                                                     }                                                 }                                                 }                                               public static void showArray(int[] array) {                                                   System.out.println("The sorted array as follow:");                                                  for (int i = 0; i < array.length; i++) {                                                      System.out.print(array[i] + " ");                                                   if ( (i + 1) % 10 == 0) {                                                     System.out.println("");                                                   }                                                 }                                                 }                                             }

8 选择排序方法?
选择排序的基本思想是把数据序列化分成两个子序列,一个子序列中是已经排好序的数据,
另一个子序列中是尚未排序的数据;程序开始时有序子列为空,而无序子列包含了全体数据;

public class SelectSortDemo {                                                 public static void main(String[] args) {                                                  int[] array=initArray();                                                    array=selectSort(array);                                                    showArray(array);                                                 }                                               public static int[] initArray(){                                                  int[] array=new int[(int)(Math.random()*100)];                                                  for(int i=0;i<array.length;i++){                                                      array[i]=(int)(Math.random()*100);                                                      System.out.print(String.valueOf(array[i])+" ");                                                     if((i+1)%10==0){                                                      System.out.println("");                                                   }                                                 }                                                   System.out.println("");                                                 return array;                                                 }                                               public static int[] selectSort(int[] array){                                                  int[] sortArray=array;                                                  int MaxIdle,temp;                                                   for(int i=0;i<sortArray.length;i++){                                                      MaxIdle=i;                                                      for(int j=i+1;j<sortArray.length;j++){                                                        if(sortArray[MaxIdle]<sortArray[j]){                                                          MaxIdle=j;                                                        }                                                     }                                                   temp=sortArray[MaxIdle];                                                    sortArray[MaxIdle]=sortArray[i];                                                    sortArray[i]=temp;                                                    }                                                   return sortArray;                                                 }                                               public static void showArray(int[] array){                                                    for(int i=0;i<array.length;i++){                                                      System.out.print(array[i]+" ");                                                     if((i+1)%10==0){                                                      System.out.println("");                                                   }                                                 }                                                 }                                             }

9 插入排序方法?
插入排序同样是把待排序的数据列划分成有序子列和无序子列两部分,程序开始时有序子列
为空而无序子列包含了全部数据。
*插入排序,要求待排序的数组必须实现Comparable接口

public void sort(Comparable []obj)                                                 {                                                      if (obj == null)                                                      {                                                          throw new NullPointerException("The argument can not be null!");                                                     }                                                     int size = 1;                                                   while (size < obj.length)                                                   {                                                       insert(obj, size++, obj[size - 1]);                                                     }                                                 }                                                  private void insert(Comparable []obj, int size, Comparable c)                                                   {                                                      for (int i = 0 ;i < size ;i++ )                                                     {                                                      if (c.compareTo(obj[i]) < 0)                                                           {                                                              System.out.println(obj[i]);                                                      //如果待插入的元素小于当前元素,则把当前元素后面的元素依次后移一位                                                             for (int j = size ;j > i ;j-- )                                                             {                                                                  obj[j] = obj[j - 1];                                                             }                                                               obj[i] = c;                                                             break;                                                           }                                                        }                                                    }

10 希尔排序方法?
基本思想:将整个无序序列分割成若干小的子序列分别进行插入排序。
序列分割方法:将相隔某个增量h的元素构成一个子序列。在排序过程中,逐次减小这个增
量,最后当h减到1时,进行一次插入排序,排序就完成。增量序列一般采用:ht=2t-1,1≤t
≤[log2n],其中n为待排序序列的长度。
*希尔排序,要求待排序的数组必须实现Comparable接口

public class ShellSort implements SortStrategy                                              {                                                 private int[] increment;                                                {                                                 if (obj == null)                                                    {                                                     throw new NullPointerException("The argument can not be null!");                                                  }                                                   //初始化步长                                                 initGap(obj);                                                  //步长依次变化(递减)                                                for (int i = increment.length - 1 ;i >= 0 ;i-- )                                                {                                                      int step = increment[i];                                                        //由步长位置开始                                                   for (int j = step ;j < obj.length ;j++ )                                                    {                                                      Comparable tmp;                                                         //如果后面的小于前面的(相隔step),则与前面的交换                                                        for (int m = j ;m >= step ;m = m - step )                                                       {                                                          if (obj[m].compareTo(obj[m - step]) < 0)                                                            {                                                              tmp = obj[m - step];                                                            obj[m - step] = obj[m];                                                             obj[m] = tmp;                                                            }                                                           //因为之前的位置必定已经比较过,所以这里直接退出循环                                                         else                                                            {                                                               break;                                                           }                                                        }                                                    }                                                    }                                               }
*根据数组的长度确定求增量的公式的最大指数,公式为pow(4, i) - 3 * pow(2, i)                                           + 1和9 * pow(4, i) - 9 * pow(2, i) + 1                                          
private int[] initExponent(int length)                                                {                                                  int[] exp = new int[2];                                                     exp[0] = 1;                                                     exp[1] = -1;                                                    int[] gap = new int[2];                                                     gap[0] = gap[1] = 0;                                                    //确定两个公式的最大指数                                                   while (gap[0] < length)                                                     {                                                      exp[0]++;                                                       gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);                                                       }                                                   exp[0]--;                                                   while (gap[1] < length)                                                     {                                                     exp[1]++;                                                       gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);                                                    }                                                   exp[1]--;                                                   return exp;                                                   }                                                  private void initGap(Comparable[] obj)                                                  {                                                  //利用公式初始化增量序列                                                   int exp[] = initExponent(obj.length);                                                   int[] gap = new int[2];                                                     increment = new int[exp[0] + exp[1]];                                                       //将增量数组由大到小赋值                                                   for (int i = exp[0] + exp[1] - 1 ;i >= 0 ;i-- )                                                     {                                                       gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);                                                      gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);                                                      //将大的增量先放入增量数组,这里实际上是一个归并排序                                                         //不需要考虑gap[0] == gap[1]的情况,因为不可能出现相等。                                                       if (gap[0] > gap[1])                                                        {                                                          increment[i] = gap[0];                                                          exp[0]--;                                                        }                                                       else                                                       {                                                          increment[i] = gap[1];                                                          exp[1]--;                                                        }                                                     }                                                 }                                                }

11 读取文件的操作:

import java.io.*;                                               public class ReadFileDemo {                                               public static void main(String[] args) {                                                  try {                                                     System.out.println("Read the file...");                                                     BufferedReader bd=new BufferedReader(new FileReader("E://t.txt"));                                                      while(true){                                                      String str=bd.readLine();                                                       if(str==null){                                                        break;                                                        }                                                       System.out.println(str);                                                      }                                                   bd.close();                                                   }                                                   catch (FileNotFoundException ex) {                                                    System.out.println("Not found the file!");                                                    }                                                   catch (IOException ex) {                                                      System.out.println("IO Error!");                                                  }                                                 }                                             }   

12 写入文件的操作

import java.io.*;                                               public class WriteFileDemo {                                                  public static void main(String[] args) throws Exception {                                                 WriteToFile("第二次试验...");                                                    CopyFile("E://t.txt", "E://tt.txt");                                                    AppendToFile("E://t.txt", "E://tt.txt");                                                  }                                                * 添加文件的内容                                                  public static void AppendToFile(String input, String output) {                                                    FileOutputStream stream = null;                                                 OutputStreamWriter writer = null;                                                   try {                                                     stream = new FileOutputStream(output, true);                                                    writer = new OutputStreamWriter(stream);                                                    BufferedReader br = new BufferedReader(new FileReader(input));                                                      while (true) {                                                        String str = br.readLine();                                                     if (str == null) {                                                        break;                                                        }                                                       str = str + "\r\n";                                                     writer.write(str);                                                    }                                                   writer.close();                                                     br.close();                                                   }                                                   catch (FileNotFoundException ex) {                                                  }                                                   catch (IOException ex) {                                                    }                                                 }                                                * 复制文件的操作                                                  public static void CopyFile(String input, String output) {                                                    File inputFile = new File(input);                                                   File outputFile = new File(output);                                                 try {                                                     FileReader fr = new FileReader(inputFile);                                                      FileWriter fw = new FileWriter(outputFile, true);                                                   PrintWriter pw = new PrintWriter(fw);                                                   BufferedReader br = new BufferedReader(fr);                                                     while (true) {                                                        String str = br.readLine();                                                     System.out.println(str);                                                        if (str == null) {                                                        break;                                                        }                                                       str = str + "\r\n";                                                     System.out.println(str);                                                        pw.write(str);                                                    }                                                   pw.close();                                                     br.close();                                                   }                                                   catch (FileNotFoundException ex) {                                                  }                                                   catch (IOException ex) {                                                    }                                                 }                                                * 使用File、FileWriter和PrintWriter写入文件                                                public static void WriteToFile(String str) {                                                  File f = new File("E://test.txt"); //构造文件                                                   try {                                                     FileWriter fw = new FileWriter(f, true); //构造FileWriter,设置是否添加                                                      PrintWriter pw = new PrintWriter(fw);                                                   String inputstr = str + "\r\n";                                                     System.out.println("Write to the file...");                                                     pw.print(inputstr);                                                     System.out.println("Write sucessfully!");                                                   pw.close();                                                     fw.close();                                                   }                                                   catch (IOException ex) {                                                    }                                                 }

13 线程的操作:

public class Thread1 {                                                private int j;                                                  public static void main(String[] args) {                                                  Thread1 tt = new Thread1();                                                 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();                                                    }                                                 }                                               public synchronized void inc(){                                                   j++;                                                    System.out.println(Thread.currentThread().getName()+"-inc:"+j);                                               }                                               public 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();                                                    }                                                 }                                                 }                                             }

14 二分搜索方法:

public class HalfSearchDemo {                                                 public static void main(String[] args) {                                                  int[] a=initArray();                                                    quickSort(a,0,a.length-1);                                                  displayArray(a);                                                    int value=13;                                                   System.out.println("Position is ...");                                                  System.out.println(halfSearch(a,value));                                                  }                                                * 线性查找方法                                               public static int halfSearch(int[] a, int key) {                                                  int low = 0;                                                    int high = a.length - 1;                                                    while (low <= high) {                                                     int mid = (low + high) >> 1;                                                    int midVal = a[mid];                                                    if (midVal < key) {                                                       low = mid + 1;                                                    }                                                   else if (midVal > key) {                                                      high = mid - 1;                                                   }                                                   else {                                                        return mid;                                                   }                                                 }                                                   return - (low + 1);                                               }                                                * 初始化数组                                                public static int[] initArray() {                                                 int[] a = new int[ (int) (Math.random() * 100)];                                                    for (int i = 0; i < a.length; i++) {                                                      a[i] = (int) (Math.random() * 100);                                                   }                                                   return a;                                                 }                                                * 显示数组的方法                                                  public static void displayArray(int[] a){                                                 System.out.println("The sorted array as follow:");                                                  for(int i=0;i<a.length;i++){                                                      System.out.print(a[i]+" ");                                                     if((i+1)%10==0){                                                      System.out.println("");                                                   }                                                 }                                                   System.out.println("");                                               }

15 线性搜索方法:

public class LineSearchDemo {                                                 public static void main(String[] args) {                                                  System.out.println("Initial the array...");                                                 int value = 13;                                                 int[] array = initArray();                                                  System.out.println("Position is:");                                                 System.out.println(getResearchPos(array, value));                                                 }                                               public static int[] initArray() {                                                 int[] a = new int[ (int) (Math.random() * 100)];                                                    for (int i = 0; i < a.length; i++) {                                                      a[i] = (int) (Math.random() * 100);                                                   }                                                   return a;                                                 }                                               public static int getResearchPos(int[] a, int value) {                                                    int pos = -1;                                                   for (int i = 0; i < a.length; i++) {                                                      if (a[i] == value) {                                                      pos = i + 1;                                                      }                                                 }                                                   return pos;                                               }                                             }
原创粉丝点击