HashMap implementations and Integer specializations
Martin Buchholz
martinrb at google.com
Mon Jun 9 07:26:04 UTC 2008
Peter, Thanks. Fixed.
Martin
On Sun, Jun 8, 2008 at 10:59 PM, Peter Arrenbrecht
<peter.arrenbrecht at gmail.com> wrote:
> 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