几百道常见Java初中级面试题

Tony 2019-05-15 01:4658 阅读
 注:  有的面试题是我面试的时候遇到的,有的是偶然看见的,还有的是朋友提供的, 稍作整理,以供参考。大部分的应该都是这些了,包含了基础,以及相对深入一点点的东西。
 
JAVA面试题集
基础知识:
1.C++或Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
 
2. Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。
 
3. 垃圾回收的优点和原理。并考虑2种回收机制。 
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
 
4. 请说出你所知道的线程通讯的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
 
5. 请讲一讲析构函数和虚函数的用法和作用。
 
6. Error与Exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,
Exception表示需要捕捉或者需要程序进行处理的异常。
 
7. 在java中一个类被声明为final类型,表示了什么意思?
表示该类不能被继承,是顶级类。
 
8. 描述一下你最常用的编程风格。
 
9. heap和stack有什么区别。
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆是栈的一个组成元素
 
10. 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)。
public class BigInt() {
int[] ArrOne = new ArrOne[1000];
String intString=""; 
public int[] Arr(String s){
intString = s;
for(int i=0;i<ArrOne.lenght;i++) {
11. 如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现
12,谈谈final, finally, finalize的区别。
  final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
  finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 
  finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
 
13,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
  匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
 
14,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
  Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: // www.frontfree.net/articles/services/view.asp?id=704&page=1
  注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
 
第四,&和&&的区别。
  &是位运算符。&&是布尔逻辑运算符。
短路与 和逻辑与
 &  不管执行结果如何都要执行完 才进行对比, && 只要前面不满足就是不进行后面的对比操作
 
15,HashMap和Hashtable的区别。
  都属于Map接口的类,实现了将惟一键映射到特定的值上。
  HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
  Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
 
16,Collection 和 Collections的区别。
  Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 是集合的方法集。
  Collection是个java.util下的接口,它是各种集合结构的父接口。
 
17,什么时候用assert(断言)。
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: 
#include <assert.h> 
void assert( int expression ); 
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 
然后通过调用 abort 来终止程序运行。 
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目的:
assert(a > 0); // throws an Assertionerror if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 
  Expression1 应该总是产生一个布尔值。
  Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
  断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
  javac -source 1.4 Test.java
  要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记 
  要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记 
  要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
  可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

JAVA是从JDK1.4才开始支持断言的(添加了关键字assert),请注意老版的JRE不支持。

断言概述

  编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。
  断言表示为一些 【布尔表达式】,程序员相信在程序中的某个特定点该表达式值为真
  可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
  当需要在一个值为FALSE时中断当前操作的话,可以使用断言
  单元测试必须使用断言(Junit/JunitX)
  除了类型检查和单元测试外,断言还提供了一种确定个种特性是否在程序中得到维护的极好的方法
  使用断言使我们向按契约式设计更近了一部 

常见的断言特性

  前置条件断言:代码执行之前必须具备的特性
  后置条件断言:代码执行之后必须具备的特性
  前后不变断言:代码执行前后不能变化的特性 

断言使用方式

  断言可以有两种形式
  1.assert Expression1
  2.assert Expression1:Expression2
如果Expression1为假,则抛出一个 AssertionError,【这是一个错误,而不是一个异常】,也就是说是一个【不可控制异常】(unchecked Exception),        AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。 

起用断言

  断言在默认情况下是关闭的,要在编译时启用断言,需要使用source1.4标记 既javac source1.4 Test.java ,在运行时启用断言需要使用 -ea参数 。要在系统类中启用和禁用断言可以使用 -esa 和 -dsa参数。
  
例如:
public class AssertExampleOne{
   public AssertExampleOne(){}
   public static void main(String args[]){
      int x=10;
      System.out.println("Testing Assertion that x==100");
      assert x==100:"Out assertion failed!";
      System.out.println("Test passed!");
   }
}
 
如果编译时未加 -source1.4,则编译通不过
在执行时未加 -ea 时输出为
Testing Assertion that x==100
Test passed
jre忽略了断言的就代码,而使用了该参数就会输出为
Testing Assertion that x==100
Exception in thread "main" java.lang.AssertionError: Out assertion failed!
        at AssertExampleOne.main(AssertExampleOne.java:6) 

断言的副作用

  由于程序员的问题,断言的使用可能会带来副作用 ,例如:
  boolean isEnable=false;
  //...
  assert isEnable=true;
  这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。 
 public class AssertExampleTwo{
   public static void main(String args[]){
     boolean isEnable=false;
     //...
     assert isEnable=true;
     if(isEnable==false){
       throw new RuntimeException("Assertion shoule be enable!");
     }
   }
}

何时需要使用断言

  1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false
  2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
  3.使用断言测试方法执行的前置条件和后置条件
  4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

什么地方不要使用断言

  断言语句不是永远会执行,可以屏蔽也可以启用
因此:
  1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
  2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值
  可以将断言看作是异常处理的一种高级形式
  使用断言可以创建更稳定,品质更好且易于除错的代码
 
  其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。

18,GC是什么? 为什么要有GC? (基础)。
  GC是JAVA 的 JVM垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
 
19,String s = new String("xyz");创建了几个String Object?
           new String 对象和   String s = xyx; 
  两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
 
20,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;(  四舍五入的原理是在参数上加0.5然后进行下取整。)
 
21,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,(大数据转小数据)不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
 
22,sleep() 和 wait() 有什么区别? 搞线程的最爱
  sleep()方法是使线程停止一段时间的方法。释放占有的资源,但是不释放锁。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。
  wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,释放锁。被调对象进入等待状态,直到被唤醒或等待时间到重新进入线程队列开始争夺资源。
 
23,Java有没有goto?
  Goto?java中的保留字,现在没有在java中使用。
 
24,数组有没有length()这个方法? String有没有length()这个方法?
  数组没有length()这个方法,有length的属性。
  String有有length()这个方法。
 
25,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
  方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。(即与返回值无关)
 
26,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
 
  Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
 ==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。
equals()和==方法决定引用值是否指向同一对象    equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
 
==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值
equals()方法存在于Object类中,因为Object类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自Object类,而通过源码我们发现,Object类中equals()方法底层依赖的是==号,那么,在所有没有重写equals()方法的类中,调用equals()方法其实和使用==号的效果一样,也是比较的地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值
判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象。这样我们往往需要重写equals()方法。我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法。
值相同?指的应该是equals()方法返回的是true吧?可以说,值相同决定不了hashcode相同;但hashcode相同则可以决定值相同。
   当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到 一个位置用来存放当前对象。 如果在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接 增加进去。 如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象 进行equals方法比较。 如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列, 将该对象放到散列后计算出来的地址中。 如果equals方法返回true,那么集合认为集合中已经存在该对象了,不再将该对象增加到集合中。 2 重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals 方法比较时,结果为true,那么这两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。(Object类的equals方法比较的是地址) 3 Object类的hashCode方法返回的是Object对象的内存地址。我们可以通过Integer.toHexString(newObject().hashCode());来得到。
 Java里面的hashSet中,如何判断两个对象是否相等? a. 判断两个对象的hashCode是否相等。 如果不相等,认为两个对象不相等。完毕 如果相等,转入2 b. 判断两个对象是否equals 如果不相等,认为两个对象不相等。 如果相等,认为两个对象相等。
hashcode 相同 一定值相同,一定是同一个对象, 值相同(equals方法为true) ,不一定对象相同,指向的不一定是同一个对象。 

String 类的常用方法;

length():求字符串的长度
indexOf():求某个字符在字符串中的位置
charAt():求一个字符串中某个位置的值
equals():比较两个字符串是否相同
replace():将字符串中的某些字符用别的字符替换掉。形如replace“abc”,”ddd”;字符串中的abc将会被ddd替换掉。
split():根据给定正则表达式的匹配拆分此字符串。形如 String s = "The time is going quickly"; str1=s.split(" ");
substring():输出一个新的字符串,它是此字符串中的子串,形如substring3,7);它将字符串中的第四个第五个第六个输出。
trim():将字符串开头的空白(空格)和尾部的空白去掉。
format():使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
toLowerCase():将字符串中所有的大写改变成小写
toUpperCase():将字符串中所有的小写改变为大写

27,给我一个你最常见到的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

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

 
29,List, Set, Map是否继承自Collection接口? 
List,Set是
Map不是
集合框架: {
Collection  {List,Set}
Map{ }
Colletctions{ }
}

   
30,abstract class和interface有什么区别?
抽象类注重存在  接口 注重实现
抽象类不能实例化。 抽象方法不能有方法体
抽象类可以包含成员变量,方法(普通方法和抽象方法都可以),构造器,初始化块,内部类(接口、枚举)。抽象类的构造器不能创建该类实例,主要是为了让子类调用。
 
 1.抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法(默认 public abstract)
2.抽象类中的成员变量可以是多种类型,而接口中的成员变量必须用public static final(常量)修饰 
3.一个类只能继承一个抽象类(单继承),但可以实现多个接口(多继承)。
4.抽象类中允许含有静态代码块和静态方法,而接口类不能。
 
1.抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。就好比飞机和鸟,抽象类抽象出的是飞行物类。而接口则是抽闲出飞行方法。
2.抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。
接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。
3.抽象类可以类比为模板,而接口可以类比为协议
   
  声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
 
  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体(方法体)。接口只可以定义static final成员变量(常量)。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
 

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

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

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

34,构造器Constructor是否可被override?
 构造方法的方法名与类名必须一样,父子类不能同名,故不能继承   更不可能被重写 
  构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

35,是否可以继承String类?
 源码中 String类是final类故不可以继承。

36,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
  不能,一个对象的一个synchronized方法只能由一个线程访问。

当一个线程进入一个对象的synchronized()方法后,其他线程是否可以进入此对象的其他方法取决于方法本身,如果该方法是非synchronized()方法,那么是可以访问的,如果是synchronized()方法,那么不能访问

如果其他方法前加了synchronized关键字,就不能,如果没加synchronized,则能够进去。
如果这个方法内部调用了wait(),则可以进入其他加synchronized的方法。
如果其他方法加了synchronized关键字,并且没有调用wai方法,则不能。

37,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
  会执行,在return前执行。

38,编程题: 用最有效率的方法算出2乘以8等於几?
  有C背景的程序员特别喜欢问这种问题。 
  2 << 3 位运算

39,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
  不对,有相同的hash code。

40,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
  是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

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

42,编程题: 写一个Singleton出来。(单例模式) 
  Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
  一般Singleton模式通常有几种种形式:
  第一种形式:定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
 
 1 public class Singleton {
 2   private Singleton(){}// 私有化构造器 
 3   //在自己内部定义自己一个实例,是不是很奇怪? 
 4   //注意这是private 只供内部调用
 5   private static Singleton instance = new Singleton(); 
 6   //这里提供了一个供外部访问本class的静态方法,可以直接访问   
 7  public static Singleton getInstance() {
 8     return instance;   
 9  
10    }
11    // 总结大概就是: 私有化构造器,内部创建一个对象,提供内部创建对象的访问接口方法
12 } 
13   第二种形式:
14  
15 public class Singleton { 
16   private static Singleton instance = null;
17   public static synchronized Singleton getInstance() { 
18   //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
19   //使用时生成实例,提高了效率!
20   if (instance==null)
21     instance=new Singleton();
22 return instance;   }
23 } 
24 其他形式:
25   定义一个类,它的构造函数为private的,所有方法为static的。
26   一般认为第一种形式要更加安全些
27   Hashtable和HashMap
28   Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
29   HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
30   还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
31   最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。 
32 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 


43.描述一下JVM加载class文件的原理机制?
    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

44.试举例说明一个典型的垃圾回收算法?
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。
引用计数法(Reference Counting Collector)
引用计数法是唯一没有使用根集的垃圾回收算法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1。当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。
基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须 实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量 ,计数器加1,而每次现有对象出了作用域生,计数器减1。

45.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来.
 
46.请写一个java程序实现线程连接池功能?
 
47.给定一个C语言函数,要求实现在java类中进行调用。
 
48、编一段代码,实现在控制台输入一组数字后,排序后在控制台输出;
 
49、列出某文件夹下的所有文件;
 1 public static void displayFile(String path){
 2         File file = new File(path);
 3         if(file.isFile()){
 4             System.out.println(file.getName());
 5         }
 6         else{
 7             System.out.println("<DIR> "+file.getName());
 8             String [] fileList = file.list();
 9             String pathName = file.getAbsolutePath();
10             for(int i = 0;i<fileList.length;i++){
11                 displayFile(pathName+File.separator+fileList[i]);
12             }
13         }
14         
15     }
50、调用系统命令实现删除文件的操作;
1 public static void deleteFile(String path){
2         File file = new File(path);
3         file.delete();
4     }
51、实现从文件中一次读出一个字符的操作;
 
52、列出一些控制流程的方法;
1.语句(条件语句/循环语句);2.调用方法;3.返回时

53、多线程有哪些状态?
新建、就绪(start方法调用后)、运行、睡眠(sleep方法)、等待(wait方法)、挂起、恢复、阻塞、死亡

54、编写了一个服务器端的程序实现在客户端输入字符然后在控制台上显示,直到输入"END"为止,让你写出客户端的程序;
 
55、作用域public,private,protected,以及不写时的区别
答:区别如下:
作用域 当前类 同一package 子孙类 其他package
 
public √ √ √ √
 
protected √ √ √ ×
 
friendly √ √ × ×
 
private √ × × ×
  
56、ArrayList和Vector的区别,HashMap和Hashtable的区别
答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

57、char型变量中能不能存贮一个中文汉字?为什么?
答:汉字以Unicode 编码来表示,占两个字节空间。char 类型大小也是两个字节,所以char是能存储一个中文汉字的。

58、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,
一:继承Thread类 , 直接调用start ( )方法开启线程
二:实现Runnable接口。通过new Thread().start()来开启线程
同步的实现方面有两种,即同步方法和同步代码块 即synchronize 关键字。
同步方法:给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法。
同步块:同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;
Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

59、垃圾回收机制,如何优化程序?
虽然程序员无法控制JVM的垃圾回收机制。但是可以通过编程的手段来影响,影响的方法是,让对象符合垃圾回收条件。
  分别说来有一下几种:
  1、将无用对象赋值为null。
  2、重新为引用变量赋值。 比如:
  Person p = new Person("aaa");
  p = new Person("bbb");
  这样,new Person("aaa")这个对象就是垃圾了——符合垃圾回收条件了。
       3、让相互联系的对象称为“岛”对象
       Person p1 = new Person("aaa");
  Person p2 = new Person("bbb");
  Person p3 = new Person("ccc");
  p1=p2; p2=p3; p3=p1;
  p1=null; p2=null; p3=null;
  在没有对p1、p2、p3置null之前,它们之间是一种三角恋关系。分别置null,三角恋关系依然存在,但是三个变量不在使用它们了。三个Person对象就组成了一个孤岛,最后死在堆上——被垃圾回收掉。
     4、强制的垃圾回收System.gc()
     实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器说了算。
  调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除。
  唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出OutofMemaryException之前运         行一次。

60、float型float f=3.4是否正确?
答:不正确。
3.4   默认为double类型的数据。若要使用单精度浮点数。则要进行强转为 float f  = (float)3.4 ;

61、介绍JAVA中的Collection FrameWork  框架结构(包括如何写自己的数据结构)?
答:Collection FrameWork如下:
 1 Collection
 2 ├List
 3 │├LinkedList
 4 │├ArrayList
 5 │└Vector
 6 │ └Stack
 7 └Set
 8 Map
 9 ├Hashtable
10 ├HashMap
11 └WeakHashMap
12 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)
13 Map提供key到value的映射

62、Java中异常处理机制,事件机制?
JAVA语言提供两种异常处理机制:捕获异常和声明抛弃异常;
1)捕获异常:在Java程序运行过程中系统得到一个异常对象是,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
2)声明抛弃异常:当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃异常。声明抛弃异常是在一个方法声明中的throws子句中指明的。

