"Java面试题及答案"
在Java编程语言中,面试经常涉及到的关键知识点包括类与对象、字符串处理、封装特性、多态性、并发控制等。以下是对这些主题的详细解释:
1.1 重载与重写:
重载(Overloading)是Java中的多态形式之一,它允许在一个类中定义多个同名方法,但要求方法的参数列表(数量、类型或顺序)不同。返回值类型不影响方法的重载。
重写(Overriding)则发生在继承关系中,子类可以提供与父类相同方法名和参数列表的方法,目的是为了覆盖或改变父类原有的行为。在重写时,方法的访问权限不能更低,返回类型不能更宽,异常不能更广。
1.2 String与StringBuffer/StringBuilder的区别:
String类是不可变的,这意味着一旦创建,其内容就不能更改。这是出于性能和安全考虑,因为字符串常用于拼接,如果可变,会导致不必要的内存复制。StringBuffer和StringBuilder都是可变的,适合于频繁修改字符串内容。StringBuffer是线程安全的,适合多线程环境,而StringBuilder则没有线程同步,因此在单线程环境中性能更好。
1.3 自动装箱与拆箱:
装箱是指将基本数据类型(如int、float)转换为其对应的引用类型(如Integer、Float)。拆箱则是反过来,将引用类型转换回基本数据类型。这是Java自动进行的操作,提高了代码的简洁性。
1.4 ==与equals的区别:
在Java中,"=="用于比较基本类型的值或者引用类型的地址,而equals()方法默认比较的是对象的内存地址。但是,像String这样的类重写了equals()方法,使其比较的是对象的内容(即字符串的字符序列)。
1.5 final关键字:
final关键字用于声明不可变的变量、不可继承的类或不可重写的方法。它保证了变量的值不会改变,类的封闭性,以及方法的实现不被子类修改。
1.6 接口与抽象类:
接口(Interface)是一种完全抽象的类型,它只包含抽象方法(1.8以后可以有默认方法和静态方法),常量,并且一个类可以实现多个接口。接口主要用于定义行为规范。
抽象类(Abstract Class)可以包含抽象方法(没有实现的方法)和具体方法,一个类只能继承一个抽象类。抽象类用于提供模板设计,它可以作为子类的基础。
1.7 单例模式:
单例模式确保一个类只有一个实例,并提供全局访问点。常见的单例实现方式包括饿汉式(类加载时就创建实例,线程安全)、懒汉式(首次使用时创建,非线程安全)、双检锁/双重校验锁(DCL,线程安全,延迟初始化,同时使用synchronized和volatile保证并发安全)。
1.8 常见的数据结构:
数据结构是存储和组织数据的方式,常见的有数组、列表(ArrayList、LinkedList等)、集合(Set、List、Map等)、堆栈(Stack)、队列(Queue)、链表等,它们决定了数据的存取效率和操作便利性。
1.9 Java集合体系:
Java集合框架包括接口(如List、Set、Map)和实现类(如ArrayList、HashSet、HashMap等),它们提供了对对象的存储和操作功能。List接口存储有序的元素,可以有重复;Set接口存储不重复的元素;Map接口存储键值对。
1.10 wait和sleep方法:
wait()是Object类中的方法,用于线程同步,让当前线程等待,释放锁,直到其他线程调用notify()或notifyAll()唤醒。sleep()是Thread类的方法,使当前线程暂停执行指定时间,不释放锁。两者都用于控制线程执行,但使用场景和效果不同。