From afa9ac8b774fe6a708ae412b103844aa7113449b Mon Sep 17 00:00:00 2001 From: Shane Carr Date: Sat, 3 Mar 2018 05:25:58 +0000 Subject: [PATCH] ICU-13620 Making MeasureUnit.getAvailable(type) return a Collection-based instead of Set-based data structure for better performance. X-SVN-Rev: 41055 --- .../src/com/ibm/icu/impl/CollectionSet.java | 85 +++++++++++++++++++ .../src/com/ibm/icu/util/MeasureUnit.java | 3 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 icu4j/main/classes/core/src/com/ibm/icu/impl/CollectionSet.java diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/CollectionSet.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/CollectionSet.java new file mode 100644 index 00000000000..94e4a981f95 --- /dev/null +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/CollectionSet.java @@ -0,0 +1,85 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html#License +package com.ibm.icu.impl; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +/** + * A wrapper around java.util.CollectionSet that implements java.util.Set. This class keeps a pointer to + * the CollectionSet and does not persist any data on its own. + */ +public class CollectionSet implements Set { + + private final Collection data; + + public CollectionSet(Collection data) { + this.data = data; + } + + @Override + public int size() { + return data.size(); + } + + @Override + public boolean isEmpty() { + return data.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return data.contains(o); + } + + @Override + public Iterator iterator() { + return data.iterator(); + } + + @Override + public Object[] toArray() { + return data.toArray(); + } + + @Override + public T[] toArray(T[] a) { + return data.toArray(a); + } + + @Override + public boolean add(E e) { + return data.add(e); + } + + @Override + public boolean remove(Object o) { + return data.remove(o); + } + + @Override + public boolean containsAll(Collection c) { + return data.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + return data.addAll(c); + } + + @Override + public boolean retainAll(Collection c) { + return data.retainAll(c); + } + + @Override + public boolean removeAll(Collection c) { + return data.removeAll(c); + } + + @Override + public void clear() { + data.clear(); + } +} diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java b/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java index 50ebcc1e630..d35c8dd8c0d 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java @@ -20,6 +20,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.ibm.icu.impl.CollectionSet; import com.ibm.icu.impl.ICUData; import com.ibm.icu.impl.ICUResourceBundle; import com.ibm.icu.impl.Pair; @@ -150,7 +151,7 @@ public class MeasureUnit implements Serializable { // Train users not to modify returned set from the start giving us more // flexibility for implementation. return units == null ? Collections.emptySet() - : Collections.unmodifiableSet(new HashSet(units.values())); + : Collections.unmodifiableSet(new CollectionSet(units.values())); } /** -- 2.40.0