From ef3fe11ae673558e278d8c30902253365950da78 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Thu, 14 Oct 2021 12:56:27 +0100 Subject: [PATCH] HHH-14882 Minor implementation optimisations in internal StandardStack The current StandardStack implementation is based on a LinkedList, which is well known to be a suboptimal choice; this should be switched to a lazily allocated ArrayDeque. --- .../util/collections/StandardStack.java | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/collections/StandardStack.java b/hibernate-core/src/main/java/org/hibernate/internal/util/collections/StandardStack.java index db11ba4e5e..91cf3f0257 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/collections/StandardStack.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/util/collections/StandardStack.java @@ -6,9 +6,8 @@ */ package org.hibernate.internal.util.collections; -import java.util.LinkedList; -import java.util.function.Consumer; -import java.util.function.Function; +import java.util.ArrayDeque; +import java.util.Deque; /** * A general-purpose stack impl. @@ -19,39 +18,58 @@ import java.util.function.Function; */ public final class StandardStack implements Stack { - private final LinkedList internalStack = new LinkedList<>(); + private ArrayDeque internalStack; public StandardStack() { } @Override public void push(T newCurrent) { - internalStack.addFirst( newCurrent ); + stackInstanceExpected().addFirst( newCurrent ); + } + + private Deque stackInstanceExpected() { + if ( internalStack == null ) { + //"7" picked to use 8, but skipping the odd initialCapacity method + internalStack = new ArrayDeque<>(7); + } + return internalStack; } @Override public T pop() { - return internalStack.removeFirst(); + return stackInstanceExpected().removeFirst(); } @Override public T getCurrent() { + if ( internalStack == null ) { + return null; + } return internalStack.peek(); } @Override public int depth() { + if ( internalStack == null ) { + return 0; + } return internalStack.size(); } @Override public boolean isEmpty() { + if ( internalStack == null ) { + return true; + } return internalStack.isEmpty(); } @Override public void clear() { - internalStack.clear(); + if ( internalStack != null ) { + internalStack.clear(); + } } }