当前位置:首页 > 后端开发 > 正文

Java计数方法有哪些

在Java中计数通常使用变量自增实现,如int count=0后通过count++累加,数组计数可用索引映射(如arr[i]++),对象计数推荐HashMap(map.put(key,map.getOrDefault(key,0)+1)),多线程场景需用AtomicInteger等原子类保证线程安全。

基础变量计数

适用于简单场景,如循环次数统计。

int count = 0; // 初始化计数器
for (int i = 0; i < 100; i++) {
    if (i % 2 == 0) {
        count++; // 条件满足时自增
    }
}
System.out.println("偶数个数: " + count); // 输出结果

数组元素计数

统计数组中特定元素的出现次数。

Java计数方法有哪些  第1张

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()); // 获取结果

实际应用场景

  1. 用户行为统计
    记录按钮点击次数:clickCounter++
  2. 文本分析
    Map 统计词频(如上述示例)。
  3. 实时监控
    使用 AtomicInteger 记录系统请求量。

方法选择指南

场景 推荐方法 优势
单线程简单计数 int/long 变量 简单高效
集合元素频率统计 HashMap + 循环 灵活通用
Java 8+ 集合统计 Stream API 代码简洁
高并发计数 AtomicInteger 线程安全
极高并发求和 LongAdder 性能最优

注意事项

  1. 作用域控制:计数器变量需定义在合适的作用域(如方法内或类成员)。
  2. 初始化:确保计数器初始化为0,避免未定义行为。
  3. 并发安全:多线程场景必须使用原子类或同步机制(如 synchronized)。

引用说明: 参考 Oracle 官方文档 《Java Collections Framework》 和 《java.util.concurrent.atomic》,并结合实践案例总结,代码示例遵循 Java SE 8+ 语法规范。

0