ICU-20916 UBSan & ErrorProne fixes
diff --git a/icu4c/source/common/lsr.cpp b/icu4c/source/common/lsr.cpp
index a5e10ef..d4308ad 100644
--- a/icu4c/source/common/lsr.cpp
+++ b/icu4c/source/common/lsr.cpp
@@ -103,7 +103,7 @@
 
 LSR &LSR::setHashCode() {
     if (hashCode == 0) {
-        int32_t h = ustr_hashCharsN(language, static_cast<int32_t>(uprv_strlen(language)));
+        uint32_t h = ustr_hashCharsN(language, static_cast<int32_t>(uprv_strlen(language)));
         h = h * 37 + ustr_hashCharsN(script, static_cast<int32_t>(uprv_strlen(script)));
         h = h * 37 + regionIndex;
         hashCode = h * 37 + flags;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java
index 028cd8a..b5bd4df 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java
@@ -173,7 +173,7 @@
         @Override
         public boolean equals(Object other) {
             if (this == other) { return true; }
-            if (!getClass().equals(other.getClass())) { return false; }
+            if (other == null || !getClass().equals(other.getClass())) { return false; }
             Data od = (Data)other;
             return Arrays.equals(trie, od.trie) &&
                     Arrays.equals(regionToPartitionsIndex, od.regionToPartitionsIndex) &&
@@ -181,6 +181,11 @@
                     paradigmLSRs.equals(od.paradigmLSRs) &&
                     Arrays.equals(distances, od.distances);
         }
+
+        @Override
+        public int hashCode() {  // unused; silence ErrorProne
+            return 1;
+        }
     }
 
     // VisibleForTesting
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java
index 1938170..543aade 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java
@@ -97,7 +97,7 @@
         @Override
         public boolean equals(Object other) {
             if (this == other) { return true; }
-            if (!getClass().equals(other.getClass())) { return false; }
+            if (other == null || !getClass().equals(other.getClass())) { return false; }
             Data od = (Data)other;
             return
                     languageAliases.equals(od.languageAliases) &&
@@ -105,6 +105,11 @@
                     Arrays.equals(trie, od.trie) &&
                     Arrays.equals(lsrs, od.lsrs);
         }
+
+        @Override
+        public int hashCode() {  // unused; silence ErrorProne
+            return 1;
+        }
     }
 
     // VisibleForTesting
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
index a333355..f424679 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
@@ -15,7 +15,6 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Objects;
 
 import com.ibm.icu.impl.locale.LSR;
 import com.ibm.icu.impl.locale.LocaleDistance;
@@ -522,19 +521,19 @@
         public String toString() {
             StringBuilder s = new StringBuilder().append("{LocaleMatcher.Builder");
             if (supportedLocales != null && !supportedLocales.isEmpty()) {
-                s.append(" supported={").append(supportedLocales.toString()).append('}');
+                s.append(" supported={").append(supportedLocales).append('}');
             }
             if (defaultLocale != null) {
-                s.append(" default=").append(defaultLocale.toString());
+                s.append(" default=").append(defaultLocale);
             }
             if (favor != null) {
-                s.append(" distance=").append(favor.toString());
+                s.append(" distance=").append(favor);
             }
             if (thresholdDistance >= 0) {
                 s.append(String.format(" threshold=%d", thresholdDistance));
             }
             if (demotion != null) {
-                s.append(" demotion=").append(demotion.toString());
+                s.append(" demotion=").append(demotion);
             }
             return s.append('}').toString();
         }
@@ -1018,7 +1017,7 @@
         double distance = LocaleDistance.getDistanceDouble(indexAndDistance);
         if (TRACE_MATCHER) {
             System.err.printf("LocaleMatcher distance(desired=%s, supported=%s)=%g\n",
-                Objects.toString(desired), Objects.toString(supported), distance);
+                String.valueOf(desired), String.valueOf(supported), distance);
         }
         return (100.0 - distance) / 100.0;
     }
@@ -1050,15 +1049,15 @@
         StringBuilder s = new StringBuilder().append("{LocaleMatcher");
         // Supported languages in the order that we try to match them.
         if (supportedLSRs.length > 0) {
-            s.append(" supportedLSRs={").append(supportedLSRs[0].toString());
+            s.append(" supportedLSRs={").append(supportedLSRs[0]);
             for (int i = 1; i < supportedLSRs.length; ++i) {
-                s.append(", ").append(supportedLSRs[i].toString());
+                s.append(", ").append(supportedLSRs[i]);
             }
             s.append('}');
         }
-        s.append(" default=").append(Objects.toString(defaultULocale));
+        s.append(" default=").append(defaultULocale);
         if (favorSubtag != null) {
-            s.append(" favor=").append(favorSubtag.toString());
+            s.append(" favor=").append(favorSubtag);
         }
         if (thresholdDistance >= 0) {
             s.append(String.format(" threshold=%d", thresholdDistance));