Peter, Thanks. Fixed. Martin
On Sun, Jun 8, 2008 at 10:59 PM, Peter Arrenbrecht <[EMAIL PROTECTED]> wrote: > 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); >> >
