Java  面试常见问题整理

作者: 我是小徐同学 | 来源:发表于2017-08-20 11:50 被阅读625次

    问题:

    1. 重写和重载的区别
    2. 接口和抽象类的区别,各有什么特点
    3. 谈谈 final, finally, finalize 的区别。
    4. Anonymous Inner Class(匿名内部类) 是否可以 extends(继承) 其它类
      ,是否可以 implements (实现) interface (接口)?
    5. Static Nested Class 和 Inner Class 的不同,说得越多越好(面试题有
      的很笼统)。
    6. & 和 && 的区别。
    7. HashMap 和 Hashtable 的区别。
    8. Collection 和 Collections的区别。
    9. 什么时候用 assert。
    10. GC 是什么? 为什么要有 GC?
    11. String s = new String ( "xyz" );创建了几个 String Object?
    12. Math.round(11.5) 等于多少? Math.round(-11.5) 等于多少?
    13. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有
      什么错?
    14. sleep() 和 wait() 有什么区别?
    15. Java 有没有 goto?
    16. 数组有没有 length()这个方法? String 有没有 length()这个方法?
    17. Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值
      的类型?
    18. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是
      equals()? 它们有何区别?
    19. 给我一个你最常见到的 runtime exception。
    20. error 和 exception 有什么区别?
    21. List,Set, Map 是否继承自 Collection 接口?
    22. abstract class 和 interface 有什么区别?
    23. abstract 的 method 是否可同时是 static,是否可同时是 native,是否
      可同时是 synchronized?
    24. 接口是否可继承接口? 抽象类是否可实现 (implements) 接口? 抽象
      类是否可继承实体类 (concrete class)?
    25. 启动一个线程是用 run()还是 start()?
    26. 构造器 Constructor 是否可被 override?
    27. 是否可以继承 String 类?
    28. 当一个线程进入一个对象的一个synchronized方法后,其它线程是
      否可进入此对象的其它方法?
    29. try {}里有一个return语句,那么紧跟在这个try后的finally {}里
      的code会不会被执行,什么时候被执行,在return前还是后?
    30. 编程题: 用最有效率的方法算出2乘以8等於几?
    31. 两个对象值相同(x.equals(y) == true),但却可有不同的hash
      code,这句话对不对?
    32. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的
      属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    33. swtich是否能作用在byte上,是否能作用在long上,是否能作用在
      String上?
    34. 编程题: 写一个Singleton出来。

    答案:

    1. 重写和重载的区别
      重写首先要求子类继承父类,子类重写父类的方法。可以概括为两同两小一大
      两同:方法名相同,形参列表相同;
      两小:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。
      一大:子类方法的访问权限应比父类方法的访问权限更大或相等。
      重载有两种形式,一种是普通方法的重载,另一种是构造方法的重载。
      普通方法的重载:(1)方法名相同:完成相同的功能;
      (2)参数列表不同:参数个数、参数类型、参数顺序;
      (3)形参名不同、返回值类型不同不影响方法的加载。
      构造方法的重载:(1)一个类可以有多个构造方法;构造方法可以重载;(2)建议:如果定义了有参构造,也加一个无参构造方法;
      (3)一个类里至少有一个构造方法。(如果没有显式定义任何构造方法,系统会分配一个默认无参的构造方法)

    2. 接口和抽象类的区别,各有什么特点
      抽象类
      (1)抽象方法:public abstract void shout();只有方法声明,没有方法体;
      (2)如果类里有抽象方法了,类必须声明为抽象类;public abstract class Animal {...}
      抽象类特点:
      (1) 抽象类不能生成它本身类型的对象;是不完整的类设计图。
      (2) 抽象类用来被继承;Animal an=new Dog();
      (3) 抽象类可以有成员变量,成员方法,构造方法等和具体类相同的成员;抽象类可以有0个和多个抽象方法。
      (4) 抽象类被继承,语义:is-a,子类是一种父类;
      (5) 子类
      1)实现抽象类的方法;
      2)继续声明为抽象方法,同时子类也声明为抽象类。
      接口包含
      Field(只能是常量)
      方法(只能是抽象方法)
      内部类(包括内部接口、枚举)
      接口里不包含构造方法
      接口特点:
      (1)接口里所有成员都是public访问权限。
      (2)接口里的常量 Field 是使用public static final修饰符来修饰,不管定义时是否指定。
      (3)接口里的方法是自动使用public abstract修饰符修饰,不管定义方法时是否指定。
      (4)接口里的内部类(接口、枚举类)是自动使用public static修饰符修饰,不管定义时是否指定。
      (5)接口不能用于创建实例,其主要用途是被实现类实现。实现使用implements关键字
      (6)一个类能实现多个接口
      (7)一个类能同时继承类有实现接口(先extends再implements)
      (8)接口能继承接口
      (9)接口能继承多个接口
      抽象类和接口的比较:
      相同点:
      (1)接口和抽象类都不能被实例化,它们都用于被其他类实现或继承。
      (2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
      不同点:
      (1)接口里只能包含抽象方法,而抽象类既可以抽象方法也可以包含普通方法,还可以没有抽象方法。
      (2)接口里不能定义静态方法(因为全部是抽象方法),抽象类里可以定义静态方法。
      (3)接口里只能定义静态常量 Field,而抽象类既可以定义普通 Field,也可以定义静态常量 Field。
      (4)接口里不包含构造方法,而抽象类里完全可以包含。
      (5)一个类最多只能有一个直接父类,但却可以直接实现多个接口(弥补Java单继承的不足)

    3. 谈谈final, finally, finalize 的区别。
      final — 修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重载。
      finally — 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
      finalize — 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

    4. Anonymous Inner Class (匿名内部类) 是否可以 extends(继承) 其它类,是否可以 implements(实现) interface(接口)?
      匿名的内部类是没有名字的内部类。不能 extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

    5. 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)意味着:创建一个static内部类的对象,不需要一个外部类对象;不能从一个 static 内部类的一个对象访问一个外部类对象

    6. & 和 && 的区别。
      & 是位运算符,&& 是布尔逻辑运算符。& 和 && 都是「与」运算符,运算规则相同,区别在于若 && 左边为 false,则不计算右边,整个表达式就是 false,而 & 两边不论怎样都要计算。

    7. HashMap 和 Hashtable 的区别。
      都属于 Map 接口的类,实现了将唯一键映射到特定的值上。HashMap 类没有分类或者排序,它允许一个 null 键和多个 null 值。Hashtable 类似于 HashMap,但是不允许 null 键和 null 值,它也比 HashMap 慢,因为它是同步的。Hashtable: 效率低,线程安全;HashMap: 效率高,线程不安全。

    8. Collection 和 Collections 的区别。Collections 是个 java.util 下的类,它包含有各种有关集合操作的静态方法。Collection 是个 java.util 下的接口,它是各种集合结构的父接口。

    9. 什么时候用 assert。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 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 标记。还可以在包的基础上启用或者禁用断言。可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

    10. GC 是什么? 为什么要有 GC? (基础题)。
      GC 是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime().gc()

    11. String s = new String("xyz");创建了几个String Object?
      两个对象,一个是 “xyx”,一个是指向 “xyx” 的引用对象 s。(建议看一下我之前写的关于 java 中的 string 类的文章)

    12. Math.round(11.5) 等于多少? Math.round(-11.5) 等于多少?
      Math.round(11.5) 返回(long)12,Math.round(-11.5)返回(long)-11;

    13. 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正确,它表示先计算 s1 + 1,然后再强转为 short 型。

    14. sleep() 和 wait() 有什么区别?
      sleep() 方法是使线程停止一段时间的方法。在 sleep 时间间隔期满后,线程不一定立即恢复执行,这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非 “醒来” 的线程具有更高的优先级或者正在运行的线程因为其它原因而阻塞。wait() 是线程交互时,如果线程对一个同步对象 x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

    15. Java 有没有 goto?
      Goto -- java 中的保留字,现在没有在java中使用。

    16. 数组有没有 length() 这个方法? String 有没有 length() 这个方法?
      数组没有 length() 这个方法,有 length 的属性。String 有 length() 这个方法。

    17. Overload 和 Override 的区别。Overload 的方法是否可以改变返回值的类型?
      方法的重写(Overriding)和重载(Overloading)是 Java 多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overload 是一个类中多态性的一种表现。
      子类重写父类的方法要求:方法名相同,形参列表相同;子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;子类方法的访问权限应比父类方法的访问权限更大或相等。
      重载的要求:方法名相同:完成相同的功能;参数列表不同:参数个数、参数类型、参数顺序;另外,形参名不同、返回值类型不同不影响方法的加载。
      Overload 的方法是可以改变返回值的类型。

    18. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()?它们有何区别?
      Set 里的元素是不能重复的,那么用 iterator() 方法来区分重复与否。equals()是判读两个 Set 是否相等。equals() 和 == 方法决定引用值是否指向同一对象,equals() 在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

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

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

    21. List,Set, Map 是否继承自 Collection 接口?
      List,Set是继承自 Collection 接口,Map不是。

    22. abstract class 和 interface 有什么区别?
      声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,即在子类中实现抽象方法
      接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只能定义 static final 成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,该类要重写接口中的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

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

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

    25. 启动一个线程是用 run() 还是 start()?
      启动一个线程是调用 start() 方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行。这并不意味着线程就会立即运行。

    26. 构造器 Constructor 是否可被 override?
      构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

    27. 是否可以继承 String 类?
      String 类是 final 类故不可以继承。

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

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

    30. 编程题: 用最有效率的方法算出 2 乘以 8 等于几?
      2 << 3

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

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

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

    34. 编程题: 写一个 Singleton 出来。
      Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。一般 Singleton 模式通常有几种种形式:

    public class Singleton {
      private static Singleton instance = null;
      public static synchronized Singleton getInstance() {
      //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
      //使用时生成实例,提高了效率!
      if (instance==null){
        instance=new Singleton();
        return instance;
      }
     }
    }
    

    Hashtable 和 HashMap:
    Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。HashMap 允许将 null 作为一个 entry 的 key 或者
    value,而Hashtable不允许。还有就是,HashMap 把 Hashtable 的contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains方法容易让人引起误解。
    最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable 和 HashMap 采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

    相关文章

      网友评论

      本文标题:Java  面试常见问题整理

      本文链接:https://www.haomeiwen.com/subject/wglerxtx.html