Java-简答题

  • 说出ArryayList,Vector,LinkedList的存储性能和特性

1).ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦,LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引,但是缺点就是查找非常麻烦,要丛第一个索引开始

2).ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.

3).Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些

4).同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的

5).数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

6). LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.

  • hashmap和hashtable的区别?

1).Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;

2).Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。

3).在HashMap中,null可以作为键,这样的键只有一个;Hashtable中可以有一个或多个键所对应的值为null。

  • Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

可以继承其他类或完成其他接口,在swing编程中常用此方式。

  • forward 和redirect的区别?

1). forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

2). redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

  • 抽象类遵循的原则:

(1)abstract关键字只能修饰类和方法,不能修饰字段。

(2)抽象类不能被实例化(无法使用new关键字创建对象实例),只能被继承。

(3)抽象类可以包含属性,方法,构造方法,初始化块,内部类,枚举类,和普通类一样,普通方法一定要实现,变量可以初始化或不初始化但不能初始化后在抽象类中重新赋值或操作该变量(只能在子类中改变该变量)。

(4)抽象类中的抽象方法(加了abstract关键字的方法)不能实现。

(5)含有抽象方法的类必须定义成抽象类。

  • 抽象类(abstract  class)和接口(interface)的区别?

(1)接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。

(2)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

(3)在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。

(4)abstract class和interface所反映出的设计理念不同。其实abstract class表示的是”is-a”关系,interface表示的是”has-a”关系。

(5)实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。抽象类中可以有非抽象方法。接口中则不能有实现方法。

(6)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以在子类中重新赋值。

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

 

含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5.抽象类中可以包含静态方法,接口中不能包含静态方法

6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7.一个类可以实现多个接口,但只能继承一个抽象类。

9.实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法

         下面接着再说说两者在应用上的区别:

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:

public abstract class BaseServlet extends HttpServlet{

          public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException        {

                   记录访问日志

                   进行权限判断

if(具有权限){

         try{

                  doService(request,response);

}

         catch(Excetpion e)      {

                          记录异常信息

         }

}

          }

          protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;

//注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的

}

public class MyServlet1 extends BaseServlet

{

protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException

          {

                   本Servlet只处理的具体业务逻辑代码

          }

}

父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。

备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。

  • 接口和抽象类的区别是什么?

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

  • Java集合类框架的基本接口有哪些?

Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

Collection:代表一组对象,每一个对象都是它的子元素。

Set:不包含重复元素的Collection。

List:有顺序的collection,并且可以包含重复元素。

Map:可以把键(key)映射到值(value)的对象,键不能重复。

  • Java堆的结构是什么样子的什么是堆中的永久代(Perm Gen space)?

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

  • Overload(重写)和Override(重载)的区别?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。

重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

子类与父类有相同的名称和参数,我们说它是重写,方法名相同,参数个数或者参数类型不同,我们说是重载。

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

  • Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

 

  • String s = “Hello”;s = s + ” world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?

因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 “Hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为”Hello world!”,原来那个对象还存在于内存之中.

  • final, finally, finalize的区别?

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

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

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

  • 比较一下Java和JavaSciprt的异同。

– 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。

-解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。

– 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。

– 代码格式不一样。

  • Error和Exception有什么区别? 

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

  • 静态变量和非静态变量的区别是什么?

1.内存分配
静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
而非静态变量需要被实例化后才会分配内存
2.生存周期
静态变量生存周期为应用程序的存在周期;
非静态变量的存在周期取决于实例化的类的存在周期。
3.调用方式
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
4.共享方式
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
非静态变量是局部变量,不共享的。
5.访问方式
静态成员不能访问非静态成员
静态成员可以访问静态成员。

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

public class VariantTest{

          public static int staticVar = 0;

          public int instanceVar = 0;

          public VariantTest(){

                   staticVar++;

                   instanceVar++;

                   System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

          }

}

备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写作能力!

  • JSP中动态INCLUDE与静态INCLUDE的区别?