JAVA中的多形与继承?
希望大家补上,谢谢
63、抽象类与接口?
抽象类:
1-抽象类和抽象方法必须用abstract关键字修饰。
2-抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3-抽象类不能直接实例化(可通过多态实现),因为它不是具体的类。(但是有构造方法)
4-抽象类是有构造方法的,只是不能实例化,用于子类访问父类数据的初始化。
抽象类的子类:
      1- 不重写抽象方法,抽象类的子类是一个抽象子类
      2-重写父类所有父类方法,子类不是抽象类(可通过该子类可实例化抽象父类)
接口:
在Java中接口是一个全部由抽象方法组成的集合,接口需要用interface定义,里面只能有抽象的方法和常量。
接口体现的是事物扩展的功能,在Java中,类定义了一个实体,包括实体的属性,实体的行为。而接口定义了一个实体可能发生的动作,只有一个声明,没有具体的行为。
    当一个方法在很多类中有不同的体现是时候这个时候就可以将这个方法抽象出来做成一个接口。
    接口里面只能有不可修改的全局常量,只能有抽象的方法,接口没有构造方法。
    定义接口时使用interface定义,区别于抽象类,不需要加class。
接口不能被实例化,不能直接创建对象,因为接口里面只有抽象的方法,没有具体的功能。
接口可以继承接口,接口要实现具体的功能必须有实现他的子类,实现接口的子类中必须重写接口全部的抽象方法。
   接口和接口之间可以多继承。
   接口的子类可以是抽象类,但是没有实际的意义。
  一个子类可以实现多个接口,通过implements关键字去实现。
