在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,长时间无法找到应用程序意外崩溃的原因。