Typo: testPutPreversesObjectIdentity
On Mon, Jun 9, 2008 at 12:13 AM, Martin Buchholz <[EMAIL PROTECTED]> 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); >