接口需要通过多态才能创建对象。
答:抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。

编程题:

1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示,按什么 排序,结果为, ,
提供reset
 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;
}
循环遍历String数组
Integer.parseInt(String s)变成int类型
组成int数组
Arrays.sort(int[] a),
a数组升序
降序可以从尾部开始输出
2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:
(¥1011)->(一千零一拾一元整)输出。
 
3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
答:父类:
 1 package test;
 2 public class FatherClass
 3 {
 4 public FatherClass()
 5 {
 6 System.out.println("FatherClass Create");
 7 }
 8 }
 9 子类:
10 package test;
11 import test.FatherClass;
12 public class ChildClass extends FatherClass
13 {
14 public ChildClass()
15 {
16 System.out.println("ChildClass Create");
17 }
18 public static void main(String[] args)
19 {
20 FatherClass fc = new FatherClass();
21 ChildClass cc = new ChildClass();
22 }
23 }
24 输出结果:
25 C:>java test.ChildClass
26 FatherClass Create
27 FatherClass Create
28 ChildClass Create
29 4、内部类的实现方式?
30 答:示例代码如下:
31 package test;
32 public class OuterClass
33 {
34 private class InterClass
35 {
36 public InterClass()
37 {
38 System.out.println("InterClass Create");
39 }
40 }
41 public OuterClass()
42 {
43 InterClass ic = new InterClass();
44 System.out.println("OuterClass Create");
45 }
46 public static void main(String[] args)
47 {
48 OuterClass oc = new OuterClass();
49 }
50 }
51 输出结果:
52 C:>java test/OuterClass
53 InterClass Create
54 OuterClass Create
55 再一个例题:
56 public class OuterClass {
57 private double d1 = 1.0;
58 //insert code here
59 }
60 You need to insert an inner class declaration at line 3. Which two inner class declarations are
61 valid?(Choose two.)
62 A. class InnerOne{
63 public static double methoda() {return d1;}
64 }
65 B. public class InnerOne{
66 static double methoda() {return d1;}
67 }
68 C. private class InnerOne{
69 double methoda() {return d1;}
70 }
71 D. static class InnerOne{
72 protected double methoda() {return d1;}
73 }
74 E. abstract class InnerOne{
75 public abstract double methoda();
76 }
View Code
说明如下:
一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错
二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。
故 D 错
三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确
四.答案为C、E
5、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?
答:Server端程序:
 1 package test;
 2 import java.net.*;
 3 import java.io.*;
 4 public class Server
 5 {
 6 private ServerSocket ss;
 7 private Socket socket;
 8 private BufferedReader in;
 9 private PrintWriter out;
10 public Server()
11 {
12 try
13 {
14 ss=new ServerSocket(10000);
15 while(true)
16 {
17 socket = ss.accept();
18 String RemoteIP = socket.getInetAddress().getHostAddress();
19 String RemotePort = ":"+socket.getLocalPort();
20 System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
21 in = new BufferedReader(new
22 InputStreamReader(socket.getInputStream()));
23 String line = in.readLine();
24 System.out.println("Cleint send is :" + line);
25 out = new PrintWriter(socket.getOutputStream(),true);
26 out.println("Your Message Received!");
27 out.close();
28 in.close();
29 socket.close();
30 }
31 }catch (IOException e)
32 {
33 out.println("wrong");
34 }
35 }
36 public static void main(String[] args)
37 {
38 new Server();
39 }
40 };
41 Client端程序:
42 package test;
43 import java.io.*;
44 import java.net.*;
45 public class Client
46 {
47 Socket socket;
48 BufferedReader in;
49 PrintWriter out;
50 public Client()
51 {
52 try
53 {
54 System.out.println("Try to Connect to 127.0.0.1:10000");
55 socket = new Socket("127.0.0.1",10000);
56 System.out.println("The Server Connected!");
57 System.out.println("Please enter some Character:");
58 BufferedReader line = new BufferedReader(new
59 InputStreamReader(System.in));
60 out = new PrintWriter(socket.getOutputStream(),true);
61 out.println(line.readLine());
62 in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
63 System.out.println(in.readLine());
64 out.close();
65 in.close();
66 socket.close();
67 }catch(IOException e)
68 {
69 out.println("Wrong");
70 }
71 }
72 public static void main(String[] args)
73 {
74 new Client();
75 }
76 };
View Code

