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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值