动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面《%@ include file= included.htm %》

  • Collection 和 Collections的区别?

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

  • 什么是类?什么是对象?什么是面向对象思想?

类是广泛的概率,表示一个具有相同属性和方法的多个对象的集合,是一个有共同性质的群体。而对象,所谓“万物皆对象”,指的是具体的一个实实在在的东西。

面向对象思想:将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及展示这些对象的行为,以解决这些对象面临的一些实际问题。

  • List 和Map的区别?

List是存储单列数据的集合,而Map是存储键、值这样双列数据的集合。List中存储的数据是有序的,并且允许重复;Map中存储数据是没有顺序的,其键是不能重复的,值可以重复。

  • 什么是 java 序列化, 如何实现 java 序列化?或者请解释 Serializable 接口的作用。

我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java对象,例如,要将 java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被 writeObject 方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法,implementsSerializable 只是为了标注该对象是可被序列化的。

  • 在Java中,如何跳出当前的多重嵌套循环?
    在最外层循环前加一个标记值如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)
  • 列出一些你常见的运行时异常?
     ArithmeticException(算术异常)
    – ClassCastException (类转换异常)
    – IllegalArgumentException (非法参数异常)
    – IndexOutOfBoundsException (下标越界异常)
    – NullPointerException (空指针异常)
    – SecurityException (安全异常)
  • 运行时异常与一般异常有何异同?

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

  • 如何通过反射创建对象?

通过类对象调用newInstance()方法,例如:String.class.newInstance()

  • struts的工作原理?

1、初始化,读取struts-config.xml、web.xml等配置文件(所有配置文件的初始化)

2、发送HTTP请求,客户端发送以.do结尾的请求

3、填充FormBean(实例化、复位、填充数据、校验、保存)

4、将请求转发到Action(调用Action的execute()方法)

5、处理业务(可以调用后台类,返回ActionForward对象)

6、返回目标响应对象(从Action返回到ActionServlet)

7、转换Http请求到目标响应对象(查找响应,根据返回的Forward keyword)

8、Http响应,返回到Jsp页面

  • 项目开发经历了哪几个阶段?
    立项,需求分析,设计(找用例,写用例文本,找实体,编写数据字典,画数据流图),编码,测试,部署,迭代更新;
  • J2EE是什么?

J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model)。在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

  • 谈谈MVC设计模式的概念,使用MVC的好处?

M模型层(Model):模型层专注于处理业务逻辑和业务数据,它可以为多个视图准备数据,提高了应用的可重用性。

V视图层(View):用户看到的并与系统交互的界面,接收用户数据,向用户显示相关的数据。

C控制层(Controller):是模型层和视图层联系的纽带;接收视图层提交的请求,调用模型层的业务逻辑,根据业务逻辑的调用结果,控制系统转发的页面。

MVC模式的好处:实现了业务逻辑和界面显示处理的分离;J2EE架构实现了业务逻辑和数据存储的分离,界面显示和业务逻辑的分离。各层之间不受影响。

  • 拦截器和过滤器的区别
    1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
  • <%…%>和<%!…%>的区别?

<%…%>用于在JSP页面中嵌入Java脚本

<%!…%>用于在JSP页面中申明变量或方法,可以在该页面中的<%…%>脚本中调用,声明的变量相当于Servlet中的定义的成员变量

  • 请列举一些常用的类,包,接口(至少各列举5个)?

1)类:

1>. java.lang.Object

2>. java.lang.String

3>. java.lang.System

4>. java.io.File

5>. java.io.FileInputStream

2).接口:

1> .java.util.List

2>. java.util.Map

3>.java.util.Iterator

4>.java.sql.CallableStatement

5>.java.lang.Comparable

  • hibernate有哪5个核心接口

Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象;

SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存;

Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存;

Transaction 接口:管理事务;

Query 和Criteria 接口:执行数据库的查询。

  • jdbc,hibernate分页怎样实现的?

