summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Fuller <nfuller@google.com>2020-07-21 13:14:39 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-07-21 13:14:39 +0000
commit28977467ce7d4c7f5f7c4e3b2fc0a1a59f796e42 (patch)
tree6797f2a0d0c7f0cffe101f54559fd201c7e06b62
parent8c847de1076805741080e8f8472ef10d903652e1 (diff)
parent8b8c65b9724eec6ee3448ab7292f4e25430ab2b9 (diff)
downloadicu-28977467ce7d4c7f5f7c4e3b2fc0a1a59f796e42.tar.gz
Add String interning for zoneIds am: 8b8c65b972
Original change: https://android-review.googlesource.com/c/platform/external/icu/+/1366781 Change-Id: I5f1447986695590d8e528bb09f57b010abb1bc3f
-rw-r--r--android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TimeZoneFinder.java21
-rw-r--r--android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java5
2 files changed, 23 insertions, 3 deletions
diff --git a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TimeZoneFinder.java b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TimeZoneFinder.java
index bf04b1bf9..7676a67d1 100644
--- a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TimeZoneFinder.java
+++ b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TimeZoneFinder.java
@@ -369,8 +369,13 @@ public final class TimeZoneFinder {
+ parser.getPositionDescription());
}
- TimeZoneMapping timeZoneMapping =
- new TimeZoneMapping(zoneIdString, showInPicker, notUsedAfter, alternativeIds);
+ // intern() zone Ids because they are a fixed set of well-known strings that are used in
+ // other low-level library calls.
+ String internedZoneIdString = zoneIdString.intern();
+ List<String> internedAlternativeIds = internStrings(alternativeIds);
+
+ TimeZoneMapping timeZoneMapping = new TimeZoneMapping(
+ internedZoneIdString, showInPicker, notUsedAfter, internedAlternativeIds);
timeZoneMappings.add(timeZoneMapping);
}
@@ -378,6 +383,18 @@ public final class TimeZoneFinder {
return Collections.unmodifiableList(timeZoneMappings);
}
+ private static List<String> internStrings(List<String> stringsToIntern) {
+ if (stringsToIntern.isEmpty()) {
+ return stringsToIntern;
+ }
+
+ List<String> internedStrings = new ArrayList<>(stringsToIntern.size());
+ for (String stringToIntern : stringsToIntern) {
+ internedStrings.add(stringToIntern.intern());
+ }
+ return internedStrings;
+ }
+
/**
* Processes &lt;timezones&gt; data.
*/
diff --git a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
index 30eee3af8..69155d620 100644
--- a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
+++ b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
@@ -289,7 +289,10 @@ public final class ZoneInfoDb implements AutoCloseable {
if (len == 0) {
throw new IOException("Invalid ID at index=" + i);
}
- ids[i] = new String(idBytes, 0, len, StandardCharsets.US_ASCII);
+ String zoneId = new String(idBytes, 0, len, StandardCharsets.US_ASCII);
+ // intern() zone Ids because they are a fixed set of well-known strings that are used in
+ // other low-level library calls.
+ ids[i] = zoneId.intern();
if (i > 0) {
if (ids[i].compareTo(ids[i - 1]) <= 0) {
throw new IOException("Index not sorted or contains multiple entries with the same ID"