diff options
author | Neil Fuller <nfuller@google.com> | 2020-07-21 13:14:39 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-07-21 13:14:39 +0000 |
commit | 28977467ce7d4c7f5f7c4e3b2fc0a1a59f796e42 (patch) | |
tree | 6797f2a0d0c7f0cffe101f54559fd201c7e06b62 | |
parent | 8c847de1076805741080e8f8472ef10d903652e1 (diff) | |
parent | 8b8c65b9724eec6ee3448ab7292f4e25430ab2b9 (diff) | |
download | icu-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.java | 21 | ||||
-rw-r--r-- | android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java | 5 |
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 <timezones> 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" |