diff --git a/src/mhtree/BuildTree.java b/src/mhtree/BuildTree.java
index 961126ee5513ae9819e36720be28043dccc0bcb6..c32fcd0ea5ed9bfcb88ae927327eb40249eacd5e 100644
--- a/src/mhtree/BuildTree.java
+++ b/src/mhtree/BuildTree.java
@@ -65,7 +65,7 @@ class BuildTree {
 
             while (!notProcessedNodeIndices.isEmpty()) {
                 if (notProcessedNodeIndices.cardinality() < arity) {
-                    Set<Integer> nodeIndices = new HashSet<>();
+                    Set<Integer> nodeIndices = new HashSet<>(notProcessedNodeIndices.cardinality() - 1);
 
                     int mainNodeIndex = notProcessedNodeIndices.nextSetBit(0);
                     notProcessedNodeIndices.stream().skip(1).forEach(nodeIndices::add);
@@ -78,7 +78,7 @@ class BuildTree {
                 int furthestNodeIndex = getFurthestIndex(nodeDistances, notProcessedNodeIndices);
                 notProcessedNodeIndices.clear(furthestNodeIndex);
 
-                Set<Integer> nnNodeIndices = new HashSet<>();
+                Set<Integer> nnNodeIndices = new HashSet<>(arity - 1);
 
                 for (int i = 0; i < arity - 1; i++) {
                     int index = objectDistances.minDistInArrayExceptIdx(nodeDistances[furthestNodeIndex], notProcessedNodeIndices, furthestNodeIndex);
@@ -104,7 +104,7 @@ class BuildTree {
                 return;
             }
 
-            List<LocalAbstractObject> objects = new ArrayList<>();
+            List<LocalAbstractObject> objects = new ArrayList<>(leafCapacity);
 
             // Select a base object
             int furthestIndex = getFurthestIndex(objectDistances.getDistances(), notProcessedObjectIndices);
@@ -149,12 +149,12 @@ class BuildTree {
     }
 
     private Set<LocalAbstractObject> findClosestObjects(int baseObjectIndex, int numberOfObjects, BitSet notProcessedIndices) {
-        List<Integer> objectIndices = new ArrayList<>();
+        List<Integer> objectIndices = new ArrayList<>(1 + numberOfObjects);
 
         objectIndices.add(baseObjectIndex);
 
         return IntStream.range(0, numberOfObjects).mapToObj(i -> {
-            HashMap<Integer, Float> indexToDistance = new HashMap<>();
+            HashMap<Integer, Float> indexToDistance = new HashMap<>(objectIndices.size());
 
             for (int index : objectIndices) {
                 int nnIndex = objectDistances.minDistInArray(objectDistances.getDistances(index), notProcessedIndices);
diff --git a/src/mhtree/LeafNode.java b/src/mhtree/LeafNode.java
index d4c92824a2423dca306c1cb400a8bc4299a5160c..bc36cbd2a8407b603281f5ddd18fe5069f857bcf 100644
--- a/src/mhtree/LeafNode.java
+++ b/src/mhtree/LeafNode.java
@@ -31,7 +31,7 @@ public class LeafNode extends Node implements Serializable {
     }
 
     public Set<LocalAbstractObject> getObjects() {
-        Set<LocalAbstractObject> objects = new HashSet<>();
+        Set<LocalAbstractObject> objects = new HashSet<>(bucket.getObjectCount());
 
         for (AbstractObjectIterator<LocalAbstractObject> it = bucket.getAllObjects(); it.hasNext(); )
             objects.add(it.next());