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

相关文章
|
1天前
|
缓存 Java 数据库连接
java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
10 3
|
2天前
|
安全 算法 Java
java多线程面试题2019整理
java多线程面试题2019整理
|
2天前
|
负载均衡 NoSQL Dubbo
java分布式面试快问快答
java分布式面试快问快答
9 0
|
2天前
|
XML Java 数据库连接
面试必备!Java核心技术100+面试题
面试必备!Java核心技术100+面试题
|
2天前
|
算法 Java 调度
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
7 0
|
2天前
|
SQL 网络协议 Java
技术经验分享:Java不会或做错的面试题总结
技术经验分享:Java不会或做错的面试题总结
11 0
|
2天前
|
安全 Java 中间件
《面试专题-----经典高频面试题收集一》解锁 Java 面试的关键:深度解析常见高频经典面试题(第一篇)
《面试专题-----经典高频面试题收集一》解锁 Java 面试的关键:深度解析常见高频经典面试题(第一篇)
8 0
|
2天前
|
安全 Java API
《面试专题-----经典高频面试题收集三》解锁 Java 面试的关键:深度解析并发编程基础篇高频经典面试题(第三篇)
《面试专题-----经典高频面试题收集三》解锁 Java 面试的关键:深度解析并发编程基础篇高频经典面试题(第三篇)
7 0
|
9天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案
|
9天前
|
存储 Java
java面试题大全带答案_面试题库_java面试宝典2018
java面试题大全带答案_面试题库_java面试宝典2018