编程后端开发者

Java中的集合是如何工作的?ArrayList、LinkedList和HashMap有什么区别?

用 Hintsage AI 助手通过面试

答案。

在Java中,集合实现了用于操作对象组的数据结构。主要结构:

  • ArrayList(实现了List接口)在数组中存储元素,提供快速按索引访问,但在中间插入/删除元素是慢的,因为需要移动元素。

  • LinkedList(也实现了List)基于双向链表。快速在中间插入/删除元素,但按索引访问较慢,因为需要从头或尾遍历列表。

  • HashMap实现了Map接口。存储键值对。通过哈希函数提供快速访问(O(1)),但不保证元素的顺序。

List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // 快速 arrayList.get(0); // 快速 List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // 稍慢 linkedList.add(0, "B"); // 快速 Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // 快速

诱导性问题。

HashMap和Hashtable之间的根本区别是什么,为什么Hashtable在现代代码中几乎不被使用?

回答: HashMap是非同步的,允许null作为键和值。Hashtable是同步的(多个线程可以在不威胁完整性的情况下操作同一对象),但不允许null,并且速度更慢。在现代代码中,通常使用ConcurrentHashMap来保证线程安全,因为它更有效并且更适合多线程计算。

Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // 可以 Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException

由于不了解主题细节而造成的实际错误示例。


故事

在学生管理系统中,使用ArrayList进行频繁的中间插入和删除,导致在大量数据时性能严重下降。更换为LinkedList后,情况正常化。


故事

在一个多线程CRM系统中,使用HashMap在没有同步的情况下存储线程之间的数据,导致数据不一致和由于竞争条件而崩溃。切换到ConcurrentHashMap后,bug消失。


故事

开发者尝试向Hashtable添加null键,未了解到禁止。这导致NullPointerException,长时间无法找到应用程序意外崩溃的原因。