用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口?

答:用插入法进行排序代码如下
 
 1 package test;
 2 import java.util.*;
 3 class InsertSort{ 
 4 ArrayList al; 
 5 public InsertSort(int num,int mod) { 
 6 al = new ArrayList(num);
 7 Random rand = new Random(); 
 8 System.out.println("The ArrayList Sort Before:"); 
 9 for (int i=0;i<num ;i++ ) { 
10 al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1)); 
11 System.out.println("al["+i+"]="+al.get(i)); 
12   } 
13 }
14  
15 public void SortIt(){
16 Integer tempInt; 
17 int MaxSize=1;
18 for(int i=1;i<al.size();i++){
19 tempInt = (Integer)al.remove(i); 
20 if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue()){ 
21 al.add(MaxSize,tempInt); 
22 MaxSize++; 
23 System.out.println(al.toString());
24 } 
25 else {
26 for (int j=0;j<MaxSize ;j++ ){ 
27 if(((Integer)al.get(j)).intValue()>=tempInt.intValue()){ 
28 al.add(j,tempInt); 
29 MaxSize++;
30 System.out.println(al.toString());
31 break;
32      } 
33    } 
34   } 
35 }
36  
37 System.out.println("The ArrayList Sort After:"); 
38 for(int i=0;i<al.size();i++){ 
39 System.out.println("al["+i+"]="+al.get(i));
40   }
41  }
42  
43 public static void main(String[] args){
44 InsertSort is = new InsertSort(10,100);
45 is.SortIt();
46  } 
47 }
48  
View Code
 
JAVA类实现序例化的方法是实现java.io.Serializable接口
 
Collection框架中实现比较要实现Comparable 接口和 Comparator 接口

7、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
答:代码如下:
 1 package test; 
 2 class SplitString{
 3 String SplitStr;
 4 int SplitByte; 
 5 public SplitString(String str,int bytes){
 6 SplitStr=str;
 7 SplitByte=bytes;
 8 System.out.println("The String is:′"+SplitStr+"′;SplitBytes="+SplitByte);
 9  }
10  
11 public void SplitIt(){
12 int loopCount;
13 loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/SplitByte+1);
14  System.out.println("Will Split into "+loopCount);
15 for (int i=1;i<=loopCount ;i++ ){
16  if (i==loopCount){ 
17 System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
18  } 
19 else { 
20 System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
21  } 
22 } 
23 }
24  
25 public static void main(String[] args){
26 SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人
27 0ewldfls=103",4);
28 ss.SplitIt();
29  }
30  }
 
8、JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
 
希望大家补上,谢谢
 
9、STRING与STRINGBUFFER的区别。
 
答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

Jsp方面

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

2、jsp有哪些动作?作用分别是什么? 
答:JSP共有以下6种基本动作 
jsp:include:在页面被请求的时候引入一个文件。 
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。 
jsp:getProperty:输出某个JavaBean的属性。 
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

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

4、jsp两种跳转包含方式分别是什么?有什么区别?
答:有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

Servlet方面

1、说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包括类加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
 获取htpp请求
 解析http请求
加载servlet 类(第一次创建)
创建servlet实例
调用init初始化方法
调用service方法输出响应 (请求响应)
调用destory()方法

