From db76e697a568c553af19de01c8a9b12b85222183 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Fri, 15 Nov 2024 07:39:41 -0800 Subject: [PATCH] fix: Reduce memory allocations and improve performance in `JSONObject` --- .../src/main/java/org/kordamp/json/JSONObject.java | 2 +- .../java/org/kordamp/json/util/JSONTokener.java | 4 ++++ .../org/kordamp/json/util/TestJSONTokener.java | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/subprojects/json-lib-core/src/main/java/org/kordamp/json/JSONObject.java b/subprojects/json-lib-core/src/main/java/org/kordamp/json/JSONObject.java index 069b98d..5070480 100644 --- a/subprojects/json-lib-core/src/main/java/org/kordamp/json/JSONObject.java +++ b/subprojects/json-lib-core/src/main/java/org/kordamp/json/JSONObject.java @@ -656,7 +656,7 @@ public static JSONObject fromJSONTokener(JSONTokener tokener, JsonConfig jsonCon String key; Object value; - if (tokener.matches("null.*")) { + if (tokener.startsWith("null")) { fireObjectStartEvent(jsonConfig); fireObjectEndEvent(jsonConfig); return new JSONObject(true); diff --git a/subprojects/json-lib-core/src/main/java/org/kordamp/json/util/JSONTokener.java b/subprojects/json-lib-core/src/main/java/org/kordamp/json/util/JSONTokener.java index f746931..f644c69 100644 --- a/subprojects/json-lib-core/src/main/java/org/kordamp/json/util/JSONTokener.java +++ b/subprojects/json-lib-core/src/main/java/org/kordamp/json/util/JSONTokener.java @@ -114,6 +114,10 @@ public boolean matches(String pattern) { .matches(str); } + public boolean startsWith(String prefix) { + return this.mySource.startsWith(prefix, this.myIndex); + } + /** * Determine if the source string still contains characters that next() can * consume. diff --git a/subprojects/json-lib-core/src/test/java/org/kordamp/json/util/TestJSONTokener.java b/subprojects/json-lib-core/src/test/java/org/kordamp/json/util/TestJSONTokener.java index 7fe02fa..57bf4a6 100644 --- a/subprojects/json-lib-core/src/test/java/org/kordamp/json/util/TestJSONTokener.java +++ b/subprojects/json-lib-core/src/test/java/org/kordamp/json/util/TestJSONTokener.java @@ -75,6 +75,20 @@ public void testNextChar() { } } + public void testStartsWith() { + assertFalse(new JSONTokener("").startsWith("null")); + assertFalse(new JSONTokener("n").startsWith("null")); + assertFalse(new JSONTokener("nu").startsWith("null")); + assertFalse(new JSONTokener("nul").startsWith("null")); + assertTrue(new JSONTokener("null").startsWith("null")); + assertTrue(new JSONTokener("nulll").startsWith("null")); + assertFalse(new JSONTokener("nn").startsWith("null")); + assertFalse(new JSONTokener("nnu").startsWith("null")); + assertFalse(new JSONTokener("nnul").startsWith("null")); + assertFalse(new JSONTokener("nnull").startsWith("null")); + assertFalse(new JSONTokener("nnulll").startsWith("null")); + } + public void testReset() { JSONTokener tok = new JSONTokener("abc"); tok.next();