1)Hibernate的分页

Query query=session.createQuery(“from student”);

 query.setFirstResult(firstResult);//设置每页开始的记录号

  query.setMaxResults(resultNumber);//设置每页显示的记录数

Collection students=query.list();

2)jdbc的分页 根据不同的数据库采用不同的sql分页语句

 sqlserver分页  select top 5* from student s where s.id not in(

 select top (5*(2-1)) id from student order by id

 ) order by s.id

 

mysql分页

 sql=”select * from userdetail where userid limit ” +((pageNow-1)*pageSize)+”,”+pageSize+”;

  • Java集合框架是什么?说出一些集合框架的优点?

每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。

  随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。

  集合框架的部分优点如下:

  (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。

  (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。

  (3)通过使用JDK附带的集合类,可以降低代码维护成本。

  (4)复用性和可操作性。

  • int和Integer有什么区别?

int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

  • 简述一下src与href的区别?

href 是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接。

src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。

  • 事务的特性?

原子性: 即事务操作要么全执行要么都不执行,事务是能够用中最小执行单位,具有不可再分性

一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态

隔离性:各个事务的执行互不干扰,并发执行的事务之间互不影响。

持续性:也称持久性,事务一旦提交,对事务所做的任何改变都会记录到数据库中

  • dbms

DML(data manipulation language):它们是UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

DQL(data Query language): 数据库查询语言,关键字为select

DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,

DCL(Data Control Language):   是数据库控制功能, 是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。 在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

  • 插入数据时,ArrayList、LinkedList、Vector谁速度较快?
    ArrayList、Vector以数组方式存储数据,插入数据时要进行元素移动操作,因而插入数据慢。LinkedList是一种链表结构,在插入数据时只需要修改链表的前后项指向即可,因此插入速度较快。
  • struts2中的默认包struts-default有什么作用?

 1) struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。

2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。

3)通常每个包都应该继承struts-default包

  • ActionContext、ServletContext、pageContext的区别?

1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;

2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;

3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,生命周期是JSP四个域对象中最小的。

  • hibernate和jdbc的区别?

1.hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库;
2.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合;
3.Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server( AppServ是一个软件集合,集成了Apache(服务器软件),php(网页程序设计语言),Mysql,和phpMyAdmin(数据库图形界面管理软件) )没有任何关系,也不存在兼容性问题。

  • 请说出struts2中至少5个的默认拦截器?

  • 数据库连接池是什么意思?

像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。

  • 谈谈你对SSH整合的理解?

Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。

struts2是一个控制器,负责接收页面数据并调用视图层的方法返回页面所需要的数据,hibernate负责数据的持久化,因为现在一般采用的数据库都是关系型数据库,而java是面向对象的,所以hibernate负责数据的落地,spring则把变化封装了,通过spring完成依赖注入,能降低各个模板间的耦合,有利于提高项目各个模板间的复用,使系统更加趋近于高内聚,低耦合的要求.

(没有唯一答案,但是回答时必须说出SSH是由什么组成,每个组成部分有什么作用)

request.getAttribute()和request.getParamerter()有何区别?

request.getParamerter()取值是通过容器的实现来取得的。类似于get 、post的方式传入数据;request.getAttribute()和request.setAttribute()只是在容器内部流传,仅仅是请求处理阶段。

request.getParamerter()方法传递数据,会从Web服务器端传递到Web客户端,代表Http请求数据,request.getParamerter()方法返回String类型的数据;request.getAttribute()和request.setAttribute()方法传递数据只会存放在Web容器内。

  • 数组有没有length()这个方法? String有没有length()这个方法?

答:数组没有length()这个方法,有length的属性。String有length()这个方法。

  • 说说& && 的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

&和&&都可以用作逻辑与的运算符,表示逻辑与(and) ,当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。

