代码胜过言语,因此:
final int size = 100;
Map<Integer, String> m = new HashMap<>(size);
for (int i = 0; i < size; i++) m.put(i, String.valueOf(i));
为什么HashMap在内部调用resize()2次!(Andreas指出JVM在内部使用HashMap,其中19个调用来自其他进程)两次resize()调用对于我的应用程序仍然不可接受。我需要优化这个问题。如果我是一个新的Java开发者,我第一直觉猜测HashMap构造函数中的"容量"是我(HashMap的消费者)要放入Map的元素数量的容量。但这是不正确的。如果我想优化我的HashMap使用,使其根本不需要重新调整大小,那么我需要非常熟悉HashMap的内部情况,以便准确地知道HashMap桶数组需要多么稀疏。在我看来,这很奇怪。HashMap应该为您隐式执行此操作。这是面向对象编程中封装的全部意义。注:我确认resize()是我的应用程序使用情况的瓶颈,所以我的目标是减少对resize()操作的调用次数。问题是:如果我预先知道我要放入地图的项目的确切数量,我选择什么容量,以防止任何额外的resize()操作?类似于size*10这样的东西?我也想了解一些为什么HashMap被设计成这样的背景知识。编辑:我被问了很多为什么这种优化是必要的。我的应用程序在hashmap.resize()中花费了相当多的CPU时间。我的应用程序使用的哈希图是用与我们放入其中的元素数量相等的容量初始化的。因此,如果我们可以减少resize()调用(通过选择更好的初始容量),那么我的应用程序性能就会得到改善。
HashMap
应该只需要调整一次大小,从初始容量 128 到最终容量 256。你是如何测量它在代码执行期间调整大小的次数的? - Bobulousresize()
函数,但是我们不清楚你是如何计算出这个数字的。仅编译代码肯定无法展示循环导致HashMap
对象实际重新调整大小的次数。你采用了哪些方法来计算resize()
实际被调用的次数? - Bobulous