2、Servlet版本间(忘了问的是哪两个版本了)的不同?
Servlet2.2:
引入了 self-contained Web applications 的概念。
servlet2.3:
2000年10月份出来
Servlet API 2.3中最重大的改变是增加了 filters 拦截器
Servlet 2.3 增加了 filters 和 filter chains 的功能。引入了 context 和 session listeners 的概念,当 context 或 session 被初始化或者被将要被释放的时候,和当向 context 或 session 中绑定属性或解除绑定的时候,可以对类进行监测。
Servlet 2.4:
 增加了新的最低需求,新的监测 request 的方法,新的处理 response 的方法,新的国际化支持,RequestDispatcher 的几个处理,新的 request listener 类,session 的描述,和一个新的基于 Schema 的并拥有 J2EE 元素的发布描述符。这份文档规范全面而严格的进行了修订,除去了一些可能会影响到跨平台发布的模糊不清的因素。总而言之,这份规范增加了四个新类,七个新方法,一个新常量,不再推荐使用一个类。
主要体现在:
a.检查元素的值是否为合法的值
b.检查元素的值是否为合法的文字字符或者数字字符
c.检查 Servlet, Filter, EJB-ref 等等元素的名称是否唯一
2.新增 Filter 四种设定:REQUEST、FORWARD、INCLUDE 和 ERROR。
3.新增 Request Listener、Event和Request Attribute Listener、Event。
4.取消 SingleThreadModel 接口。当 Servlet 实现 SingleThreadModel 接口时,它能确保同时间内,只能有一个 thread 执行此 Servlet。
5.<welcome-file-list>可以为Servlet。
6.ServletRequest接口新增一些方法。
public String getLocalName();
public String getLocalAddr();
public int getLocalPort();
public int getRemotePort();

 

Servlet2.52005 年 9 月发布 Servlet 2.5

Servlet 2.5 一些变化的介绍:

1) 基于最新的 J2SE 5.0 开发的。
2) 支持 annotations 。
3) web.xml 中的几处配置更加方便。
4) 去除了少数的限制。
5) 优化了一些实例
Servlet 的各个版本对监听器的变化有:
(1) Servlet 2.2 和 jsp1.1
新增Listener:HttpSessionBindingListener
新增Event: HttpSessionBindingEvent
(2) Servlet 2.3 和 jsp1.2
新增Listener:ServletContextListener,ServletContextAttributeListener
,HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener
新增Event: ServletContextEvent,ServletContextAttributeEvent,HttpSessionEvent
(3) Servlet 2.4 和 jsp2.0
新增Listener:ServletRequestListener,ServletRequestAttribureListener
新增Event: ServletRequestEvent,ServletRequestAttributeEvent 

Servlet4.0草案

从3.1到4.0将是对Servlet 协议的一次大改动,而改动的关键之处在于对HTTP/2的支持。HTTP2将是是继上世纪末HTTP1.1协议规范化以来首个HTTP协议新版本,相对于HTTP1.1,HTTP2将带来许多的增强。在草案提议中,Shing Wai列举出了一些HTTP2的新特性,而这些特性也正是他希望在Servlet 4.0 API中实现并暴露给用户的新功能,这些新特性如下:
1.请求/响应复用(Request/Response multiplexing)
2.流的优先级(Stream Prioritization)
3.服务器推送(Server Push)
4.HTTP1.1升级(Upgrade from HTTP 1.1)

3、JAVA SERVLET API中forward() 与redirect()的区别?
答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
 
4、Servlet的基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { 
}
 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
ServletException, IOException { 
} 
} 

Jdbc、Jdo方面

1、可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.
答:程序如下:
package hello.ant;
import java.sql.*;
public class jdbc{
String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String theUser="admin";
String thePw="manager";
Connection c=null ;
Statement conn;
ResultSet rs=null;

public jdbc(){
 try{
 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
 c = DriverManager.getConnection(dbUrl,theUser,thePw);
 conn=c.createStatement();
 }catch(Exception e){
 e.printStackTrace();
 } 
}
 
public boolean executeUpdate(String sql){ 
try {
conn.executeUpdate(sql);
 return true;
 }
catch (SQLException e){
 e.printStackTrace();
 return false;
 } 
}
 
public ResultSet executeQuery(String sql){
 rs=null;
 try{
 rs=conn.executeQuery(sql);
}
catch (SQLException e){
 e.printStackTrace();
 }
 return rs;
 }
 
public void close(){
try{
 conn.close();
 c.close();
 }catch (Exception e){
 e.printStackTrace(); 
}
 }
 
public static void main(String[] args){
 ResultSet rs;
 jdbc conn = new jdbc();
 rs=conn.executeQuery("select * from test");
try{
 while (rs.next()) { 
System.out.println(rs.getString("id")); 
System.out.println(rs.getString("name"));
 } 
}catch(Exception e) {
 e.printStackTrace(); 
  } 
 } 
}
 
2、Class.forName的作用?为什么要用? 
答:调用该访问返回一个以字符串指定类名的类的对象。
 
3、Jdo是什么? 
答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
 
4、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。
答:一种分页方法 
<%
int i=1;
int numPages=14;
String pages = request.getParameter("page") ; 
int currentPage = 1;
currentPage=(pages==null)?(1):{Integer.parseInt(pages)}
sql = "select count(*) from tables";
ResultSet rs = DBLink.executeQuery(sql) ; 
while(rs.next()) i = rs.getInt(1) ;
int intPageCount=1;
intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
int nextPage ;
int upPage; 
nextPage = currentPage+1;
if (nextPage>=intPageCount) nextPage=intPageCount;
upPage = currentPage-1; 
if (upPage<=1) upPage=1; 
rs.close(); 
sql="select * from tables"; 
rs=DBLink.executeQuery(sql);
i=0;
while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
 
//输出内容
 
//输出翻页连接
 
合计:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一页</a><a href="List.jsp?page=<%=upPage%>">上一页</a>
<%
for(int j=1;j<=intPageCount;j++){
if(currentPage!=j){
%>
<a href="list.jsp?page=<%=j%>">[<%=j%>]</a> 
<% 
}else{
out.println(j);
 } 
} 
%>
<a href="List.jsp?page=<%=nextPage%>">下一页</a><a href="List.jsp?page=<%=intPageCount%>">最后页 </a>

Xml方面

1、xml有哪些解析技术?区别是什么? 
答:有DOM,SAX,STAX等 
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 
STAX:Streaming API for XML (StAX)
 