&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。例如,对于 if(str != null&& !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异常。

If(x==33 &++y>0) y 会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,我们通常使用0x0f 来与一个整数进行&运算,来获取该整数的最低4个 bit 位,例如,0x31 &0x0f 的结果为0x01。

  • “==”“equal”的区别?

 class EqualTest {
public static void main(String[] args) {
//对于基本类型的变量。”==”和”equal”的区别
int t1=57;
int t2=67;
int t3=124;
int t4=124;
//“==”对于基本数据类型,判断两个变量的值是否相等。
Boolean result1=(t1==t2);
Boolean result2=((t1+t2)==t3);
Boolean result3=(t3==t4);

System.out.println(“/n/n—–【t1==t2】”+result1+”/n—–【(t1+t2)=t3】”+result2+”/n—–【t3=t4】”+result3);
//“equal”不能用于基本数据类型。只能用于类变量。对于基本数据类型要用其包装类。
Integer i1=new Integer(t1);
Integer i2=new Integer(t2);
Integer i3=new Integer(t3);
Integer i4=new Integer(t4);

    Boolean ri1=i1.equals(i2);
Boolean ri2=i3.equals(i1+i2);
Boolean ri3=i3.equals(i4);

System.out.println(“/n/n—–【i1.equals(i2)】”+ri1+”/n—–【i3.equals(i1+i2)】”+ri2+”/n—–【i3.equals(i4)】”+ri3);

//对于对象变量,”==”和”equal”的区别
String st1=”wasiker “;
String st2=”is super man”;
String st3=”wasiker is super man”;
String st4=”wasiker is super man”;

Boolean b1=(st1==st2);
Boolean b2=(st1+st2)==st3;
Boolean b3=(st3==st4);

System.out.println(“/n/n—–【st1==st2】”+b1+”/n—–【(st1+st2)==st3】”+b2+”/n—–【st3==st4】”+b3);

//因为对象变量的存储的是对象在内存中的路径,即内存地址。所以用“==”比较时,即使
//对象的值相等,但是他们的内存地址不同,所以==的结果为false。故“==”用于比较两
//个变量的值是否相等,而不是变量引用的对象是否相等
Boolean r1=st1.equals(st2);
Boolean r2=(st1+st2).equals(st3);
Boolean r3=st3.equals(st4);

System.out.println(“/n/n—–【st1.equals(st2)】”+r1+”/n—–【(st1+st2).equals(st3)】”+r2+”/n—–【st3.equals(st4)】”+r3);

//equal用于比较两个对象是否相同。
}
}
运行结果为:
—–【t1==t2】false
—–【(t1+t2)=t3】true
—–【t3=t4】true

—–【i1.equals(i2)】false
—–【i3.equals(i1+i2)】true
—–【i3.equals(i4)】true

—–【st1==st2】false
—–【(st1+st2)==st3】false
—–【st3==st4】true

—–【st1.equals(st2)】false
—–【(st1+st2).equals(st3)】true
—–【st3.equals(st4)】true

总之:
“==”比较的是值【变量(栈)内存中  存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】

【特别注意】Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

“==”比”equal”运行速度快,因为”==”只是比较引用.

通俗点讲,==是看看左右是不是同一个东西。equals是看看左右是不是长得一样。
==:等于。
equals:相同。
两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人

1.==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相同
equals()指的是值是否相同

 == 和 Equals 的区别
1. == 是一个运算符。
2.Equals则是string对象的方法,可以.(点)出来。

我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较
1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;

2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;

需注意几点:
1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;

  • Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式。

面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。
面向字符的操作,为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类。

总结:以InputStream(输入)/OutputStream(输出)为后缀的是字节流;

            以Reader(输入)/Writer(输出)为后缀的是字符流。

扩展:Java流类图结构,一目了然,解决大部分选择题:

  • BeanFactory的作用是什么?

BeanFactory是配置、创建、管理bean的容器,有时候也称为bean上下文。Bean与bean的依赖关系,也是由BeanFactory负责维护的。

  • bean在spring的容器中两种基本行为是什么?

Singleton:单态

Non-singleton或prototype:原型

  • spring配置文件中的ref元素的作用是什么?它的两个基本属性是什么? 

用于指定属性值为spring容器中的其它bean.两个基本属性是bean和local

  • 什么是DWR?它有哪些功能?

DWR(Direct Web Remoting)是一个WEB远程调用框架.

可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript

DWR根据Java类来动态生成JavaScrip代码.

支持Dom Trees,支持Spring,支持commons-logging

  • Ajax的工作原理 ?

在会话的开始,浏览器加载Ajax引擎

请求动作通过JavaScript调用Ajax引擎来代替.

引擎负责绘制用户界面以及与服务器端通讯。

Ajax引擎采用异步交互过程--不用等待服务器的通讯。

  •  ActionForm的作用? 

 ActionForm属于一种数据传输对象,联系了前台页面与后台的Action方法,实现了前台与后台之间的数据转换和传递。它的作用主要体现在以下几个方面:

1) 在显示页面的时候用于完成页面中各种控件的初始化工作。

