HashMap
HashSet
HashMap 是基于哈希表的 Map 实现,允许 null 值和 null 键。它提供了常量时间的性能(O(1))进行基本操作(如获取和插入)。
初始容量与负载因子:
// 预估存储1000个键值对 HashMap<String, Integer> map = new HashMap<>(1000, 0.75f);
避免过度装箱:如果频繁地从 HashMap 中检索整数值,考虑使用 int 而不是 Integer。
int
Integer
// 使用 primitive 类型的 int 避免装箱 HashMap<String, int[]> map = new HashMap<>();
使用 computeIfAbsent 方法:在处理复杂的数据初始化时,computeIfAbsent 可以简化代码。
computeIfAbsent
map.computeIfAbsent("key", k -> new ArrayList<>()).add("value");
使用合适的 Key 类:确保键类正确实现了 hashCode 和 equals 方法,以便 HashMap 可以正确地存储和检索元素。
hashCode
equals
并发使用:如果需要在多线程环境中使用 HashMap,请考虑使用 ConcurrentHashMap。
ConcurrentHashMap
HashSet 是基于哈希表实现的 Set 接口的实现,不保证集合的迭代顺序,允许 null 元素。
// 预估存储1000个元素 HashSet<String> set = new HashSet<>(1000, 0.75f);
避免重复元素:HashSet 本质上用于避免存储重复元素,因此在需要确保唯一性的场景下非常有效。
Set<String> uniqueElements = new HashSet<>(listWithDuplicates);
高效迭代:使用增强的 for 循环或 Iterator 进行高效迭代。
Iterator
for (String element : set) { // process element }
线程安全:在多线程环境中考虑使用 Collections.synchronizedSet 或 ConcurrentHashMap.newKeySet()。
Collections.synchronizedSet
ConcurrentHashMap.newKeySet()
Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
避免频繁扩容:如果能估计到数据量,提前设置较大的初始容量,避免频繁扩容造成性能下降。
以下是一个结合 HashMap 和 HashSet 的综合示例:
import java.util.*; public class EfficientUsageExample { public static void main(String[] args) { // 创建一个容量为100,负载因子为0.75的HashMap HashMap<String, Integer> map = new HashMap<>(100, 0.75f); // 插入元素 map.put("Apple", 1); map.put("Banana", 2); map.put("Cherry", 3); // 使用computeIfAbsent方法 map.computeIfAbsent("Date", k -> 4); // 打印HashMap内容 map.forEach((key, value) -> System.out.println(key + " : " + value)); // 创建一个容量为50,负载因子为0.75的HashSet HashSet<String> set = new HashSet<>(50, 0.75f); // 插入元素 set.add("Apple"); set.add("Banana"); set.add("Cherry"); // 打印HashSet内容 for (String fruit : set) { System.out.println(fruit); } // 示例:从列表中去重并统计频率 List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Apple", "Banana"); // 使用HashSet去重 Set<String> uniqueFruits = new HashSet<>(fruits); // 使用HashMap统计频率 Map<String, Integer> frequencyMap = new HashMap<>(); for (String fruit : fruits) { frequencyMap.put(fruit, frequencyMap.getOrDefault(fruit, 0) + 1); } // 打印去重后的集合和频率统计 System.out.println("Unique fruits: " + uniqueFruits); System.out.println("Frequency map: " + frequencyMap); } }
通过合理设置初始容量和负载因子、使用适当的方法和数据结构、确保线程安全、避免过度装箱等技巧,可以显著提高 HashMap 和 HashSet 的使用效率。了解这些技巧并在实际开发中应用,可以编写出更加高效和健壮的 Java 程序。
原文链接:codingdict.net