Java面试、笔试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010287342/article/details/38942839

本文为本人整理网上流传的笔试题及相关网络的答案得来的

基础知识

  1、string 是最基本的数据类型吗?
       不是,java语言定义了4类共8种数据类型分别如下: 整型:byte、short、int、long 浮点型:float、double 逻辑型:boolean 字符型:char
  2、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,而原始类型实例变量的缺省值与它们的类型有关。
  3、string 和 stringbuffer 的区别
       参考自CSDN博客:http://blog.csdn.net/yirentianran/article/details/2871417
  4、运行时异常与一般异常有何异同?
       Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 
       但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
       出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
  5、说出 servlet 的生命周期,并说出 servlet 和 cgi 的区别。
       Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
       与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
专业知识
  6、说出 arraylist,vector, linkedlist 的存储性能和特性
       ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
  7、ejb 是基于哪些技术实现的?并说出 sessionbean 和 entitybean 的区别,statefulbean 和statelessbean 的区别。
       参考自CSDN博客:http://blog.csdn.net/zdwzzu2006/article/details/5945662
  8、collection 和 collections 的区别。
       Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 
       Collection是个java.util下的接口,它是各种集合结构的父接口。 
       List, Set, Map是否继承自Collection接口? List,Set是  Map不是
  9、&和&&的区别。
       &和&&都可以用作逻辑与的运算符,表示逻辑与(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。
  10、hashmap 和 hashtable 的区别。
        一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 
        二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 
        三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 
知识拓展
  11、final, finally, finalize 的区别。
        final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 
        finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。在异常处理时,使用finally模块来处理必要的清理工作,无论是否有异常发生,都会执行finally模块中语句,如果发生了异常,则先执行catch中语句,在执行finally中的语句。
        finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
  12、sleep() 和 wait() 有什么区别?
        1.这两个方法来自不同的类分别是Thread和Object
        2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
        3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
          synchronized(x){
             x.notify()
             //或者wait()
          }
        4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
        参考自CSDN博客:http://blog.csdn.net/liuzhenwen/article/details/4202967
  13、overload 和 override 的区别。overloaded 的方法是否可以改变返回值的类型?
        Overload是重载,是有相同的方法名,但参数类型或个数彼此不同
        Override是重写,是在子类与父类中,子类中的方法的方法名,参数个数、类型都与父类中的完全一样,在子类中覆盖掉了父类的改方法。
        Overloaded方法可以改变返回值的类型。
  14、error 和 exception 有什么区别?
        Error(错误)表示系统级的错误和程序不必处理的异常(Error不需要捕捉,因为这样做没有必要,也根本没有意义),是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。  Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
  15、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
        如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.
        当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.
  16、abstract class 和 interface 有什么区别?
        声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
        java抽象类的构造方法和普通类的构造方法一样
        都是用来初始化类
        只是抽象类的构造方法不能直接调用 因为抽象类不能实现实例
        但是一旦一个普通类继承了抽象类 便也可以在构造函数中调用其抽象类的构造函数
        也可以使用其方法
        抽象类就是一个不能实例化的不同类,如果方法加了abstract那么就必须在子类里面重写了

猜你喜欢

转载自blog.csdn.net/u010287342/article/details/38942839