2) 在用户提交请求的时候,ActionForm又代表了用户所提交的数据,供Action以及后续的业务处理方法使用

ActionForm还有另外一个作用就是对用户提交数据的合法性进行验证

  • Hibernate中Session对象的load()方法和get()方法的区别?

记录不存在时 get()方法会返回空(null),而load()方法将会抛出一个HibernateException异常,load()方法查询数据时会先找Hibernate的内部缓存和二级缓存中的现有数据,get()方法在内部缓存中没有找到相对应的数据时装直接执行SQL语句进行查询。

  • action是单实例还是多实例?

Action是单实例的。当多个用户访问一个请求时,服务器内存中只有一个与之对应的action类对象。因为当服务器第一次加载struts的配置文件的时候,创建了一个action后,每发送一个请求,服务器都会先去检索相应的范围内(request,session)是否存在这样一个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。

  • 什么是Hibernate的延迟加载? 

延迟加载的机制是为了避免一些无所谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候才真正执行数据操作加载。 在Hibernate中提取对实体对象的延迟加载以及对集合的延迟加载。

 

  • Hibernate中java对象有几种状态?每种状态有什么特征?如何进入该状态?

1.临时状态:

特征:不处于Session缓存中

数据库中没有对象记录

如何进入:通过new语句刚创建对象时

当调用Session的delete()方法,从Session缓存中删除一       个对象时

2.持久化状态:

特征:处于Session缓存中

持久化数据库中没有对象记录

Session在特定时刻会保持二者同步

如何进入:Session的save()把一个临时的对象持久化

Session的load()、get()方法返回的对象

Session的find()返回的list集合中的对象

Session的update()、saveOrupdate()使游离的对象持久化

3.游离状态:

特征:不再位于Session缓存中

游离对象由持久化状态转变而来,数据库中可能还有对应记录

如何进入:Session的close()方法

Session的evict()方法,从缓存中删除一个对象

  • SSH中struts、spring、hibernate 的作用?

Struts在SSH 框架中起控制的作用,其核心是Controller, 即 ActionServlet, 而ActionServlet 的核心就是 Struts-config.xml. 主要控制逻辑关系的处理。

Spring是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的编程 , 由容器控制程序之间的(依赖)关系,控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态的将某种依赖关系注入到组件之中,起到的主要作用是解耦。

hibernate 是数据持久化层 , 是一种新的对象、关系的映射工具 , 提供了从 Java 类到数据表的映射,也提供了数据查询和恢复等机制 , 大大减少数据访问的复杂度。把对数据库的直接操作 , 转换为对持久对象的操作。

  • 项目中为什么使用SSH
  1. 使用Struts是因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。
  2. 使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个重量级的持久性框架,功能丰富。
  3. 使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;

