Java面试必备:32个关键问题解析

需积分: 10 3 下载量 125 浏览量 更新于2024-10-31 收藏 49KB DOC 举报
"Java程序员面试常见问题集合,涵盖了基础语法、类与对象、集合框架、内存管理等多个方面,旨在帮助面试者准备Java技术面试。" 1. **final, finally, finalize的区别** - `final` 关键字用于声明变量、方法或类不可变,对于变量意味着一旦赋值就不能改变,对于方法表示不能被重写,对于类表示不能有子类。 - `finally` 通常用于异常处理,无论是否发生异常,finally块中的代码都会执行,确保关键的清理操作得以完成。 - `finalize` 是Java中的一个方法,定义在`Object`类中,用于在对象被垃圾收集器回收前执行清理工作,但不推荐直接使用,因为它的行为不一致且效率低。 2. **AnonymousInnerClass(匿名内部类)** - 匿名内部类可以直接继承一个类或实现一个接口,但只能做一次,并且没有名称。它常用于简洁地实现回调、事件监听等场景。 3. **StaticNestedClass和InnerClass** - 静态嵌套类(Static Nested Class)是静态成员类,不持有对外部类的引用,可以直接通过类名访问,类似于普通的静态类。 - 内部类(Inner Class)是非静态的,每个内部类对象都隐含地持有一个外部类的对象引用,需要先创建外部类对象才能创建内部类对象。 4. **& 和 && 的区别** - `&` 是位运算符,用于进行按位与操作,也可以在逻辑表达式中作为短路与,但始终会计算两边的操作数。 - `&&` 是逻辑与运算符,如果第一个操作数为假,就不会计算第二个操作数,这种称为短路与。 5. **HashMap和Hashtable的区别** - `HashMap` 不是线程安全的,适用于单线程环境,允许null键和null值。 - `Hashtable` 是线程安全的,不能接受null键和null值,它是`Dictionary`类的子类。 6. **Collection和Collections的区别** - `Collection` 是所有集合类的父接口,代表一组对象的集合。 - `Collections` 是一个工具类,提供了对集合类的一系列操作方法,如排序、搜索和修改等。 7. **使用assert** - `assert` 用于断言,主要用于调试阶段,用来验证程序中的一些假设是否正确。在生产环境中,一般关闭断言功能,以提高性能。 8. **GC(Garbage Collection)** - GC 是垃圾收集器,负责自动回收Java程序中不再使用的对象,以释放内存。它的存在是为了避免内存泄漏和手动内存管理的复杂性。 9. **String对象的创建** - `Strings = new String("xyz");` 创建了两个String对象,一个在常量池,一个在堆内存。 - 字符串连接操作如`s1 = s1 + 1;` 会创建新的String对象,而`s1 += 1;` 在编译后会转换为使用StringBuilder,效率更高。 10. **Math.round()** - `Math.round(11.5)` 返回12,`Math.round(-11.5)` 返回-11。 11. **short变量的加法** - `short s1 = 1; s1 = s1 + 1;` 错误,因为加法操作会提升为int类型,需要显式转换回short。 - `short s1 = 1; s1 += 1;` 正确,编译器会自动处理类型转换。 12. **sleep() 和 wait()** - `sleep()` 是Thread类的方法,使当前线程暂停指定时间,不会释放对象锁。 - `wait()` 是Object类的方法,用于线程间通信,让线程等待直到其他线程调用notify()或notifyAll(),会释放对象锁。 13. **Java没有goto语句** - Java设计时摒弃了goto,以提高代码的可读性和维护性。 14. **length() 方法** - 数组没有`length()`方法,而是使用`length`属性获取长度。 - String有`length()`方法,返回字符串的字符数量。 15. **Overload和Override的区别** - Overload(重载)是在同一类中,方法名相同但参数列表不同的多个方法。 - Override(重写)是指子类重新定义父类中具有相同名称和参数列表的方法。 16. **Set中的元素区分** - Set中的元素通过`equals()`方法区分是否重复,而不是使用`==`,因为`equals()`比较的是对象内容,而`==`比较的是对象引用。 17. **常见的RuntimeException** - 常见的运行时异常如NullPointerException,ArrayIndexOutOfBoundsException,ArithmeticException等,它们不需要在方法签名中声明。 18. **Error和Exception的区别** - Error表示系统级错误,如内存溢出、JVM崩溃等,通常无法恢复。 - Exception是程序运行时可以预见的问题,可以通过捕获和处理继续执行。 19. **List, Set, Map与Collection的关系** - List、Set和Map都是Java集合框架的一部分,它们都继承自`Collection`接口,但各自有不同的特性和使用场景。 20. **abstract class和interface的区别** - 抽象类可以有构造方法、字段和非抽象方法,可以包含具体实现,一个类只能继承一个抽象类。 - 接口只包含方法声明,不能有实现,一个类可以实现多个接口。 21. **abstract method的限制** - abstract method不能是static、native或synchronized,因为这些修饰符与抽象方法的概念相冲突。 22. **接口与接口的继承,抽象类与接口的关系** - 接口可以继承接口,实现多继承。 - 抽象类可以实现接口,但抽象类不能继承实体类(Concrete Class),因为抽象类本身就是一个未完成的类定义。