HashMap implementations and Integer specializations
Peter Arrenbrecht
peter.arrenbrecht at gmail.com
Mon Jun 9 05:59:59 UTC 2008
Typo: testPutPreversesObjectIdentity
On Mon, Jun 9, 2008 at 12:13 AM, Martin Buchholz <martinrb at google.com> wrote:
> JavaOne 2008 technical session PDFs are now available
>
> http://developers.sun.com/learning/javaoneonline/j1online.jsp?track=javase&yr=2008
>
> I was surprised to discover a discussion of
> HashMap optimization at the JavaOne talk
> http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-6434.pdf
>
> Did I miss an announcement of that?
>
> A comment on that talk:
>
> It is easy to make the mistake of thinking that HashMap does not
> have to store the actual Integer key in the call to put.
> Unfortunately, Java's evil semantics (everything is an Object,
> everything is a Lock, everything has an Identity) require
> that the exact same objects inserted into a HashMap can be
> removed later. This means that specialized submaps will have
> a harder time optimizing for footprint. (I do think the
> algorithm presented in the talk is correct, since the front cache
> is likely only used for get(), and not, e.g. for entrySet().iterator())
>
> I intend to check in a test case modification that will ensure
> that future optimizations do not violate the current compatibility guarantees.
>
> diff --git a/test/java/util/Collection/MOAT.java
> b/test/java/util/Collection/MOAT.java
> --- a/test/java/util/Collection/MOAT.java
> +++ b/test/java/util/Collection/MOAT.java
> @@ -544,6 +544,27 @@ public class MOAT {
> check(m.size() != 0 ^ m.isEmpty());
> }
>
> + private static void testPutPreversesObjectIdentity(Map<?,?> m,
> + Object key,
> + Object val) {
> + try {
> + Map<Object,Object> m2 = m.getClass().newInstance();
> + m2.put(key, val);
> + Map.Entry<Object,Object> e = m2.entrySet().iterator().next();
> + check(e.getKey() == key);
> + check(e.getValue() == val);
> + check(m2.keySet().iterator().next() == key);
> + check(m2.values().iterator().next() == val);
> + } catch (Throwable t) { unexpected(t); }
> + }
> +
> + private static void testPutPreversesObjectIdentity(Map<?,?> m) {
> + testPutPreversesObjectIdentity(m, new Integer(42), new Integer(43));
> + testPutPreversesObjectIdentity(m, new Long(42L), new Long(43L));
> + testPutPreversesObjectIdentity(m, new Double(42.0), new Double(43.0));
> + testPutPreversesObjectIdentity(m, new String("42"), new String("43"));
> + }
> +
> private static void testMap(Map<Integer,Integer> m) {
> System.out.println("\n==> " + m.getClass().getName());
>
> @@ -572,6 +593,7 @@ public class MOAT {
> }
>
> if (supportsPut(m)) {
> + testPutPreversesObjectIdentity(m);
> try {
> check(m.put(3333, 77777) == null);
> check(m.put(9134, 74982) == null);
>
More information about the core-libs-dev
mailing list