From df88dd05e00460c97b395de5cdc444101b11ce09 Mon Sep 17 00:00:00 2001 From: Kayokoi <113896798+wozhenbang2004@users.noreply.github.com> Date: Fri, 30 Oct 2026 19:35:03 +0800 Subject: [PATCH 1/2] Avoid quadratic clearing in JsonArray sublists Delegate range removal to the backing ArrayList so clearing a sublist does not repeatedly shift the remaining elements. --- .../com/google/gson/internal/NonNullElementWrapperList.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java b/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java index 812d331945..8995dc70cd 100644 --- a/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java +++ b/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java @@ -85,6 +85,11 @@ public boolean remove(Object o) { return delegate.remove(o); } + @Override + protected void removeRange(int fromIndex, int toIndex) { + delegate.subList(fromIndex, toIndex).clear(); + } + @Override public boolean removeAll(Collection c) { return delegate.removeAll(c); From 9ead7de82084a35f89dd4ff4123c40b81b922af9 Mon Sep 17 00:00:00 2001 From: Kayokoi <113896798+wozhenbang2004@users.noreply.github.com> Date: Fri, 30 Oct 2026 19:39:25 +0800 Subject: [PATCH 2/2] Add tests for clearing sublists in JsonArrayTest clearing JsonArray sublist views Cover middle, nested, and empty ranges and verify that changes remain visible through the backing JsonArray and list views. --- .../com/google/gson/JsonArrayAsListTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java b/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java index 04454138dc..4dafffb48b 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java @@ -167,6 +167,47 @@ public void testClear() { assertThat(a).hasSize(0); } + @Test + public void testSubListClear() { + JsonArray a = new JsonArray(); + for (int i = 0; i < 6; i++) { + a.add(i); + } + + List list = a.asList(); + List subList = list.subList(1, 5); + subList.clear(); + + assertThat(subList).isEmpty(); + assertThat(list).containsExactly(new JsonPrimitive(0), new JsonPrimitive(5)).inOrder(); + assertThat(a.toString()).isEqualTo("[0,5]"); + + subList.add(new JsonPrimitive(7)); + assertThat(a.toString()).isEqualTo("[0,7,5]"); + } + + @Test + public void testNestedSubListClear() { + JsonArray a = new JsonArray(); + for (int i = 0; i < 6; i++) { + a.add(i); + } + + List list = a.asList(); + List subList = list.subList(1, 5); + subList.subList(1, 3).clear(); + + assertThat(subList).containsExactly(new JsonPrimitive(1), new JsonPrimitive(4)).inOrder(); + assertThat(list) + .containsExactly( + new JsonPrimitive(0), new JsonPrimitive(1), new JsonPrimitive(4), new JsonPrimitive(5)) + .inOrder(); + assertThat(a.toString()).isEqualTo("[0,1,4,5]"); + + subList.subList(1, 1).clear(); + assertThat(a.toString()).isEqualTo("[0,1,4,5]"); + } + @Test public void testRemoveIf() { JsonArray a = new JsonArray();