From b4488dc4bf743dba07d0872bcb2fd32c65ab4352 Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Sat, 26 Sep 2026 01:50:05 +0530 Subject: [PATCH] Fix PackedMap entry equality and hash codes (#27396) --- core/src/main/java/hudson/util/PackedMap.java | 17 +---------------- .../test/java/hudson/util/PackedMapTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/hudson/util/PackedMap.java b/core/src/main/java/hudson/util/PackedMap.java index 59435e78b5..1d02fe1665 100644 --- a/core/src/main/java/hudson/util/PackedMap.java +++ b/core/src/main/java/hudson/util/PackedMap.java @@ -92,22 +92,7 @@ public final class PackedMap extends AbstractMap { public Entry next() { final K k = (K) kvpairs[index++]; final V v = (V) kvpairs[index++]; - return new Entry<>() { - @Override - public K getKey() { - return k; - } - - @Override - public V getValue() { - return v; - } - - @Override - public V setValue(V value) { - throw new UnsupportedOperationException(); - } - }; + return new SimpleImmutableEntry<>(k, v); } @Override diff --git a/core/src/test/java/hudson/util/PackedMapTest.java b/core/src/test/java/hudson/util/PackedMapTest.java index 54cc21b5d3..0f6864d421 100644 --- a/core/src/test/java/hudson/util/PackedMapTest.java +++ b/core/src/test/java/hudson/util/PackedMapTest.java @@ -1,6 +1,7 @@ package hudson.util; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.List; @@ -55,6 +56,19 @@ class PackedMapTest { xs.fromXML(xml); } + @Test + void entryEqualityAndHashCode() { + Map source = Map.of("a", "b", "c", "d"); + PackedMap packed = PackedMap.of(source); + + assertEquals(source.entrySet(), packed.entrySet()); + assertEquals(packed.entrySet(), source.entrySet()); + assertEquals(source.hashCode(), packed.hashCode()); + assertEquals(packed.hashCode(), packed.hashCode()); + assertThrows(UnsupportedOperationException.class, + () -> packed.entrySet().iterator().next().setValue("changed")); + } + @Test void values() { Map o = new TreeMap<>();