Index: trunk/src/org/openstreetmap/josm/io/AbstractReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/AbstractReader.java	(revision 19078)
+++ trunk/src/org/openstreetmap/josm/io/AbstractReader.java	(revision 19079)
@@ -88,4 +88,9 @@
 
     /**
+     * A lookup table to avoid calling {@link String#intern()} unnecessarily.
+     */
+    private final Map<String, String> tagMap = new HashMap<>();
+
+    /**
      * The dataset to add parsed objects to.
      */
@@ -370,4 +375,5 @@
                 }
             }
+            this.tagMap.clear();
             progressMonitor.finishTask();
             progressMonitor.removeCancelListener(cancelListener);
@@ -605,5 +611,5 @@
             ((AbstractPrimitive) t).setModified(true);
         } else {
-            t.put(key.intern(), value.intern());
+            t.put(this.tagMap.computeIfAbsent(key, Utils::intern), this.tagMap.computeIfAbsent(value, Utils::intern));
         }
     }
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 19078)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 19079)
@@ -739,5 +739,5 @@
      */
     public static boolean isBlank(String string) {
-        return string == null || strip(string).isEmpty();
+        return isStripEmpty(string);
     }
 
@@ -763,5 +763,12 @@
      */
     public static boolean isStripEmpty(String str) {
-        return str == null || IntStream.range(0, str.length()).allMatch(i -> isStrippedChar(str.charAt(i), null));
+        if (str != null && !str.isBlank()) {
+            for (int i = 0; i < str.length(); i++) {
+                if (!isStrippedChar(str.charAt(i), null)) {
+                    return false;
+                }
+            }
+        }
+        return true;
     }
 