采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理(Transcation Managment),等等

 

  • hibernate拒绝连接、服务器崩溃的原因
    1. db没有打开
    2. 网络连接可能出了问题
    3. 连接配置错了
    4. 驱动的driver,url是否都写对了
    5. 5. 数据库配置可能有问题
    6. 6. 当前联接太多了,服务器都有访问人数限制的
    7. 7. 服务器的相应端口没有开,即它不提供相应的服务
  • getCurrentSession()与openSession()的区别?

 1) 采用getCurrentSession()创建的session会绑定到当前线程中而采用openSession()创建的session则不会

2) 采用getCurrentSession()创建的session在commit或rollback时会自动关闭而采用openSession()创建的session必须手动关闭

  • Hibernate中的update()和saveOrUpdate()的区别

update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。

update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。

saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会 更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。

  • EJB包含哪3种bean

session bean(会话bean), entity bean(实体bean), message bean(消息bean)

  • JAVA的设计模式

设计模式是不分语言的;前辈们总结出来的设计模式分:3种类型及23种模式:
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式

  • struts2主要用到的模式:

1.MVC模式

2.command命令模式

3.代理Proxy

4.适配器Adapter

5.单例模式Singleton

6.职责链模式 Chain of Responsibility

  • spring主要用到的设计模式:

1.简单工厂即静态工厂模式Static Factory Method

2.工厂模式Factory Method

3.单例模式Singleton

4.适配器Adapter

5.装饰器Decorator

6.代理Proxy

7.观察者Observer

8.策略Strategy

9.模板方法Template Method

  • JSP的九大内置对象及其作用域

request           请求对象             类型 javax.servlet.ServletRequest        作用域 Request

response          响应对象              类型 javax.servlet.SrvletResponse        作用域 Page

pageContext      页面上下文对象        类型 javax.servlet.jsp.PageContext     作用域 Page

session           会话对象              类型 javax.servlet.http.HttpSession      作用域 Session

application       应用程序对象    类型 javax.servlet.ServletContext        作用域 Application

out               输出对象              类型 javax.servlet.jsp.JspWriter         作用域 Page

config             配置对象              类型 javax.servlet.ServletConfig         作用域 Page

page              页面对象              类型 javax.lang.Object                   作用域 Page

exception        例外对象              类型 javax.lang.Throwable                作用域 page

 

 四个作用域从大到小:appliaction>session>request>page

 四个作用域从大到小:appliaction>session>request>page

      application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。

      session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记              住这个会话状态。

      request:请求作用域,就是客户端的一次请求。

      page:一个JSP页面。

      以上作用范围使越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward)。

  • Struts2的标签库

首先需要引用 <%@taglib prefix=”s” uri=”/struts-tags”%>

         1.<s:if></s:if> 判断标签 后面可跟 <s:else>

2.<s:iterator> </s:iterator> 迭代标签

3.<s:include></s:include> 引入标签 可以把一个JSP页面或者servlet引入一                        个页面中

4.<s:property></s:property> 输出标签

5.<s:set></s:set> 标签赋予变量一个特定范围内的值

6.<s:form></s:form> 表单标签

7.<s:testarea></s:textarea> 文本域标签

8.<s:select></s:select> 下拉标签

9.<s:url></s:url> 声明一个url的路径

最常用的是:

判断<s:if></s:if>

循环<s:iterator></s:terator>

输出<s:property></s:property>

  • Hibernate的三种状态

  •  AOP和IOC的作用

IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。

AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。

Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。

不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便

  • 单例

单例就是该类只能返回一个实例。

单例所具备的特点:

1.私有化的构造函数

2.私有的静态的全局变量

3.公有的静态的方法

单例分为懒汉式、饿汉式和双层锁式

饿汉式:

public class Singleton1 {

      private Singleton1() {};

      private static Singleton1 single = new Singleton1();

      public static Singleton1 getInstance() {

          return single;

     }

 }

懒汉式:

public class Singleton2 {

      private Singleton2() {}

      private static Singleton2 single=null;

