From b20eaafa82d9ed70995c47ddbb449ed7c081a66f Mon Sep 17 00:00:00 2001 From: John Wagenleitner Date: Sun, 17 Apr 2016 16:48:25 -0700 Subject: [PATCH] GROOVY-7783 - Redundant computation in ObservableList Patch provided thanks to Monika Dhok. --- src/main/groovy/util/ObservableList.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/util/ObservableList.java b/src/main/groovy/util/ObservableList.java index cffc7364c91..af6dd24fb68 100644 --- a/src/main/groovy/util/ObservableList.java +++ b/src/main/groovy/util/ObservableList.java @@ -26,9 +26,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.Set; /** * List decorator that will trigger PropertyChangeEvents when a value changes.
@@ -271,8 +273,13 @@ public boolean removeAll(Collection c) { } List values = new ArrayList(); + // GROOVY-7783 use Sets for O(1) performance for contains + Set delegateSet = new HashSet(delegate); + if (!(c instanceof Set)) { + c = new HashSet(c); + } for (Object element : c) { - if (delegate.contains(element)) { + if (delegateSet.contains(element)) { values.add(element); } } @@ -293,6 +300,10 @@ public boolean retainAll(Collection c) { } List values = new ArrayList(); + // GROOVY-7783 use Set for O(1) performance for contains + if (!(c instanceof Set)) { + c = new HashSet(c); + } for (Object element : delegate) { if (!c.contains(element)) { values.add(element);