Java基础面试题集

    |     2015年4月27日   |   Java面试题   |     0 条评论   |    1237

找工作要面试,有面试就有对付面试的办法。以下题目来自作者和朋友的面试经历,公司包括 IBM、E*Trade、Siebel、Motorola、SUN 以及其他大小公司。

面试题目有的不合情理、脱离实际。有纸面写的、当面考的、电话里问的,给你 IDE 的很少。所以看完请不要抱怨“这些都能用 IDE 解决”——必须在任何情况下准确回答。一两题不准则可能被拒。这些都是 Java 基础题:面试官多数不会问 Hibernate 有多先进、Eclipse 三个组成部分或 command pattern,最喜欢问基础知识。别小看基础,水平一流也可能栽在一题上。

一、关键字、内部类与运算符

第一,谈谈 final, finally, finalize 的区别。

final 用于声明属性、方法和类:属性不可变、方法不可覆盖、类不可继承。finally 是异常处理结构的一部分,表示总是执行。finalize 是 Object 的方法,垃圾收集器回收对象时会调用,可覆盖以释放其他资源(如关文件)。

第二,匿名内部类是否可以 extends 其它类,是否可以 implements 接口?

可以继承其他类或实现接口,Swing 编程中常用此方式。

第三,Static Nested Class 和 Inner Class 的不同。

Static Nested Class 是声明为 static 的内部类,可以不依赖外部类实例而被实例化。通常的内部类需要在外部类实例化后才能实例化。

第四,& 和 && 的区别。

& 是位运算符(按位与);&& 是逻辑与。逻辑与有短路:左边为 false 时右边不计算。

第七,什么时候用 assert。

1.4 新增关键字,测试 boolean 表达式,可用于调试。assert <boolean表达式>:为真则继续,否则抛 AssertionError。assert <boolean表达式>:<other表达式>:为真则忽略后面表达式,否则其值作为 AssertionError 的构建参数。编译要加 -source 1.4(旧工具链),运行要加 -ea,否则 assert 行被忽略。

第十,Math.round(11.5) 等於多少?Math.round(-11.5) 等於多少?

Math.round(11.5)==12,Math.round(-11.5)==-11。round 返回与参数最接近的长整数:参数加 1/2 后求 floor。

第十一,short s1 = 1; s1 = s1 + 1; 有什么错?s1 += 1 呢?

s1 = s1 + 1:s1+1 结果是 int,需要强制转换。s1 += 1 可以正确编译(复合赋值自带窄化转换)。

第十三,Java 有没有 goto?

没有。很“十三”的问题,如果面试还问这个,作者劝你别进这家公司。

第三十一,switch 是否能作用在 byte、long、String 上?

switch 的 expr 须是整数表达式:int、short、char、byte(以及它们的包装类型)。long 不能。面试当年 String 也不能;Java 7 起 switch 已支持 String,enum 从 Java 5 起就支持。

二、字符串、数组、集合

第五,HashMap 和 Hashtable 的区别。

HashMap 是 Hashtable 的轻量级实现(非线程安全),都完成 Map 接口。主要区别:HashMap 允许 null 键和值;非线程安全,效率上可能高于 Hashtable。

第六,Collection 和 Collections 的区别。

Collection 是集合类的上级接口,继承它的主要有 Set 和 List。Collections 是帮助类,提供一系列静态方法:搜索、排序、线程安全化等。

第九,String s = new String(“xyz”); 创建了几个 String Object?

两个:常量池里的 “xyz”,以及堆上 new 出来的对象。

第十四,数组有没有 length()?String 有没有 length()?

数组没有 length(),有 length 属性。String 有 length() 方法。

第十六,Set 里的元素不能重复,用什么区分重复?== 还是 equals()?

Set 靠 equals()(HashSet 还会用 hashCode())判断是否重复,不是靠 ==。== 比较引用是否指向同一对象;equals() 可被覆盖,以便两个分离对象内容和类型匹配时返回 true。

第十九,List, Set, Map 是否继承自 Collection 接口?

List、Set 是;Map 不是。

第二十五,是否可以继承 String 类?

String 是 final 类,不可以继承。

第二十九,两个对象值相同(x.equals(y)==true),却可有不同的 hash code,对不对?

不对。equals 为 true 时应当有相同的 hashCode(契约)。

对比 要点
HashMap vs Hashtable 前者可 null、非同步、通常更快
Collection vs Collections 接口 vs 工具类
List/Set vs Map 前两者是 Collection,Map 不是
== vs equals 引用 vs 内容(可覆盖)

三、面向对象与多态

第十五,Overload 和 Override 的区别。重载能否改返回值类型?

重写 Overriding 是父类与子类之间的多态:子类方法与父类同名同参,子类对象调用时用子类定义。重载 Overloading 是一个类中同名方法参数个数或类型不同。Overloaded 的方法可以改变返回值类型。

