假设需要在内存中维护一个计数器,在storm tuple来时更新计数器的值,最终统一提交到数据库
可以用commons-collection中的Bag或者MultiValueMap,不过效率不高.
用java的Map放Integer主要问题在于Integer是不可变类,每次需要构造新的对象,开销比较大,因此尝试了common-lang中的MutableInt和java.util中的AtomicInteger,这俩的效率不相上下.
不过最快的方式是在Map中放int数组...不过优势也不是特别明显
int size = 10000000;
// 1
long start = System.currentTimeMillis();
Bag bag = BagUtils.typedBag(new HashBag(), String.class);
for (int i = 0; i < size; i++) {
bag.add("" + (i % 100), 1);
}
System.out.println(bag.getCount("5"));
System.out.println(System.currentTimeMillis() - start);
// 2
start = System.currentTimeMillis();
MultiValueMap map = new MultiValueMap();
for (int i = 0; i < size; i++) {
map.put("" + (i % 100), 1);
}
int total = 0;
Collection<Integer> co = (Collection<Integer>) map.get("5");
for (Integer i : co) {
total += i;
}
System.out.println(total);
System.out.println(System.currentTimeMillis() - start);
// 3
start = System.currentTimeMillis();
Map<String, AtomicInteger> map3 = new HashMap<>();
for (int i = 0; i < size; i++) {
String key = "" + (i % 100);
AtomicInteger value = map3.get(key);
if (value == null) {
map3.put(key, new AtomicInteger(1));
} else {
value.addAndGet(1);
}
}
System.out.println(map3.get("5"));
System.out.println(System.currentTimeMillis() - start);
// 4
start = System.currentTimeMillis();
Map<String, MutableInt> map4 = new HashMap<>();
for (int i = 0; i < size; i++) {
String key = "" + (i % 100);
MutableInt value = map4.get(key);
if (value == null) {
map4.put(key, new MutableInt(1));
} else {
value.add(1);
}
}
System.out.println(map4.get("5"));
System.out.println(System.currentTimeMillis() - start);
// 5
start = System.currentTimeMillis();
Map<String, Integer> map5 = new HashMap<>();
for (int i = 0; i < size; i++) {
String key = "" + (i % 100);
Integer value = map5.get(key);
if (value == null) {
map5.put(key, new Integer(1));
} else {
map5.put(key, value + 1);
}
}
System.out.println(map5.get("5"));
System.out.println(System.currentTimeMillis() - start);
// 6
start = System.currentTimeMillis();
Map<String, int[]> map6 = new HashMap<>();
for (int i = 0; i < size; i++) {
String key = "" + (i % 100);
int[] value = map6.get(key);
if (value == null) {
map6.put(key, new int[] { 1 });
} else {
value[0] += 1;
}
}
System.out.println(map6.get("5")[0]);
System.out.println(System.currentTimeMillis() - start);
分享到:
相关推荐
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
Java的语法与C++类似,但更简化,同时提供了自动内存管理,使得开发者可以专注于解决问题,而不是内存管理。 在Java中创建一个计算器涉及到几个核心概念: 1. **基本数据类型**:Java有八种基本数据类型,包括整型...
标题和描述中提及的知识点主要围绕Java内存模型(JMM),JVM内存结构,包括堆栈讲解,以及本机内存管理等内容。以下是对这些知识点的详细阐述: ### Java内存模型(JMM) #### JMM简介 Java内存模型(JMM)是Java虚拟机...
Java内存模型将内存划分为几个区域,主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine ...
Java内存模型是Java平台的核心概念之一,它定义了Java程序中各种变量的访问规则以及如何在运行时分配内存区域给对象。Java内存模型的深入分析对于编写高性能的Java应用程序至关重要,本文将详细探讨Java内存模型的...
Java内存模型主要分为以下几个部分:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)以及本地方法栈(Native Method Stack)。本文将重点介绍其中的堆、栈、方法区以及...
Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...
### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关重要的环节。深入理解对象在内存中的分配过程不仅能够帮助开发者设计出更为...
### Java内存图解析 #### 一、概述 Java内存模型主要分为几个部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。这些区域各自承担着不同的责任,共同支撑起了Java程序的运行环境。下面将详细解释各个...
Java内存主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。其中,堆内存是Java对象的主要存储区域,容易出现内存泄露。 3. *...
Java内存模型是Java程序运行的基础,它规定了Java中数据在内存中的存储和访问规则。在Java内存模型中,堆内存和栈内存是两个核心概念。堆内存主要存放对象的实例,所有通过new创建的对象都会在堆内存中分配空间。而...
首先,Java内存分为几个主要区域,分别是:程序计数器(Program Counter Register)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)、堆(Heap)和方法区(Method Area),在Java 8及以后版本中,方法...
Java内存模型主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)和本地方法栈(Native Method Stack)。其中,堆内存存储对象实例,栈内存保存基本类型和...
Java内存主要分为堆内存(Heap)、方法区(Method Area)、栈内存(Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。堆内存用于存储对象实例,方法区存储类信息,栈内存处理...
Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...
在Java编程语言中,了解和控制JVM(Java虚拟机)的内存管理是至关重要的,尤其是在性能调优、资源管理和避免内存泄漏等方面。本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并...
# 深入Java内存模型:揭秘并发编程的基石 Java作为一款被广泛采用的编程语言,自1995年由Sun Microsystems(现为Oracle的一部分)首次推出以来,一直在不断发展和完善。Java的设计理念包含了诸如跨平台性、面向对象...
Java内存模型分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、本地方法栈(Native Method Stack)以及程序计数器(Program Counter Register)。内存溢出主要涉及堆和栈,以及方法区。 1. 堆内存...
Java内存模型,简称JVM内存模型,是Java虚拟机(JVM)运行时的核心组成部分,它定义了如何在多线程环境下共享数据以及确保数据一致性。深入理解Java内存模型对于优化程序性能、避免并发问题至关重要。 首先,让我们...
### Java内存的深入解析 #### 一、Java内存模型(JMM) Java内存模型(Java Memory Model,简称JMM)是Java虚拟机规范的一部分,它定义了程序中的各种变量(线程共享变量)的访问规则,以及在并发环境中变量的存储...