基础变量计数
适用于简单场景,如循环次数统计。
int count = 0; // 初始化计数器 for (int i = 0; i < 100; i++) { if (i % 2 == 0) { count++; // 条件满足时自增 } } System.out.println("偶数个数: " + count); // 输出结果
数组元素计数
统计数组中特定元素的出现次数。
int[] numbers = {1, 2, 3, 2, 4, 2, 5}; int target = 2; int frequency = 0; for (int num : numbers) { if (num == target) { frequency++; } } System.out.println(target + " 出现次数: " + frequency);
集合框架计数
List/Set 计数
使用 Collections.frequency()
快速统计:
List<String> words = Arrays.asList("apple", "banana", "apple", "orange"); int appleCount = Collections.frequency(words, "apple"); // 返回2
Map 实现高级计数
统计单词频率(最优方案):
List<String> words = Arrays.asList("a", "b", "a", "c", "b"); Map<String, Integer> counter = new HashMap<>(); for (String word : words) { counter.put(word, counter.getOrDefault(word, 0) + 1); } // 输出:{a=2, b=2, c=1}
Java 8 Stream API 简化
Map<String, Long> result = words.stream() .collect(Collectors.groupingBy( word -> word, Collectors.counting() ));
并发场景下的安全计数
多线程环境中使用原子类避免竞争:
AtomicInteger threadSafeCounter = new AtomicInteger(0); // 多线程中安全递增 threadSafeCounter.incrementAndGet(); // 示例:10个线程各增加100次 ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0; i < 1000; i++) { executor.submit(() -> threadSafeCounter.incrementAndGet()); } executor.shutdown(); System.out.println("最终计数: " + threadSafeCounter.get()); // 输出1000
大数据量计数优化
使用 LongAdder
提升高并发性能:
LongAdder adder = new LongAdder(); adder.increment(); // 计数+1 adder.add(5); // 增加指定值 System.out.println("总和: " + adder.sum()); // 获取结果
实际应用场景
- 用户行为统计
记录按钮点击次数:clickCounter++
。 - 文本分析
用Map
统计词频(如上述示例)。 - 实时监控
使用AtomicInteger
记录系统请求量。
方法选择指南
场景 | 推荐方法 | 优势 |
---|---|---|
单线程简单计数 | int /long 变量 |
简单高效 |
集合元素频率统计 | HashMap + 循环 |
灵活通用 |
Java 8+ 集合统计 | Stream API | 代码简洁 |
高并发计数 | AtomicInteger |
线程安全 |
极高并发求和 | LongAdder |
性能最优 |
注意事项
- 作用域控制:计数器变量需定义在合适的作用域(如方法内或类成员)。
- 初始化:确保计数器初始化为0,避免未定义行为。
- 并发安全:多线程场景必须使用原子类或同步机制(如
synchronized
)。
引用说明: 参考 Oracle 官方文档 《Java Collections Framework》 和 《java.util.concurrent.atomic》,并结合实践案例总结,代码示例遵循 Java SE 8+ 语法规范。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/32589.html