Java:高频面试知识分享2
HashSet 和 TreeSet 的区别?
底层实现:HashSet 基于 HashMap 实现,使用哈希表存储元素;TreeSet 基于 TreeMap,底层为红黑树。
元素顺序:HashSet 无序;TreeSet 会根据元素的自然顺序或传入的 Comparator 进行排序。
性能:HashSet 的增删查为 O(1),TreeSet 为 O(log n)。
null 值支持:HashSet 允许添加一个 null 元素;TreeSet 不允许 null 元素。
使用场景:仅需去重且不关心顺序时使用 HashSet;需要排序或范围查询时使用 TreeSet。
Collection 和 Collections 的区别
Collection 是 Java 中集合类的根接口之一,包括 List、Set、Queue 等。
Collections 是一个工具类,提供对集合进行操作的静态方法,例如排序、同步包装等。
HashMap 和 Hashtable 的区别?
线程安全:HashMap 非线程安全;Hashtable 是线程安全的,内部方法有 synchronized 修饰。
null 键值支持:HashMap 允许一个 null 键和多个 null 值;Hashtable 不允许 null 键或 null 值。
性能:HashMap 性能更高;Hashtable 由于加锁性能较差。
是否过时:Hashtable 已基本被淘汰,推荐使用 ConcurrentHashMap。
Java 集合框架的常见接口有哪些?
Collection 接口:包括 List、Set、Queue 等。
Map 接口:用于存储键值对,如 HashMap、TreeMap 等。
List:有序可重复,如 ArrayList、LinkedList。
Set:无序不重复,如 HashSet、TreeSet。
Queue:队列结构,如 PriorityQueue、LinkedList。
Collection 接口的最佳实践?
编程时面向接口,如 List list = new ArrayList<>();
根据实际使用场景选择实现类。
多线程场景使用并发集合或通过 Collections.synchronizedXXX 包装集合。
避免返回 null,可返回空集合:Collections.emptyList()。
使用泛型增强类型安全。
ArrayList 和 HashMap 的默认容量?
ArrayList 的默认初始容量为 10。
HashMap 的默认初始容量为 16,负载因子为 0.75,超过容量 * 负载因子即触发扩容。
Java 中抽象和封装的区别?
抽象:关注对象具有什么功能,对外暴露必要的接口,隐藏实现细节。关键词:abstract、interface。
封装:将数据和操作封装在类中,通过访问控制符隐藏内部实现。关键词:private、getter/setter。
Java 是否支持多继承?
Java 不支持类的多继承,以避免菱形继承问题。
Java 支持接口的多继承,一个类可以实现多个接口。
Java 8 之后接口支持 default 方法,如有冲突需在实现类中显式重写。
static 方法中是否可以访问非 static 变量?
不可以。static 方法属于类,不依赖具体实例;非 static 变量属于对象,必须通过对象访问。
示例:
class Demo {int a = 10;static void test() {System.out.println(a); // 编译错误}
}
正确做法:
Demo d = new Demo();
System.out.println(d.a); // 正确