2、你在项目中用到了xml技术的哪些方面?如何实现的?
 
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。
 
3、用jdom解析xml文件时如何解决中文问题?如何解析? 
答:看如下代码,用编码方式加以解决
package test;
import java.io.*;
public class DOMTest{
 private String inFile = "c:\people.xml";
 private String outFile = "c:\people.xml";
 
public static void main(String args[]){
 new DOMTest(); 
}
 
public DOMTest(){
 try{
 javax.xml.parsers.DocumentBuilder builder = 
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
 org.w3c.dom.Document doc = builder.newDocument();
 org.w3c.dom.Element root = doc.createElement("老师");
 org.w3c.dom.Element wang = doc.createElement("王");
 org.w3c.dom.Element liu = doc.createElement("刘");
 wang.appendChild(doc.createTextNode("我是王老师"));
 root.appendChild(wang);
 doc.appendChild(root);
 javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");

transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
 new javax.xml.transform.stream.StreamResult(outFile));
}catch (Exception e){
 System.out.println (e.getMessage());
 } 
} 
}

 编程用JAVA解析XML的方式.

答:用SAX方式解析XML,XML文件如下: 
<?xml version="1.0" encoding="gb2312"?> 
<person>
<name>王小明</name>
<college>信息学院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年调入海南大学</notes>
</person> 

事件回调类SAXHandler.java
import java.io.*; 
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase{
private Hashtable table = new Hashtable(); 
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table){
this.table = table;
} 
public Hashtable getTable(){
return table; 
}
public void startElement(String tag, AttributeList attrs)throws SAXException{
 currentElement = tag;
 }
 
public void characters(char[] ch, int start, int length)throws SAXException{
 currentValue = new String(ch, start, length);
 }
 
public void endElement(String name) throws SAXException{
 if (currentElement.equals(name))
 table.put(currentElement, currentValue);
 }
}
 
JSP内容显示源码,SaxXml.jsp:
 <HTML> 
<HEAD> 
<TITLE>剖析XML文件people.xml</TITLE> 
</HEAD> 
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %> 
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\people.xml"); 
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教师信息表</CAPTION>"); 
out.println("<TR><TD>姓名</TD>" + "<TD>" + (String)hashTable.get(new String("name")) + "</TD></TR>"); 
out.println("<TR><TD>学院</TD>" + "<TD>" + (String)hashTable.get(new String("college"))+"</TD></TR>"); 
out.println("<TR><TD>电话</TD>" + "<TD>" + (String)hashTable.get(new String("telephone")) + "</TD></TR>"); 
out.println("<TR><TD>备注</TD>" + "<TD>" + (String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>"); 
%>
</BODY> 
</HTML>

EJB方面

 
1、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别?
答:规范内容包括Bean提供者,应用程序装配者,EJB容器,EJB配置工具,EJB服务提供者,系统管理员。这里面,EJB容器是EJB之所以能够运行的核心。EJB容器管理着EJB的创建,撤消,激活,去活,与数据库的连接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....
 
2、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组件。
 
3、EJB的基本架构
答:一个EJB包括三个部分: 
Remote Interface 接口的代码
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException; 
public interface Add extends EJBObject{
 //some method declare
 }
 
Home Interface 接口的代码
 package Beans;
 import java.rmi.RemoteException; 
 import jaax.ejb.CreateException;
 import javax.ejb.EJBHome;
 
public interface AddHome extends EJBHome {
 //some method declare 
}
 
EJB类的代码
 package Beans; 
import java.rmi.RemoteException; 
import javax.ejb.SessionBean; 
import javx.ejb.SessionContext; 
public class AddBean Implements SessionBean {
//some method declare
}
 
 

J2EE,MVC方面

1、MVC的各个部分都有那些技术来实现?如何实现?
答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
 
2、应用服务器与WEB SERVER的区别?
希望大家补上,谢谢
 
3、J2EE是什么? 
答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
 
4、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
答:Web Service描述语言WSDL
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
 
5、BS与CS的联系与区别。
希望大家补上,谢谢
 
6、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属性、国际化的提示和消息。

设计模式方面

1、开发中都用到了那些设计模式?用在什么场合?
答:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
 
2、UML方面
答:标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图,

JavaScript方面

1、如何校验数字型?
var re=/^d{1,8}$|.d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null){
 sign=-4; 
break; 
}else{
document.form1.all(i).value=parseFloat(str);
}

CORBA方面

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

LINUX方面

1、LINUX下线程,GDI类的解释。
答:LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。 GDI类为图像设备编程接口类库。

JAVA华为面试题

1 面向对象的特征有哪些方面
 
2 String是最基本的数据类型吗?
 
3 int 和 Integer 有什么区别
 
4 String 和StringBuffer的区别
 
5运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
 
6 说出一些常用的类,包,接口,请各举5个
 
7 说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
 
8 设计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(); 
} 
} 
} 
} 
9. JSP的内置对象及方法。 
request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等) 
out out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 
pageContext pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 
session session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
application applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 
config config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page page表示从该页面产生的一个servlet实例
 
10.用socket通讯写出客户端和服务器端的通讯,要求客户发送数据后能够回显相同的数据。
socket通讯例子。
 
11说出Servlet的生命周期,并说出Servlet和CGI的区别。 
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 
12.EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别
 
13.EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
 
14.说出数据连接池的工作机制是什么?
 
15同步和异步有和异同,在什么情况下分别使用他们?举例说明。
 
 
 应用服务器有那些?
Weblogic、Tomcat、jboss
 
17你所知道的集合类都有哪些?主要方法?
ArrayList、LinkedList、HashSet、HashMap、TreeMap、HashTable 
 
18给你一个:驱动程序A,数据源名称为B,用户名称为C,密码为D,数据库表为T,请用JDBC检索出表T的所有数据。
 
19.说出在JSP页面里是怎么分页的?
页面需要保存以下参数:
总行数:根据sql语句得到总行数
每页显示行数:设定值 
当前页数:请求参数
页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可

数据库方面

1. 存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
 
2. 事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
 
3. 游标的作用?如何知道游标已经到了最后?
 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。
 
4. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。 
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
 
二、JSP
1、至少要能说出7个隐含对象以及他们的区别
 
** 2、forward 和redirect的区别
 
3、JSP的常用指令
 
