Java面试50问,女面试官最喜欢问的居然是它!

简介: Java面试50问,女面试官最喜欢问的居然是它!

[] HashMap和Hashtable有什么区别?

HashMap和Hashtable都是Java中实现Map接口的类,它们存储键值对(key-value pairs),并允许通过键快速检索值。尽管它们的基本概念相似,但存在一些关键的区别:

1. 线程安全性:
 - Hashtable:是线程安全的,它的所有方法都是同步的。这意味着在多线程环境中,可以直接使用Hashtable而不需要采取额外的同步措施。
 - HashMap:不是线程安全的。在多线程环境中,需要采取额外的同步措施,或者使用Collections.synchronizedMap包装一个HashMap来提供线程安全的Map实现。

2. null键和null值:
 - Hashtable:不允许使用null键(key)或null值(value)。
 - HashMap:允许一个null键和多个null值。

3. 性能:
 - 由于Hashtable的方法是同步的,所以在单线程环境中,HashMap通常提供更好的性能。
 - HashMap在Java 8中进行了优化,引入了LinkedHashMap作为其底层结构,提高了性能,并且增加了一些有用的新方法。

4. 继承:
 - Hashtable继承自Dictionary类,这是一个古老的类,它提供了类似HashMap的功能,但并不推荐使用。
 - HashMap直接实现了Map接口,并且是Java集合框架的一部分。

5. 遍历顺序:
 - Hashtable和HashMap都不保证遍历顺序,但根据Java 8的更新,HashMap的遍历顺序与插入顺序有关(在没有发生哈希冲突的情况下)。

6. 遗留代码:
 - Hashtable是Java早期版本中的一部分,现在被认为是遗留类,不推荐在新代码中使用。
 - HashMap是Java集合框架的一部分,推荐在新代码中使用。

7. 并发变体:
 - 如果需要线程安全的HashMap,可以使用ConcurrentHashMap,它是HashMap的线程安全版本,提供了更好的并发性能。

8. 接口实现:
 - Hashtable实现了Map接口和Dictionary类。
 - HashMap仅实现了Map接口。

在大多数情况下,开发者应该优先使用HashMap,除非特定情况需要线程安全的Map实现,此时可以考虑使用Hashtable或ConcurrentHashMap。由于Hashtable被认为是遗留类,所以推荐使用ConcurrentHashMap作为线程安全的替代品。

[] 什么是Java的泛型?

Java的泛型(Generics)是一种在编译时提供类型安全检查的特性。它允许开发者在定义类、接口、方法时指定类型参数,从而使得代码更加灵活和重用。

泛型的核心优势包括:

1. 类型安全:泛型提供了编译时类型检查,减少了运行时由于类型不匹配导致的错误。

2. 消除类型强转:使用泛型可以避免类型转换,使得代码更加简洁和易于维护。

3. 提高代码重用性:泛型使得集合类可以用于存储任意类型的元素,而不需要为每种类型编写特定的集合类。

4. 增强可读性:通过在类名或方法名中指定类型,泛型增强了代码的可读性,使得开发者更容易理解代码的意图。

泛型的基本概念和用法如下:

类型参数
类型参数是在定义泛型类、接口或方法时使用的占位符,它们在具体使用时会被具体的类型所替换。

public class Box<T> {
   private T t;

   public Box(T t) {
       this.t = t;
   }

   public T get() {
       return t;
   }
}

在这个例子中,T是一个类型参数,它在声明Box类时被使用,并在类的构造函数和get方法中被引用。

泛型类和接口
泛型类和接口可以定义类型参数,这些参数在实例化时会被具体的类型所替换。

public class Stack<E> {
   private E[] elements;
   private int size = 0;
   // ...
}

在这个例子中,Stack类定义了一个类型参数E,它将在创建Stack对象时被具体的类型所替换。

泛型方法
泛型方法允许在方法级别定义类型参数,使得方法可以操作任意类型的参数。

public <K, V> Map<K, V> singletonMap(K key, V value) {
   // ...
}

在这个例子中,singletonMap方法定义了两个类型参数K和V。

类型擦除
Java的泛型是基于类型擦除(Type Erasure)实现的。这意味着泛型的类型信息在编译后就不存在了,编译器会在编译时检查类型安全,并在运行时将泛型类型转换为其边界限定的类型或Object类型。

通配符
通配符(Wildcards)允许在泛型中指定类型的范围,提供了一种灵活指定类型参数的方式。

public void printList(List<?> list) {
   for (Object obj : list) {
       System.out.println(obj);
   }
}

在这个例子中,?通配符表示List可以持有任何类型的元素。

泛型是Java语言的一个强大特性,它极大地提高了代码的安全性、灵活性和可读性。然而,泛型也有一些限制,比如不能使用基本类型作为类型参数,也不能创建泛型数组等。

相关文章
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
18天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
46 14
|
28天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
23天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
27 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
53 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
106 4
|
1月前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
18 0
|
3天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
26 6