第二十,abstract class 和 interface 有什么区别?

抽象类声明某些行为的方法但不全部实现,不能创建实例,但可以声明抽象类型的变量指向具体子类。不能有抽象构造函数或抽象静态方法。子类必须实现所有抽象方法,否则自己也是抽象的。

接口是抽象类的变体:方法都抽象、无方法体,只能定义 static final 成员。通过实现接口获得多继承性。实现类必须给出全部方法体。可用接口名作引用类型,instanceof 可判断是否实现了某接口。

第二十一,抽象方法是否可同时是 static / native / synchronized?

都不能。

第二十二,接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?

接口可以继承接口。抽象类可以实现接口。抽象类可以继承实体类,前提是实体类必须有明确的构造函数。

第二十四,构造器是否可被 override?

构造器不能被继承,因此不能重写,但可以被重载。

第三十三,封装、抽象、继承、多态

封装:隐藏属性、方法或实现细节。权限修饰符:private 仅本类;public 任何地方;默认本包;protected 本包及外包子类。非权限修饰符:static、final、abstract。

  • static 成员可通过对象或类调用;static 方法内不能调非静态成员;static 块初始化静态成员
  • final 变量值不可变;final 方法不能被重写;final 类不能被继承
  • 抽象方法没有具体功能;含抽象方法的类不能 new;没有抽象方法的类也可以声明成抽象类
  • 接口用 interface 定义、implements 实现;方法默认 public;一个类可实现多个接口;接口可 extends 其他接口
  • 继承用 extends;子类继承父类方法和属性,永不继承构造方法;创建子类时父类构造总先于子类
  • 多态主要体现为重载与重写:重载同名不同参,不以返回值判断;重写是子类重定义方法体

四、异常、线程与内存

第八,GC 是什么?为什么要有 GC?

GC 是垃圾收集(Garbage Collection)。忘记或错误回收内存会导致程序不稳定甚至崩溃。Java 的 GC 自动监测对象是否超出作用域并回收内存,语言没有提供显式释放已分配内存的操作。

第十二,sleep() 和 wait() 有什么区别?

sleep 是 Thread 的方法,暂停指定时间,监控状态保持,到时自动恢复,不释放对象锁。wait 是 Object 的方法,放弃对象锁进入等待池,只有对该对象 notify / notifyAll 后才进入锁定池准备获得锁。

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

第十八,error 和 exception 有什么区别?

error 表示恢复很困难的严重问题,比如内存溢出,不能指望程序处理。exception 表示设计或实现问题:程序正常运行时从不会发生的情况。

第二十三,启动线程用 run() 还是 start()?

启动调用 start(),使线程处于可运行状态,由 JVM 调度,并不意味着立刻运行。run() 是线程体本身。

第二十六,线程进入一个对象的 synchronized 方法后,其它线程能否进入此对象的其它方法?

原文答“不能,一个对象的一个 synchronized 方法只能由一个线程访问”——更精确:其它线程不能进入该对象的其它 synchronized 实例方法(同一把对象锁);非 synchronized 方法仍可进入。

第二十七,try 里有 return,finally 里的 code 会不会执行?在 return 前还是后?

会执行,在 return 前执行。

第三十,对象当参数传入方法,方法可改其属性,这是值传递还是引用传递?

是值传递。Java 只按值传递参数。对象实例传入时,参数的值是对该对象的引用。对象内容可在被调方法中改变,引用本身永远不会指向另一个对象。

五、编程题

第二十八,用最有效率的方法算出 2 乘以 8 等於几?

有 C 背景的面试官特别喜欢问。2 << 3

第三十二,写一个 Singleton。

保证一个类只有一个实例。第一种:构造函数 private,类初始化时实例化 static private 变量,public getInstance 获取。第二种:第一次使用时才 new,方法加 synchronized。

public class Singleton {
    private Singleton() {}
    // 在自己内部定义一个实例。注意这是 private,只供内部调用
    private static Singleton instance = new Singleton();
    public static Singleton getInstance() {
        return instance;
    }
}

// 第二种形式:第一次使用时才生成实例
public class SingletonLazy {
    private static SingletonLazy instance = null;
    public static synchronized SingletonLazy getInstance() {
        if (instance == null)
            instance = new SingletonLazy();
        return instance;
    }
}
// 其他形式:构造函数 private,所有方法 static。一般认为第一种更安全。

一句话总结:基础面试几乎都在绕 final/集合/线程/多态这几组对比:先分清关键字职责,再分清锁、equals 契约和值传递,Singleton 能默写两种即可。

转载请注明来源:Java基础面试题集
本文链接地址:https://ai.zhousir.top/?p=587
回复 取消