三、servlet
1、什么情况下调用doGet()和doPost()?
 
2、servlet的init()方法和service()方法的区别
 
3、servlet的生命周期
 
4、如何现实servlet的单线程模式
 
5、servlet的配置
 
6、四种会话跟踪技术
 
四、EJB
**1、EJB容器提供的服务 
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
 
2、EJB的角色和三个对象
 
EJB角色主要包括Bean开发者 应用组装者 部署者 系统管理员 EJB容器提供者 EJB服务器提供者
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类
EJB的几种类型
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean 
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种
 
3、bean 实例的生命周期
 
对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。
 
4、激活机制
 
以Statefull Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。
 
5、remote接口和home接口主要作用
remote接口定义了业务方法,用于EJB客户端调用业务方法
home接口是EJB工厂用于创建和移除查找EJB实例
 
6、客服端调用EJB对象的几个基本步骤 
一、 设置JNDI服务工厂以及JNDI服务地址系统属性
二、 查找Home接口
三、 从Home接口调用Create方法创建Remote接口
四、 通过Remote接口调用其业务方法
五、数据库
1、存储过程的编写
2、基本的SQL语句
 
六、weblogic
1、 如何给weblogic指定大小的内存?
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M
 
2、 如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。
 
3、 如何启动时不需输入用户名与密码?
修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.
 
4、 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?
 保存在此Domain的config.xml文件中,它是服务器的核心配置文件。
 
5、 说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办?
Domain目录\服务器目录\applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。
 
6、 如何查看在weblogic中已经发布的EJB?
可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB
 
7、 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。
 
8、在weblogic中发布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml
 
9、EJB需直接实现它的业务接口或Home接口吗,请简述理由.
远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。
 
10、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
 persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃。
 
11、说说你所熟悉或听说过的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架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性
 

JVM 虚拟机 面试问题

  1. JVM 内存:
  • 程序计算器(JVM 寄存器)
  • 虚拟机栈(操作数栈,局部变量表,方法出口,返回地址)
  • 本地方法栈(为native 方法服务,和虚拟机栈结构一样)
  • 方法区(常量,静态量,方法描述,类描述。对象类型数据)
  • 堆 (对象)

     2 .  JVM中对象是怎么分配的:
 栈: 局部变量表,根据不同类型分为不同的区域,比如int,double 还有就是reference , 分配对象时会在reference 中分配当前对象的引用
 堆:分配对象的对象头,实例数据和对齐填充三部分,
方法区:分配对象的类型数据。
对象头(MarkWord,实例指针)
实例数据(对象真正有意义的内容)
对齐填充(无意义的0,但是并不是每一个虚拟机都有)MarkWord 为 32位其中25位为HashCode, 2位锁标志4位GC分带年龄,1位固定0。

  1. 基本数据类型和引用数据类型的区别
基本数据类型分配空间只有 栈。 而且根据不同的分配类型分配到变量表中的不同位置上 。他基本所保存的值用二进制表示,但是一定是 一个直接的值
引用数据类型分配空间有栈,堆和方法区。栈的变量表中在reference这个块中分配空间保存引用名。堆用来分配对象数据, 而他的JVM 没有明确引用方式,但是一定是对象的起始位置和结束位置的引用这是JVM 明确了的。
 

 4    .  简单描述下垃圾回收
可达性分析算法 : 任意一个静态变量,局部变量都可以作为一个GCRoot来使用,当对象失去GCRoot时,表示对象不可达,对象可被回收
标记清除算法: GC 执行两次,第一次对需要回收的对象进行标记。第二次进行回收,但是会造成大量的空间碎片,
标记整理算法: 在标记清除的基础上加入整理过程,移动对象避免出现空间碎片,但是效率很低。
复制清除算法: 根据经验发现Eden区的新生代对象往往处于朝生夕死的过程,因此给Eden区分配一个幸存区。将Eden区存活的对象拷贝到幸存区,再将Eden的对象全部清除,最后拷贝回来。但是为了防止出现大量的对象存活的可能。在Eden园区和幸存区后还可以开辟一个担保区,如果幸存对象过多可以放入此区,通常情况下他们的比例是8:1:1。
引用分析:
如果是强引用(new reference),那么会根据可达性分析计算GCRoot 。
如果是软引用,那么无论GCRoot有无丢失,在内存不足的时候都会回收。
如果是弱引用,那么在GC 时,一定会回收。无论GCRoot有无丢失内存是否足够;
如果是虚引用,本身就不是一个引用。

 5  .  简单说一下MinorGC (新生代/Eden)和Major/FullGC(老年代/OLD)的区别。
 MinorGC : 在园区发生GC 的过程中。通常Eden园区采用的是复制清除算法。为Eden园区配置了担保区和幸存区。比例一般情况下为8:1:1,在Eden园区发生GC 的时候,会将Eden园区的幸存对象拷贝到幸存区。但是拷贝前检查老年代最大可用的连续空间是否大于新生代所有对象总空间。如果成立,则认为安全。如果不成立,则查看是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升的平均大小。如果大于则进行一次MinorGC ,但是GC 会有风险,如果不允许担保失败。或者每个老年代最大可用的连续空间小于晋升空间,那么进行一个FullGC。
FullGC: 是针对老年代进行一次GC ,或者是针对Eden和老年代进行的一次GC ,因为每一次触发老年代GC一定会触发一次MinorGC, 老年代通常使用标记整理算法。

6  . 什么样的对象会放入老年代。
  连续多次GC依然存活的对象,虚拟机默认15次。大对象会放入老年代。
虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

7  . GC 分代有哪些?
新生代:Eden
老年代:Old
永生代/永久代: 概念取消,但是方法区回收依然是使用的永生代。
 

8  .  GC是什么? 为什么要有GC? (基础)。
 GC是JAVA 的 JVM垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc( ) 
Runtime.getRuntime( ).gc( ). 
常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象, GC会收集那些不是GC roots且没有被GC roots引用的对象。
一个对象可以属于多个root,GC root有几下种:
   Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.
Thread - 活着的线程
Stack Local - Java方法的local变量或参数
JNI Local - JNI方法的local变量或参数
JNI Global - 全局JNI引用
Monitor Used - 用于同步的监控对象
Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此就只有留给分析分员去确定哪些是属于"JVM持有"的了。

J2EE 面试题综合