      public tatic Singleton2 getInstance() {

           if (single == null) {

              single = new Singleton2();

          }

         return single;

     }

 }

线程安全:

public class Singleton3 {

        private Singleton3() {}

        private static Singleton3 single ;

        public static Singleton3 getInstance() {

            if(null == single){

                  synchronized(single ){

                        if(null == single){

                              single = new Singleton3();

                        }

                  }

            }

            return single;

        }

}

  • 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

 final StringBuffer a=new StringBuffer(“immutable”);
执行如下语句将报告编译期错误:

a=new StringBuffer(“”);
但是,执行如下语句则可以通过编译:

a.append(” broken!”);

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param){

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

          param.append(“a”);

  • 如何把一段逗号分割的字符串转换成一个数组?

如果不查jdk api,我很难写出来!我可以说说我的思路:

  1. 用正则表达式,代码大概为:String [] result = orgStr.split(“,”);
  2. 用 StingTokenizer ,代码为:StringTokenizer tokener = StringTokenizer(orgStr,”,”);

String [] result = new String[tokener .countTokens()];

Int i=0;

while(tokener.hasNext(){result[i++]=toker.nextToken();}

  • String 和StringBuffer的区别?

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。

StringBuffer sbf = new StringBuffer();

for(int i=0;i<100;i++)

{

       sbf.append(i);

}

上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。

String str = new String();

for(int i=0;i<100;i++)

{

       str = str + i;

}

在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异,最后还要讲讲StringBuilder与StringBuffer的区别。

String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

  • List、Map、Set三个接口,存取元素时,各有什么特点?

这样的题属于随意发挥题:这样的题比较考水平,两个方面的水平:一是要真正明白这些内容,二是要有较强的总结和表述能力。如果你明白,但表述不清楚,在别人那里则等同于不明白。

首先,List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

       List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

       Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合,还可以获得所有的value的结合,还可以获得key和value组合成的Map.Entry对象的集合。

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

HashSet按照hashcode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储。例如,”abc” —> 78,”def” —> 62,”xyz” —> 65在hashSet中的存储顺序不是62,65,78,这些问题感谢以前一个叫崔健的学员提出,最后通过查看源代码给他解释清楚,看本次培训学员当中有多少能看懂源码。LinkedHashSet按插入的顺序存储,那被存储对象的hashcode方法还有什么作用呢?学员想想!hashset集合比较两个对象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new 两个Student插入到HashSet中,看HashSet的size,实现hashcode和equals方法后再看size。

同一个对象可以在Vector中加入多次。往集合里面加元素,相当于集合里用一根绳子连接到了目标对象。往HashSet中却加不了多次的。

  • 你所知道的集合类都有哪些?主要方法?

最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作”键”和”值”),其中每个键映射到一个值。

ArrayList/VectoràList

                    àCollection

HashSet/TreeSetàSet

PropetiesàHashTable

                                   àMap

       Treemap/HashMap

我记的不是方法名,而是思想,我知道它们都有增删改查的方法,但这些方法的具体名称,我记得不是很清楚,对于set,大概的方法是add,remove, contains;对于map,大概的方法就是put,remove,contains等,因为,我只要在eclispe下按点操作符,很自然的这些方法就出来了。我记住的一些思想就是List类会有get(int index)这样的方法,因为它可以按顺序取元素,而set类中没有get(int index)这样的方法。List和set都可以迭代出所有元素,迭代时先要得到一个iterator对象,所以,set和list类都有一个iterator方法,用于返回那个iterator对象。map可以返回三个集合,一个是返回所有的key的集合,另外一个返回的是所有value的集合,再一个返回的key和value组合成的EntrySet对象的集合,map也有get方法,参数是key,返回值是key对应的value。

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

对。

如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就必须相等。

如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不等是可以的,例如arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。

 

编程学习

Java-面试考点随记

2020-9-19 1:22:48

编程学习

Java-异或运算^

2020-9-19 16:52:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索