[基础问答]
1.下面哪些类可以被继承?
java.lang.Thread (T)
java.lang.Number (T)
java.lang.Double (F)
java.lang.Math  (F)
java.lang.Void  (F)
java.lang.Class  (F)
java.lang.ClassLoader (T)

2.抽象类和接口的区别
(1)接口可以被多重implements,抽象类只能被单一extends
(2)接口只有定义,抽象类可以有定义和实现
(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)

3.Hashtable的原理,并说出HashMap与Hashtable的区别
HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.
HashMap与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

4.forward和redirect的区别
forward: 请求转发   客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。
redirect: 重定向, 服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。

5.什么是Web容器?
实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.通俗的可理解为服务器
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以有多个容器。

6.解释下面关于J2EE的名词
(1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.
(2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.
(3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.
(4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.
(5)RMI:Remote Method Interface,远程方法调用。

7.EJB是基于哪些技术实现的?并说 出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;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 的优势却在于他可以维持使用者的状态.

8.XML的解析方法
Sax:原理:通过parse(file,listener)函数用一个listener对xml文件进行查找,按顺序读取文档,遍历每个标签,当发现目标标签
时,读取标签的属性、结点值等信息并返回。
DOM:  原理是:首先在内存中创建一个Document对象,然后把XML文档读取进来赋值给这个dom对象。由于dom对象是基于树结构的,所以对dom对象进行遍历即可。对内存中的dom对象可以进行查询、修改、删除操作,还可以写回原XML文档保存修改。
JDOM:  OM方法的众多繁琐操作进行包装得到的,上面我们看到,DOM方法解析XML文档其实是很繁琐的,而且很混乱,标签、属性、换行空格都当作结点类型来处理。JDOM方法定义了一系列通俗、好记的方法来解析XML,方法的底层封装了一系列DOM操作,但是我们不必亲自去进行这些繁琐的工作了。
DOM4J:      Dom4j是目前最流行、最好用的XML解析工具,解析XML的速度最快。
创建SAXReader:SAXReader reader = new SAXReader(); 
    2:创建文件输入流打开xml文件:InputStream in = new FileInputStream("XXX.xml");
    3:通过reader和输入流读取xml文件到内存创建Document对象:Document dom = reader.read(in); 
    4:获取根节点:Element root=dom.getRootElement();
    5:获取子节点列表:List<Element> childNodes = root.elements();
    6:遍历子节点:Element node = childNodes.get(i);
    7:读取结点信息:
     1)结点属性值:node.attributeValue("属性名");
     2)结点名:node.getName();
     3)结点值:node.getValue();
     4)子结点文本值:node.elementText("子结点名")
 


9.什么是Web Service?
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序
Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。
Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。
注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。
 
优势:
(1).跨平台;
(2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
(3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
(4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。
(5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。
(6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。
缺点:
(1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。
(2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify,lock 重入锁
 
11.JSP中动态include与静态include的区别?
动态include 是jsp动作,静态include是jsp指令
动态include用jsp:include动作实现
<jsp:include page="included.jsp" flush="true"/>
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态include用include指令实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>
 
1.动态包含用的元素是page,而且有两种形式。静态包含用的是file,只有一种形式。
2.生成的文件不同,静态的包含是将两个jsp文件二合一统一编译,生成一个以包含页面命名的servlet和class文件,动态包含的两个jsp文件各自生成自己的servlet和class文件。
3. 传参方式一:<jsp:include page=“a.jsp?param=123”/>时被包含的jsp页面是可以访问该参数的。
4. 传参方式二:
            <jsp:include page=“a.jsp”>
                     <jsp:param name=“” value=“”>
                    <jsp:param name=“” value=“”>
           </ jsp:include >
5.在客户端访问包含页面时地址栏后面直接加上参数后传递,这种形式的传参是客户端送来的,但是这两个页面的request对象不是同一个,因为3中已经说了包含的页面可以向被包含的页面传递参数,所以被包含的request对象含的参数个数应该大于等于包含页面的参数个数的。所以它们各有各的request对象。而且被包含的jsp页面可以访问传到包含页面的参数。
6.动态包含只有在执行到它的时候才加载,所以它才叫动态包含。
 

[Java编程与程序运行结果]
1.Java编程,打印昨天的当前时刻
 1 public class YesterdayCurrent{
 2   public void main(String[] args){
 3     Calendar cal = Calendar.getInstance();
 4     cal.add(Calendar.DATE, -1);
 5     System.out.println(cal.getTime());
 6   }
 7 }
 8  
 9 2.文件读写,实现一个计数器
10   public int getNum(){
11         int i = -1;
12         try{
13             String stri="";
14             BufferedReader in = new BufferedReader(new FileReader(f));
15             while((stri=in.readLine())!=null){
16                 i = Integer.parseInt(stri.trim());
17             }
18             in.close();
19         }catch(Exception e){
20             e.printStackTrace();
21         }
22         return i;
23     }
24     public void setNum(){
25         int i = getNum();
26         i++;       
27         try{
28             PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false))); 
29             out.write(String.valueOf(i));            //可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String
30             out.close() ;
31         }catch(Exception e){
32             e.printStackTrace();
33         }
34     }
35 3. 指出下面程序的运行结果:
36 class A{
37     static{
38         System.out.print("1");
39     }
40     public A(){
41         System.out.print("2");
42     }
43 }
44 class B extends A{
45     static{
46         System.out.print("a");
47     }
48     public B(){
49         System.out.print("b");
50     }  
51 }
52 public class Hello{
53     public static void main(String[] ars){
54         A ab = new B(); //执行到此处,结果: 1a2b
55 ab = new B(); //执行到此处,结果: 1a2bab
56     }
57 }
58 注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造
59 4.写一个Singleton模式的例子
60 public class Singleton{
61 private static Singleton single = new Singleton();
62 private Singleton(){}
63 public Singleton getInstance(){
64   return single;
65 }
66 } 

数据库
1.删除表的重复记录
如果记录完全相同才算重复记录,那么: (sql server2000下测试通过)
select distinct * into #tmpp from tid
delete from tid
insert into tid select * from #tmpp
drop table #tmpp
如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)
delete from tableA where id not in
(select id = min(id) from tableA group by name)

2.delete from tablea & truncate table tablea的区别
truncate 语句执行速度快,占资源少,并且只记录页删除的日志;
delete 对每条记录的删除均需要记录日志

回复数量: 0
暂无评论~~
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!