<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Source Code By Jarplus.com</title>
	<atom:link href="http://code.jarplus.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://code.jarplus.com</link>
	<description>Think Developers Source Code</description>
	<lastBuildDate>Sat, 18 Feb 2012 18:47:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Utility class that provides a lazy initialization object wrapper.</title>
		<link>http://code.jarplus.com/utility-class-that-provides-a-lazy-initialization-object-wrapper/</link>
		<comments>http://code.jarplus.com/utility-class-that-provides-a-lazy-initialization-object-wrapper/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:47:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4268</guid>
		<description><![CDATA[//package com.tomergabel.util; import java.util.concurrent.Callable; /**  * Utility class that provides a lazy initialization object wrapper.  * &#60;p/&#62;  * To use this wrapper simply implement {@link java.util.concurrent.Callable#call()} and return the appropriate value.  * Exceptions are propagated by {@link #get()} as {@link com.tomergabel.util.LazyInitializationException}s.  * &#60;p/&#62;  * &#60;strong&#62;Note: This wrapper is &#60;em&#62;not&#60;/em&#62; thread-safe!&#60;/strong&#62;  *  * @param &#60;T&#62; The type wrapped by the lazy initializer.  */ public abstract class Lazy&#60;T&#62; implements Callable&#60;T&#62; {     /**      * The actual value.      */     private T value = null;     /**      * Protected c'tor (to prevent direct initialization.      */     protected Lazy() {     }     /**      * A private c'tor used to pre-cache the value. This is used by the convenience method {@link #from(Object)} to      * create a "const" lazy initializer.      *      * @param value The actual value.      */     private Lazy( final T value ) {         this.value = value;     }     /**      * Retreives the lazy-loaded value, initializing it on the fly if necessary.      *      * @return The lazy-loaded value.      * @throws LazyInitializationException An error has occurred while initializing the lazy-loaded value. Please see      *                                     the exception {@link Exception#getCause() cause} for detials.      */     public T get() throws LazyInitializationException {         try {             return this.value == null ? ( this.value = this.call() ) : this.value;         } catch ( Exception e ) {             throw new LazyInitializationException( e );         }     }     /**      * Wraps a value with a pre-cached value. This is a convenience method intended to provide an easy way to specify      * constant values to a lazy-loaded placeholder if necessary.      *      * @param value The actual value.      * @param &#60;T&#62;   The type wrapped by the lazy initializer.      * @return A {@link Lazy} instance for the specified value.      */     public static &#60;T&#62; Lazy&#60;T&#62; from( final T value ) {         return new Lazy&#60;T&#62;( value ) { [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #3f7f5f;">//package com.tomergabel.util;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.Callable;</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Utility class that provides a lazy initialization object wrapper.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* &lt;p/&gt;</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* To use this wrapper simply implement </span><span style="color: #3f3fbf;">{@link java.util.concurrent.Callable#call()} </span><span style="color: #3f5fbf;">and return the appropriate value.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Exceptions are propagated by </span><span style="color: #3f3fbf;">{@link #get()} </span><span style="color: #3f5fbf;">as </span><span style="color: #3f3fbf;">{@link com.tomergabel.util.LazyInitializationException}</span><span style="color: #3f5fbf;">s.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* &lt;p/&gt;</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* &lt;strong&gt;Note: This wrapper is &lt;em&gt;not&lt;/em&gt; thread-safe!&lt;/strong&gt;</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">&lt;T&gt; The type wrapped by the lazy initializer.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public abstract class </strong></span><span style="color: #000000;">Lazy&lt;T&gt; </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Callable&lt;T&gt; </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* The actual value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">T value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Protected c'tor (to prevent direct initialization.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Lazy</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* A private c'tor used to pre-cache the value. This is used by the convenience method </span><span style="color: #3f3fbf;">{@link #from(Object)} </span><span style="color: #3f5fbf;">to</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* create a "const" lazy initializer.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value The actual value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Lazy</span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">T value </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Retreives the lazy-loaded value, initializing it on the fly if necessary.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">The lazy-loaded value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">LazyInitializationException An error has occurred while initializing the lazy-loaded value. Please see</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                                     the exception </span><span style="color: #3f3fbf;">{@link Exception#getCause() cause} </span><span style="color: #3f5fbf;">for detials.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">T get</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">LazyInitializationException </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return this</strong></span><span style="color: #000000;">.value == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">? </span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.call</span><span style="color: #000000;">() ) </span><span style="color: #000000;">: </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">( </span><span style="color: #000000;">Exception e </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">LazyInitializationException</span><span style="color: #000000;">( </span><span style="color: #000000;">e </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Wraps a value with a pre-cached value. This is a convenience method intended to provide an easy way to specify</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* constant values to a lazy-loaded placeholder if necessary.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value The actual value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">&lt;T&gt;   The type wrapped by the lazy initializer.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">A </span><span style="color: #3f3fbf;">{@link Lazy} </span><span style="color: #3f5fbf;">instance for the specified value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public static </strong></span><span style="color: #000000;">&lt;T&gt; Lazy&lt;T&gt; </span><span style="color: #7f0055;"><strong>from</strong></span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">T value </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">Lazy&lt;T&gt;</span><span style="color: #000000;">( </span><span style="color: #000000;">value </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">@Override</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">T call</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                </span><span style="color: #3f7f5f;">// Safety net, should never happen</span><br />
<span style="color: #ffffff;">                </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">( </span><span style="color: #2a00ff;">"Lazy initializer should be not called on lazy constants." </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Wraps the specified callable with a </span><span style="color: #3f3fbf;">{@link Lazy} </span><span style="color: #3f5fbf;">instance. This is an alternative to extending this class.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initializer The initializer. Calling </span><span style="color: #3f3fbf;">{@link #from} </span><span style="color: #3f5fbf;">with {@literal null} for an argument will resolve here,</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                    so specifying a {@literal null} initializer is the same as specifying a callable which returns</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                    {@literal null}.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">A </span><span style="color: #3f3fbf;">{@link Lazy} </span><span style="color: #3f5fbf;">instance for the specified initializer.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">@SuppressWarnings</span><span style="color: #000000;">( { </span><span style="color: #2a00ff;">"unchecked" </span><span style="color: #000000;">} )</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public static </strong></span><span style="color: #000000;">&lt;T&gt; Lazy&lt;T&gt; </span><span style="color: #7f0055;"><strong>from</strong></span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Callable&lt;T&gt; initializer </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">Lazy&lt;T&gt;</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">@Override</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">T call</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                </span><span style="color: #3f7f5f;">// Lazy.from( null ) will resolve here, so (as a convenience) we support</span><br />
<span style="color: #ffffff;">                </span><span style="color: #3f7f5f;">// return of null values</span><br />
<span style="color: #ffffff;">                </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">initializer == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">? </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">: initializer.call</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span><br />
<span style="color: #7f0055;"><strong>class </strong></span><span style="color: #000000;">LazyInitializationException </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">LazyInitializationException</span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">String message, </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Throwable cause </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">( </span><span style="color: #000000;">message, cause </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">LazyInitializationException</span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Throwable cause </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">( </span><span style="color: #000000;">cause </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/utility-class-that-provides-a-lazy-initialization-object-wrapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lazy Loading Reference</title>
		<link>http://code.jarplus.com/lazy-loading-reference/</link>
		<comments>http://code.jarplus.com/lazy-loading-reference/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:46:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4266</guid>
		<description><![CDATA[import java.lang.ref.WeakReference; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.atomic.AtomicReference; public class LazyLoadingReference&#60;T&#62; {   protected Factory&#60;T&#62; factory;   protected AtomicReference&#60;WeakReference&#60;Future&#60;T&#62;&#62;&#62; reference = new AtomicReference&#60;WeakReference&#60;Future&#60;T&#62;&#62;&#62;();   public LazyLoadingReference(Factory&#60;T&#62; factory) {     this.factory = factory;   }   public T get() throws IllegalStateException {     while (true) {       WeakReference&#60;Future&#60;T&#62;&#62; ref = reference.get();       boolean valid = true;       if (ref == null) {         FutureTask&#60;T&#62; f = new FutureTask&#60;T&#62;(new Callable&#60;T&#62;() {           @Override           public T call() throws Exception {             return factory.create();           }         });         ref = new WeakReference&#60;Future&#60;T&#62;&#62;(f);         if (valid = reference.compareAndSet(null, ref)) {           f.run();         }       }       if (valid) {         try {           Future&#60;T&#62; f = ref.get();           if (f != null) {             return f.get();           } else {             reference.compareAndSet(ref, null);           }         } catch (CancellationException e) {           reference.compareAndSet(ref, null);         } catch (ExecutionException e) {           throw new IllegalStateException(e.getCause());         } catch (Exception e) {           throw new IllegalStateException(e);         }       }     }   }   public interface Factory&#60;T&#62; {     T create() throws CancellationException, Exception;   } } */ package org.t2framework.commons.util; import java.util.ArrayList; import java.util.List; [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.lang.ref.WeakReference;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.Callable;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.CancellationException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.ExecutionException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.Future;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.FutureTask;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.atomic.AtomicReference;</span></p>
<p><span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">LazyLoadingReference&lt;T&gt; </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Factory&lt;T&gt; factory;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">AtomicReference&lt;WeakReference&lt;Future&lt;T&gt;&gt;&gt; reference = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">AtomicReference&lt;WeakReference&lt;Future&lt;T&gt;&gt;&gt;</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">LazyLoadingReference</span><span style="color: #000000;">(</span><span style="color: #000000;">Factory&lt;T&gt; factory</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.factory = factory;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">T get</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IllegalStateException </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">WeakReference&lt;Future&lt;T&gt;&gt; ref = reference.get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">valid = </span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">ref == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">FutureTask&lt;T&gt; f = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">FutureTask&lt;T&gt;</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Callable&lt;T&gt;</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">@Override</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">T call</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">factory.</span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">ref = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">WeakReference&lt;Future&lt;T&gt;&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">f</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">valid = reference.compareAndSet</span><span style="color: #000000;">(</span><span style="color: #000000;">null, ref</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">f.run</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">valid</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Future&lt;T&gt; f = ref.get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">f.get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>else </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">reference.compareAndSet</span><span style="color: #000000;">(</span><span style="color: #000000;">ref, </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">CancellationException e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">reference.compareAndSet</span><span style="color: #000000;">(</span><span style="color: #000000;">ref, </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">ExecutionException e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getCause</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Exception e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">(</span><span style="color: #000000;">e</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public interface </strong></span><span style="color: #000000;">Factory&lt;T&gt; </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">T </span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">CancellationException, Exception;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code></p>
<p><code><span style="color: #3f7f5f;">*/</span><br />
<span style="color: #7f0055;"><strong>package </strong></span><span style="color: #000000;">org.t2framework.commons.util;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.ArrayList;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.List;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Random;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.CancellationException;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">org.t2framework.commons.cache.Cache;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">org.t2framework.commons.cache.CacheFactory;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">org.t2framework.commons.cache.CacheType;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">junit.framework.TestCase;</span></p>
<p><span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">LazyLoadingReferenceTest </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">TestCase </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">test_loadSimple</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">LazyLoadingReference&lt;String&gt; target = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference&lt;String&gt;</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference.Factory&lt;String&gt;</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String </span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #2a00ff;">"hoge"</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">assertEquals</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"hoge"</span><span style="color: #000000;">, target.get</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">test_loadSimple2</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">LazyLoadingReference&lt;Cache&lt;String, String&gt;&gt; t2 = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference&lt;Cache&lt;String, String&gt;&gt;</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference.Factory&lt;Cache&lt;String, String&gt;&gt;</span><span style="color: #000000;">() {</span></p>
<p><span style="color: #ffffff;">          </span><span style="color: #000000;">@Override</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Cache&lt;String, String&gt; </span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">              </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">CancellationException </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">Cache&lt;String, String&gt; c = CacheFactory</span><br />
<span style="color: #ffffff;">                </span><span style="color: #000000;">.createCache</span><span style="color: #000000;">(</span><span style="color: #000000;">CacheType.DEFAULT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">c.put</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"aaa"</span><span style="color: #000000;">, </span><span style="color: #2a00ff;">"bbb"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">c;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Cache&lt;String, String&gt; cache = t2.get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">assertNotNull</span><span style="color: #000000;">(</span><span style="color: #000000;">cache</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">assertNotNull</span><span style="color: #000000;">(</span><span style="color: #000000;">cache.get</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"aaa"</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">test_exception</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Exception e = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Exception</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">LazyLoadingReference&lt;String&gt; target = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference&lt;String&gt;</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference.Factory&lt;String&gt;</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String </span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>throw </strong></span><span style="color: #000000;">e;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">target.get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">fail</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">IllegalStateException t</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">assertNotNull</span><span style="color: #000000;">(</span><span style="color: #000000;">t.getCause</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">assertTrue</span><span style="color: #000000;">(</span><span style="color: #000000;">t.getCause</span><span style="color: #000000;">()</span><span style="color: #000000;">.getClass</span><span style="color: #000000;">() </span><span style="color: #000000;">== Exception.</span><span style="color: #7f0055;"><strong>class</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">assertEquals</span><span style="color: #000000;">(</span><span style="color: #000000;">e, t.getCause</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">test_loadHeavy</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Exception </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">LazyLoadingReference&lt;String&gt; target = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference&lt;String&gt;</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LazyLoadingReference.Factory&lt;String&gt;</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String </span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #2a00ff;">"hoge"</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Random random = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Random</span><span style="color: #000000;">(</span><span style="color: #000000;">System.currentTimeMillis</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">List&lt;Thread&gt; list = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ArrayList&lt;Thread&gt;</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; </span><span style="color: #990000;">20</span><span style="color: #000000;">; i++</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Runnable r = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Runnable</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">run</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">l = random.nextLong</span><span style="color: #000000;">() </span><span style="color: #000000;">% </span><span style="color: #990000;">100</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">Thread.sleep</span><span style="color: #000000;">(</span><span style="color: #000000;">l &lt; </span><span style="color: #990000;">0 </span><span style="color: #000000;">? l * -</span><span style="color: #990000;">1 </span><span style="color: #000000;">: l</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">assertEquals</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"hoge"</span><span style="color: #000000;">, target.get</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">InterruptedException e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">e.printStackTrace</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Thread t = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Thread</span><span style="color: #000000;">(</span><span style="color: #000000;">r</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">list.add</span><span style="color: #000000;">(</span><span style="color: #000000;">t</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.start</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Thread t : list</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.join</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code><code></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/lazy-loading-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A daemon thread that continuously dequeues Runnable instances from a queue and executes them.</title>
		<link>http://code.jarplus.com/a-daemon-thread-that-continuously-dequeues-runnable-instances-from-a-queue-and-executes-them/</link>
		<comments>http://code.jarplus.com/a-daemon-thread-that-continuously-dequeues-runnable-instances-from-a-queue-and-executes-them/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:46:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4264</guid>
		<description><![CDATA[//package edu.ucla.sspace.util; import java.util.ArrayDeque; import java.util.Queue; import java.util.concurrent.BlockingQueue; /**  * A daemon thread that continuously dequeues {@code Runnable} instances from a  * queue and executes them.  This class is intended to be used with a {@link  * java.util.concurrent.Semaphore Semaphore}, whereby work is added the to the  * queue and the semaphore indicates when processing has finished.  *  * @author David Jurgens  */ public class WorkerThread extends Thread {     /**      * A static variable to indicate which instance of the class the current      * thread is in its name.      */     private static int threadInstanceCount;     /**      * The queue from which work items will be taken      */     private final BlockingQueue&#60;Runnable&#62; workQueue;     /**      * An internal queue that holds thread-local tasks.  This queue is intended      * to hold multiple tasks to avoid thread contention on the work queue.      */     private final Queue&#60;Runnable&#62; internalQueue;     /**      * The number of items that should be queued to run by this thread at once.      */     private final int threadLocalItems;     /**      * Creates a thread that continuously dequeues from the {@code workQueue} at      * once and excutes each item.      */     public WorkerThread(BlockingQueue&#60;Runnable&#62; workQueue) {         this(workQueue, 1);     }     /**      * Creates a thread that continuously dequeues {@code threadLocalItems} from      * {@code workQueue} at once and excutes them sequentially.      *      * @param threadLocalItems the number of items this thread should dequeue      *        from the work queue at one time.  Setting this value too high can      *        result in a loss of concurrency; setting it too low can result in      *        high contention on the work queue if the time per task is also      *        low.      */     public WorkerThread(BlockingQueue&#60;Runnable&#62; workQueue,                          int threadLocalItems) {         this.workQueue = workQueue;         this.threadLocalItems = threadLocalItems;         internalQueue = new ArrayDeque&#60;Runnable&#62;();         setDaemon(true);         synchronized(WorkerThread.class) { [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #3f7f5f;">//package edu.ucla.sspace.util;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.ArrayDeque;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Queue;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.BlockingQueue;</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* A daemon thread that continuously dequeues {@code Runnable} instances from a</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* queue and executes them.  This class is intended to be used with a </span><span style="color: #3f3fbf;">{@link</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f3fbf;">* java.util.concurrent.Semaphore Semaphore}</span><span style="color: #3f5fbf;">, whereby work is added the to the</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* queue and the semaphore indicates when processing has finished.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@author </span><span style="color: #3f5fbf;">David Jurgens</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">WorkerThread </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">Thread </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* A static variable to indicate which instance of the class the current</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* thread is in its name.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">threadInstanceCount;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* The queue from which work items will be taken</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #000000;">BlockingQueue&lt;Runnable&gt; workQueue;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* An internal queue that holds thread-local tasks.  This queue is intended</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* to hold multiple tasks to avoid thread contention on the work queue.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #000000;">Queue&lt;Runnable&gt; internalQueue;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* The number of items that should be queued to run by this thread at once.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">threadLocalItems;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Creates a thread that continuously dequeues from the {@code workQueue} at</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* once and excutes each item.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">WorkerThread</span><span style="color: #000000;">(</span><span style="color: #000000;">BlockingQueue&lt;Runnable&gt; workQueue</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">workQueue, </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Creates a thread that continuously dequeues {@code threadLocalItems} from</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* {@code workQueue} at once and excutes them sequentially.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">threadLocalItems the number of items this thread should dequeue</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*        from the work queue at one time.  Setting this value too high can</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*        result in a loss of concurrency; setting it too low can result in</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*        high contention on the work queue if the time per task is also</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*        low.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">WorkerThread</span><span style="color: #000000;">(</span><span style="color: #000000;">BlockingQueue&lt;Runnable&gt; workQueue, </span><br />
<span style="color: #ffffff;">                        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">threadLocalItems</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.workQueue = workQueue;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.threadLocalItems = threadLocalItems;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">internalQueue = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ArrayDeque&lt;Runnable&gt;</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">setDaemon</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>synchronized</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">WorkerThread.</span><span style="color: #7f0055;"><strong>class</strong></span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">setName</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"WorkerThread-" </span><span style="color: #000000;">+ </span><span style="color: #000000;">(</span><span style="color: #000000;">threadInstanceCount++</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Continuously dequeues {@code Runnable} instances from the work queue and</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* execute them.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">run</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Runnable r = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// Try to drain the maximum capacity of thread-local items, checking</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// whether any were available</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">workQueue.drainTo</span><span style="color: #000000;">(</span><span style="color: #000000;">internalQueue, threadLocalItems</span><span style="color: #000000;">) </span><span style="color: #000000;">== </span><span style="color: #990000;">0</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">                </span><span style="color: #3f7f5f;">// block until a work item is available</span><br />
<span style="color: #ffffff;">                </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                    </span><span style="color: #000000;">internalQueue.offer</span><span style="color: #000000;">(</span><span style="color: #000000;">workQueue.take</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">                </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">InterruptedException ie</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">                    </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">Error</span><span style="color: #000000;">(</span><span style="color: #000000;">ie</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">                </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// Execute all of the thread-local items</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">((</span><span style="color: #000000;">r = internalQueue.poll</span><span style="color: #000000;">()) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">                </span><span style="color: #000000;">r.run</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/a-daemon-thread-that-continuously-dequeues-runnable-instances-from-a-queue-and-executes-them/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Returns the parent of the specified URI.</title>
		<link>http://code.jarplus.com/returns-the-parent-of-the-specified-uri/</link>
		<comments>http://code.jarplus.com/returns-the-parent-of-the-specified-uri/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:46:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4262</guid>
		<description><![CDATA[//package com.tomergabel.util; import java.io.File; import java.net.URI; import java.net.URISyntaxException; /**  * A static container class for URI-related utility functions.  */ public final class UriUtils {       /**      * A static URI which, when resolved against another URI, returns the other URI's parent.      */     private static final URI up = URI.create( ".." );     /**      * Returns the parent of the specified URI.      * &#60;p/&#62;      * For example, applying this method to the URI &#38;quot;&#60;tt&#62;http://www.site.com/articles/article.html&#60;/tt&#62;&#38;quot; will      * return the URI for &#38;quot;&#60;tt&#62;http://www.site.com/articles/&#60;/tt&#62;&#38;quot;.      *      * @param uri The URI for which to return the parent.      * @return The parent of the specified URI.      * @throws IllegalArgumentException &#60;ul&#62; &#60;li&#62;The URI cannot be null&#62;&#60;/li&#62; &#60;li&#62;Can't resolve parent for the specified      *                                  URI.&#60;/li&#62; &#60;/ul&#62;      */     public static URI getParent( final URI uri ) throws IllegalArgumentException {         if ( uri == null )             throw new IllegalArgumentException( "The URI cannot be null." );         final String path = uri.toString();         final int finalSeparator = Math.max( path.lastIndexOf( '/' ), path.lastIndexOf( '\\' ) );         final int extension = path.lastIndexOf( '.' );         if ( extension &#62; finalSeparator )             try {                 // Extract all but final segment                 return new URI( path.substring( 0, finalSeparator + 1 ) ).normalize();             } catch ( URISyntaxException e ) {                 throw new IllegalArgumentException( "Can't resolve parent for the specified URI.", e );             }         else             return uri.resolve( up );     } }]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #3f7f5f;">//package com.tomergabel.util;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.File;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.net.URI;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.net.URISyntaxException;</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* A static container class for URI-related utility functions.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public final class </strong></span><span style="color: #000000;">UriUtils </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* A static URI which, when resolved against another URI, returns the other URI's parent.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #000000;">URI up = URI.</span><span style="color: #7f0055;"><strong>create</strong></span><span style="color: #000000;">( </span><span style="color: #2a00ff;">".." </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Returns the parent of the specified URI.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* &lt;p/&gt;</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* For example, applying this method to the URI &amp;quot;&lt;tt&gt;http://www.site.com/articles/article.html&lt;/tt&gt;&amp;quot; will</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* return the URI for &amp;quot;&lt;tt&gt;http://www.site.com/articles/&lt;/tt&gt;&amp;quot;.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">uri The URI for which to return the parent.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">The parent of the specified URI.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IllegalArgumentException &lt;ul&gt; &lt;li&gt;The URI cannot be null&gt;&lt;/li&gt; &lt;li&gt;Can't resolve parent for the specified</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                                  URI.&lt;/li&gt; &lt;/ul&gt;</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public static </strong></span><span style="color: #000000;">URI getParent</span><span style="color: #000000;">( </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">URI uri </span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IllegalArgumentException </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">( </span><span style="color: #000000;">uri == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">( </span><span style="color: #2a00ff;">"The URI cannot be null." </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">String path = uri.toString</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">finalSeparator = Math.max</span><span style="color: #000000;">( </span><span style="color: #000000;">path.lastIndexOf</span><span style="color: #000000;">( </span><span style="color: #990000;">'/' </span><span style="color: #000000;">)</span><span style="color: #000000;">, path.lastIndexOf</span><span style="color: #000000;">( </span><span style="color: #990000;">'\\' </span><span style="color: #000000;">) )</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">extension = path.lastIndexOf</span><span style="color: #000000;">( </span><span style="color: #990000;">'.' </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">( </span><span style="color: #000000;">extension &gt; finalSeparator </span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                </span><span style="color: #3f7f5f;">// Extract all but final segment</span><br />
<span style="color: #ffffff;">                </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">URI</span><span style="color: #000000;">( </span><span style="color: #000000;">path.substring</span><span style="color: #000000;">( </span><span style="color: #990000;">0</span><span style="color: #000000;">, finalSeparator + </span><span style="color: #990000;">1 </span><span style="color: #000000;">) )</span><span style="color: #000000;">.normalize</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">( </span><span style="color: #000000;">URISyntaxException e </span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">                </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">( </span><span style="color: #2a00ff;">"Can't resolve parent for the specified URI."</span><span style="color: #000000;">, e </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">uri.resolve</span><span style="color: #000000;">( </span><span style="color: #000000;">up </span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/returns-the-parent-of-the-specified-uri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Concurrent Doubly LinkedList</title>
		<link>http://code.jarplus.com/concurrent-doubly-linkedlist/</link>
		<comments>http://code.jarplus.com/concurrent-doubly-linkedlist/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:45:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4259</guid>
		<description><![CDATA[import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Deque; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.concurrent.atomic.AtomicReference; public class ConcurrentDoublyLinkedList&#60;E&#62; extends AbstractCollection&#60;E&#62;     implements java.io.Serializable {  /**    * Returns true if given reference is non-null and isn't a header, trailer,    * or marker.    *     * @param n    *            (possibly null) node    * @return true if n exists as a user node    */   private static boolean usable(Node&#60;?&#62; n) {     return n != null &#38;&#38; !n.isSpecial();   }   /**    * Throws NullPointerException if argument is null    *     * @param v    *            the element    */   private static void checkNullArg(Object v) {     if (v == null)       throw new NullPointerException();   }   /**    * Returns element unless it is null, in which case throws    * NoSuchElementException.    *     * @param v    *            the element    * @return the element    */   private E screenNullResult(E v) {     if (v == null)       throw new NoSuchElementException();     return v;   }   /**    * Creates an array list and fills it with elements of this list. Used by    * toArray.    *     * @return the arrayList    */   private ArrayList&#60;E&#62; toArrayList() {     ArrayList&#60;E&#62; c = new ArrayList&#60;E&#62;();     for (Node&#60;E&#62; n = header.forward(); n != null; n = n.forward())       c.add(n.element);     return c; [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractCollection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.ArrayList;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Collection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.ConcurrentModificationException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Deque;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Iterator;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.NoSuchElementException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.atomic.AtomicReference;</span><br />
</code></p>
<p><code><span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">ConcurrentDoublyLinkedList&lt;E&gt; </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractCollection&lt;E&gt;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">java.io.Serializable </span><span style="color: #000000;">{</span></code></p>
<p><code><span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if given reference is non-null and isn't a header, trailer,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* or marker.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">n</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            (possibly null) node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">true if n exists as a user node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">usable</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;?&gt; n</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">n != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; !n.isSpecial</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Throws NullPointerException if argument is null</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">v</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">checkNullArg</span><span style="color: #000000;">(</span><span style="color: #000000;">Object v</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">v == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">NullPointerException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns element unless it is null, in which case throws</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* NoSuchElementException.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">v</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">E screenNullResult</span><span style="color: #000000;">(</span><span style="color: #000000;">E v</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">v == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">NoSuchElementException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">v;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Creates an array list and fills it with elements of this list. Used by</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* toArray.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the arrayList</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">ArrayList&lt;E&gt; toArrayList</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">ArrayList&lt;E&gt; c = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ArrayList&lt;E&gt;</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; n = header.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">; n != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; n = n.forward</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">c.add</span><span style="color: #000000;">(</span><span style="color: #000000;">n.element</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">c;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f7f5f;">// Fields and constructors</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">serialVersionUID = </span><span style="color: #990000;">876323262645176354L</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* List header. First usable node is at header.forward().</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #000000;">Node&lt;E&gt; header;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* List trailer. Last usable node is at trailer.back().</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #000000;">Node&lt;E&gt; trailer;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs an empty deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentDoublyLinkedList</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node h = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">null, null, </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node t = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">null, null, h</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">h.setNext</span><span style="color: #000000;">(</span><span style="color: #000000;">t</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">header = h;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">trailer = t;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a deque containing the elements of the specified collection,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* in the order they are returned by the collection's iterator.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">c</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the collection whose elements are to be placed into this</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if &lt;tt&gt;c&lt;/tt&gt; or any element within it is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentDoublyLinkedList</span><span style="color: #000000;">(</span><span style="color: #000000;">Collection&lt;? </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">E&gt; c</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">addAll</span><span style="color: #000000;">(</span><span style="color: #000000;">c</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Prepends the given element at the beginning of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element to be inserted at the beginning of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">addFirst</span><span style="color: #000000;">(</span><span style="color: #000000;">E o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">checkNullArg</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">header.append</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">) </span><span style="color: #000000;">== </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Appends the given element to the end of this deque. This is identical in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* function to the &lt;tt&gt;add&lt;/tt&gt; method.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element to be inserted at the end of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">addLast</span><span style="color: #000000;">(</span><span style="color: #000000;">E o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">checkNullArg</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">trailer.prepend</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">) </span><span style="color: #000000;">== </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Prepends the given element at the beginning of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element to be inserted at the beginning of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; always</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">offerFirst</span><span style="color: #000000;">(</span><span style="color: #000000;">E o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">addFirst</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Appends the given element to the end of this deque. (Identical in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* function to the &lt;tt&gt;add&lt;/tt&gt; method; included only for consistency.)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element to be inserted at the end of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; always</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">offerLast</span><span style="color: #000000;">(</span><span style="color: #000000;">E o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">addLast</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Retrieves, but does not remove, the first element of this deque, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* returns null if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the first element of this queue, or &lt;tt&gt;null&lt;/tt&gt; if empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E peekFirst</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; n = header.successor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">: n.element;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Retrieves, but does not remove, the last element of this deque, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* returns null if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the last element of this deque, or &lt;tt&gt;null&lt;/tt&gt; if empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E peekLast</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; n = trailer.predecessor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">: n.element;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the first element in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the first element in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NoSuchElementException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E getFirst</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">screenNullResult</span><span style="color: #000000;">(</span><span style="color: #000000;">peekFirst</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the last element in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the last element in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NoSuchElementException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E getLast</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">screenNullResult</span><span style="color: #000000;">(</span><span style="color: #000000;">peekLast</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Retrieves and removes the first element of this deque, or returns null if</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the first element of this deque, or &lt;tt&gt;null&lt;/tt&gt; if empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E pollFirst</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; n = header.successor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!usable</span><span style="color: #000000;">(</span><span style="color: #000000;">n</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n.</span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">n.element;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Retrieves and removes the last element of this deque, or returns null if</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the last element of this deque, or &lt;tt&gt;null&lt;/tt&gt; if empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E pollLast</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; n = trailer.predecessor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!usable</span><span style="color: #000000;">(</span><span style="color: #000000;">n</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n.</span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">n.element;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes and returns the first element from this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the first element from this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NoSuchElementException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E removeFirst</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">screenNullResult</span><span style="color: #000000;">(</span><span style="color: #000000;">pollFirst</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes and returns the last element from this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the last element from this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NoSuchElementException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if this deque is empty.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E removeLast</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">screenNullResult</span><span style="color: #000000;">(</span><span style="color: #000000;">pollLast</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f7f5f;">// *** Queue and stack methods ***</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">offer</span><span style="color: #000000;">(</span><span style="color: #000000;">E e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">offerLast</span><span style="color: #000000;">(</span><span style="color: #000000;">e</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">add</span><span style="color: #000000;">(</span><span style="color: #000000;">E e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">offerLast</span><span style="color: #000000;">(</span><span style="color: #000000;">e</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E poll</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">pollFirst</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E remove</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">removeFirst</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E peek</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">peekFirst</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E element</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">getFirst</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">push</span><span style="color: #000000;">(</span><span style="color: #000000;">E e</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">addFirst</span><span style="color: #000000;">(</span><span style="color: #000000;">e</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E pop</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">removeFirst</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the first element &lt;tt&gt;e&lt;/tt&gt; such that &lt;tt&gt;o.equals(e)&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* if such an element exists in this deque. If the deque does not contain</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the element, it is unchanged.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            element to be removed from this deque, if present.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if the deque contained the specified element.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">removeFirstOccurrence</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">checkNullArg</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; n = header.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">o.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">n.element</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n.</span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// restart if interference</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">n = n.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the last element &lt;tt&gt;e&lt;/tt&gt; such that &lt;tt&gt;o.equals(e)&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* if such an element exists in this deque. If the deque does not contain</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the element, it is unchanged.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            element to be removed from this deque, if present.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if the deque contained the specified element.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">removeLastOccurrence</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">checkNullArg</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; s = trailer;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Node&lt;E&gt; n = s.back</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">s.isDeleted</span><span style="color: #000000;">() </span><span style="color: #000000;">|| </span><span style="color: #000000;">(</span><span style="color: #000000;">n != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; n.successor</span><span style="color: #000000;">() </span><span style="color: #000000;">!= s</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// restart if pred link is suspect.</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">o.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">n.element</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n.</span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// restart if interference</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">s = n;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this deque contains at least one element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;e&lt;/tt&gt; such that &lt;tt&gt;o.equals(e)&lt;/tt&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            element whose presence in this deque is to be tested.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this deque contains the specified element.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">o == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; n = header.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">; n != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; n = n.forward</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">o.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">n.element</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this collection contains no elements.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this collection contains no elements.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isEmpty</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">!usable</span><span style="color: #000000;">(</span><span style="color: #000000;">header.successor</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the number of elements in this deque. If this deque contains more</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* than &lt;tt&gt;Integer.MAX_VALUE&lt;/tt&gt; elements, it returns</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Integer.MAX_VALUE&lt;/tt&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Beware that, unlike in most collections, this method is &lt;em&gt;NOT&lt;/em&gt; a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* constant-time operation. Because of the asynchronous nature of these</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* deques, determining the current number of elements requires traversing</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* them all to count them. Additionally, it is possible for the size to</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* change during execution of this method, in which case the returned result</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* will be inaccurate. Thus, this method is typically not very useful in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* concurrent applications.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the number of elements in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">count = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; n = header.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">; n != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; n = n.forward</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">++count;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">count &gt;= Integer.MAX_VALUE</span><span style="color: #000000;">) </span><span style="color: #000000;">? Integer.MAX_VALUE : </span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">count;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the first element &lt;tt&gt;e&lt;/tt&gt; such that &lt;tt&gt;o.equals(e)&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* if such an element exists in this deque. If the deque does not contain</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the element, it is unchanged.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">o</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            element to be removed from this deque, if present.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if the deque contained the specified element.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified element is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">removeFirstOccurrence</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Appends all of the elements in the specified collection to the end of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this deque, in the order that they are returned by the specified</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* collection's iterator. The behavior of this operation is undefined if the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified collection is modified while the operation is in progress.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (This implies that the behavior of this call is undefined if the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified Collection is this deque, and this deque is nonempty.)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">c</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the elements to be inserted into this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this deque changed as a result of the call.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if &lt;tt&gt;c&lt;/tt&gt; or any element within it is &lt;tt&gt;null&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">addAll</span><span style="color: #000000;">(</span><span style="color: #000000;">Collection&lt;? </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">E&gt; c</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Iterator&lt;? </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">E&gt; it = c.iterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!it.hasNext</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>do </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">addLast</span><span style="color: #000000;">(</span><span style="color: #000000;">it.next</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">} </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">it.hasNext</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes all of the elements from this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">pollFirst</span><span style="color: #000000;">() </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an array containing all of the elements in this deque in the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* correct order.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an array containing all of the elements in this deque in the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         correct order.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object</span><span style="color: #000000;">[] </span><span style="color: #000000;">toArray</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">toArrayList</span><span style="color: #000000;">()</span><span style="color: #000000;">.toArray</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an array containing all of the elements in this deque in the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* correct order; the runtime type of the returned array is that of the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified array. If the deque fits in the specified array, it is returned</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* therein. Otherwise, a new array is allocated with the runtime type of the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified array and the size of this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* If the deque fits in the specified array with room to spare (i.e., the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* array has more elements than the deque), the element in the array</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* immediately following the end of the collection is set to null. This is</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* useful in determining the length of the deque &lt;i&gt;only&lt;/i&gt; if the caller</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* knows that the deque does not contain any null elements.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the array into which the elements of the deque are to be</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            stored, if it is big enough; otherwise, a new array of the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            same runtime type is allocated for this purpose.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an array containing the elements of the deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">ArrayStoreException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the runtime type of a is not a supertype of the runtime</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             type of every element in this deque.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the specified array is null.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">&lt;T&gt; T</span><span style="color: #000000;">[] </span><span style="color: #000000;">toArray</span><span style="color: #000000;">(</span><span style="color: #000000;">T</span><span style="color: #000000;">[] </span><span style="color: #000000;">a</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">toArrayList</span><span style="color: #000000;">()</span><span style="color: #000000;">.toArray</span><span style="color: #000000;">(</span><span style="color: #000000;">a</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a weakly consistent iterator over the elements in this deque, in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* first-to-last order. The &lt;tt&gt;next&lt;/tt&gt; method returns elements</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* reflecting the state of the deque at some point at or since the creation</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* of the iterator. The method does &lt;em&gt;not&lt;/em&gt; throw</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #3f3fbf;">{@link ConcurrentModificationException}</span><span style="color: #3f5fbf;">, and may proceed concurrently</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* with other operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an iterator over the elements in this deque</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator&lt;E&gt; iterator</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">CLDIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>final class </strong></span><span style="color: #000000;">CLDIterator </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Iterator&lt;E&gt; </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; last;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; next = header.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">hasNext</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">next != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">E next</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; l = last = next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">l == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">NoSuchElementException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">next = next.forward</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">l.element;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; l = last;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">l == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!l.</span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">() </span><span style="color: #000000;">&amp;&amp; !l.isDeleted</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #000000;">}</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Linked Nodes. As a minor efficiency hack, this class opportunistically</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* inherits from AtomicReference, with the atomic ref used as the "next"</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* link.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Nodes are in doubly-linked lists. There are three kinds of special nodes,</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* distinguished by: * The list header has a null prev link * The list</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* trailer has a null next link * A deletion marker has a prev link pointing</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* to itself. All three kinds of special nodes have null element fields.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Regular nodes have non-null element, next, and prev fields. To avoid</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* visible inconsistencies when deletions overlap element replacement,</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* replacements are done by replacing the node, not just setting the</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* element.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* Nodes can be traversed by read-only ConcurrentLinkedDeque class</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* operations just by following raw next pointers, so long as they ignore</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* any special nodes seen along the way. (This is automated in method</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* forward.) However, traversal using prev pointers is not guaranteed to see</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* all live nodes since a prev pointer of a deleted node can become</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* unrecoverably stale.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>class </strong></span><span style="color: #000000;">Node&lt;E&gt; </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AtomicReference&lt;Node&lt;E&gt;&gt; </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private volatile </strong></span><span style="color: #000000;">Node&lt;E&gt; prev;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">E element;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/** Creates a node with given contents */</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">E element, Node&lt;E&gt; next, Node&lt;E&gt; prev</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">next</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.prev = prev;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.element = element;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/** Creates a marker node with given successor */</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; next</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">next</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.prev = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.element = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Gets next link (which is actually the value held as atomic</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* reference).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Node&lt;E&gt; getNext</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">get</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Sets next link</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">n</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the next node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setNext</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; n</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">set</span><span style="color: #000000;">(</span><span style="color: #000000;">n</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* compareAndSet next link</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; cmp, Node&lt;E&gt; val</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">compareAndSet</span><span style="color: #000000;">(</span><span style="color: #000000;">cmp, val</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Gets prev link</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Node&lt;E&gt; getPrev</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">prev;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Sets prev link</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">b</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the previous node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setPrev</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; b</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">prev = b;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if this is a header, trailer, or marker node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isSpecial</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">element == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if this is a trailer node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isTrailer</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">getNext</span><span style="color: #000000;">() </span><span style="color: #000000;">== </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if this is a header node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isHeader</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">getPrev</span><span style="color: #000000;">() </span><span style="color: #000000;">== </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if this is a marker node</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isMarker</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">getPrev</span><span style="color: #000000;">() </span><span style="color: #000000;">== </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns true if this node is followed by a marker, meaning that it is</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* deleted.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">true if this node is deleted</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isDeleted</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">f != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; f.isMarker</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns next node, ignoring deletion marker</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Node&lt;E&gt; nextNonmarker</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| !f.isMarker</span><span style="color: #000000;">()) </span><span style="color: #000000;">? f : f.getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the next non-deleted node, swinging next pointer around any</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* encountered deleted nodes, and also patching up successor''s prev</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* link to point back to this. Returns null if this node is trailer so</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* has no successor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">successor, or null if no such</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; successor</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = nextNonmarker</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!f.isDeleted</span><span style="color: #000000;">()) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f.getPrev</span><span style="color: #000000;">() </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>this </strong></span><span style="color: #000000;">&amp;&amp; !isDeleted</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">f.setPrev</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// relink f's prev</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">f;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; s = f.nextNonmarker</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == getNext</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">f, s</span><span style="color: #000000;">)</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// unlink f</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">f = s;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the apparent predecessor of target by searching forward for</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* it starting at this node, patching up pointers while traversing. Used</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* by predecessor().</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">target's predecessor, or null if not found</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Node&lt;E&gt; findPredecessorOf</span><span style="color: #000000;">(</span><span style="color: #000000;">Node&lt;E&gt; target</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; n = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; f = n.successor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == target</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">n;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">n = f;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the previous non-deleted node, patching up pointers as</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* needed. Returns null if this node is header so has no successor. May</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* also return null if this node is deleted, so doesn't have a distinct</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* predecessor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">predecessor or null if not found</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; predecessor</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; n = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; b = n.getPrev</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">n.findPredecessorOf</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; s = b.getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">s == </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">b;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">s == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| !s.isMarker</span><span style="color: #000000;">()) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Node&lt;E&gt; p = b.findPredecessorOf</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">p != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">p;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">n = b;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the next node containing a nondeleted user element. Use for</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* forward list traversal.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">successor, or null if no such</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; forward</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = successor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| f.isSpecial</span><span style="color: #000000;">()) </span><span style="color: #000000;">? </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">: f;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns previous node containing a nondeleted user element, if</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* possible. Use for backward list traversal, but beware that if this</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* method is called from a deleted node, it might not be able to</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* determine a usable predecessor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">predecessor, or null if no such could be found</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; back</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = predecessor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| f.isSpecial</span><span style="color: #000000;">()) </span><span style="color: #000000;">? </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">: f;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tries to insert a node holding element as successor, failing if this</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* node is deleted.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the new node, or null on failure.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; append</span><span style="color: #000000;">(</span><span style="color: #000000;">E element</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; f = getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">f == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| f.isMarker</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; x = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node&lt;E&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">element, f, </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">f, x</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">f.setPrev</span><span style="color: #000000;">(</span><span style="color: #000000;">x</span><span style="color: #000000;">)</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// optimistically link</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">x;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tries to insert a node holding element as predecessor, failing if no</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* live predecessor can be found to link to.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the new node, or null on failure.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; prepend</span><span style="color: #000000;">(</span><span style="color: #000000;">E element</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; b = predecessor</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; x = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node&lt;E&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">element, this, b</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b.casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">this, x</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">setPrev</span><span style="color: #000000;">(</span><span style="color: #000000;">x</span><span style="color: #000000;">)</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// optimistically link</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">x;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tries to mark this node as deleted, failing if already deleted or if</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this node is header or trailer</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">true if successful</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #7f0055;"><strong>delete</strong></span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; b = getPrev</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Node&lt;E&gt; f = getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; f != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; !f.isMarker</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">&amp;&amp; casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">f, </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">f</span><span style="color: #000000;">))) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b.casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">this, f</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">f.setPrev</span><span style="color: #000000;">(</span><span style="color: #000000;">b</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tries to insert a node holding element to replace this node. failing</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* if already deleted.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">newElement</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the new element</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the new node, or null on failure.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">Node&lt;E&gt; replace</span><span style="color: #000000;">(</span><span style="color: #000000;">E newElement</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; b = getPrev</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; f = getNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">b == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| f == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| f.isMarker</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Node&lt;E&gt; x = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node&lt;E&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">newElement, f, b</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">casNext</span><span style="color: #000000;">(</span><span style="color: #000000;">f, </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Node</span><span style="color: #000000;">(</span><span style="color: #000000;">x</span><span style="color: #000000;">))) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">b.successor</span><span style="color: #000000;">()</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// to relink b</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">x.successor</span><span style="color: #000000;">()</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// to relink f</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">x;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code><code></code><code><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/concurrent-doubly-linkedlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchronized Queue</title>
		<link>http://code.jarplus.com/synchronized-queue/</link>
		<comments>http://code.jarplus.com/synchronized-queue/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:44:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4257</guid>
		<description><![CDATA[import java.util.LinkedList; import java.util.List;  */ public class SynchronizedQueue {    // Attributes ///////////////////////////////////////////////////////////////        /**     * Cache of object produced by producer and consumed by consumer.     */    protected List m_lstObjects;    // Constructors /////////////////////////////////////////////////////////////        /**     * Constructor for Synchronized Queue Object.     */    public SynchronizedQueue(    )    {       super();       m_lstObjects = new LinkedList();    }    // Logic ////////////////////////////////////////////////////////////////////        /**     * Destructor for Synchronized Queue. It is called when no other     * object holds reference to it.     *     * @exception Throwable - default destructor exception     */    protected void finalize(    ) throws Throwable    {       // Explicitely remove this just to help garbage collector       m_lstObjects.clear();       m_lstObjects = null;       super.finalize();    }    /**     * Get the object from the beginning of the queue     *     * @return Object - object from the queue, if the thread is blocked in this     *                  function and you call interrupt method, an InterruptedException     *                  will be thrown.     * @exception InterruptedException - if the thread is blocked in this     *                                   function and you call interrupt method,     *                                   an InterruptedException will be thrown.     */    public synchronized Object get(    ) throws InterruptedException    {       Object objReturn = null;       if (m_lstObjects.isEmpty())       {          // There is no object in the queue, go to sleep [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.LinkedList;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.List;</span></code></p>
<p><code><span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">SynchronizedQueue</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f7f5f;">// Attributes ///////////////////////////////////////////////////////////////</span><br />
<span style="color: #ffffff;">   </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Cache of object produced by producer and consumed by consumer.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">List m_lstObjects;</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f7f5f;">// Constructors /////////////////////////////////////////////////////////////</span><br />
<span style="color: #ffffff;">   </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Constructor for Synchronized Queue Object.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">SynchronizedQueue</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">m_lstObjects = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">LinkedList</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f7f5f;">// Logic ////////////////////////////////////////////////////////////////////</span><br />
<span style="color: #ffffff;">   </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Destructor for Synchronized Queue. It is called when no other</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* object holds reference to it.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">Throwable - default destructor exception</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">finalize</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">Throwable</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// Explicitely remove this just to help garbage collector</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">m_lstObjects.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">m_lstObjects = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">.finalize</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Get the object from the beginning of the queue</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">Object - object from the queue, if the thread is blocked in this</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*                  function and you call interrupt method, an InterruptedException</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*                  will be thrown.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">InterruptedException - if the thread is blocked in this</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*                                   function and you call interrupt method,</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*                                   an InterruptedException will be thrown.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #000000;">Object get</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">InterruptedException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object objReturn = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">m_lstObjects.isEmpty</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">         </span><span style="color: #3f7f5f;">// There is no object in the queue, go to sleep</span><br />
<span style="color: #ffffff;">         </span><span style="color: #7f0055;"><strong>try</strong></span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">wait</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">InterruptedException ieException</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// Somebody woke us up, that means all threads waiting on this</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// object competed for the lock and this one won and the object is</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// locked again</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// The thread can be woken up in two conditions, producer put new</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// object into the queue or somebody called interrupt - to interrupt</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// the wait - in this case rethrow an exception</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">m_lstObjects.isEmpty</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">               </span><span style="color: #7f0055;"><strong>throw </strong></span><span style="color: #000000;">ieException;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// Remove the first object in the queue</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">objReturn = m_lstObjects.remove</span><span style="color: #000000;">(</span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">objReturn;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Put the object to the end of the queue.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">objNew - new object, can be null</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">put</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object objNew</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">m_lstObjects.add</span><span style="color: #000000;">(</span><span style="color: #000000;">objNew</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// New object in the queue, notify others</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">notifyAll</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Test if the queue is empty.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">boolean - true if the queue is empty</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isEmpty</span><span style="color: #000000;">(</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">m_lstObjects.isEmpty</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></p>
<p></code><code></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/synchronized-queue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A version of Hashtable that supports mostly-concurrent reading, but exclusive writing</title>
		<link>http://code.jarplus.com/a-version-of-hashtable-that-supports-mostly-concurrent-reading-but-exclusive-writing/</link>
		<comments>http://code.jarplus.com/a-version-of-hashtable-that-supports-mostly-concurrent-reading-but-exclusive-writing/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:44:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4255</guid>
		<description><![CDATA[import java.io.IOException; import java.io.Serializable; import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; public class ConcurrentReaderHashMap extends AbstractMap implements Map, Cloneable, Serializable {   private static final long serialVersionUID = 1L; /** A Serializable class for barrier lock * */   protected static class BarrierLock implements java.io.Serializable   {     private static final long serialVersionUID = 1L;   }   /**    * Lock used only for its memory effects.    */   protected final BarrierLock barrierLock = new BarrierLock();   /**    * field written to only to guarantee lock ordering.    */   protected transient Object lastWrite;   /**    * Force a memory synchronization that will cause all readers to see table.    * Call only when already holding main synch lock.    * @param x     */   protected final void recordModification(Object x)   {     synchronized (barrierLock)     {       lastWrite = x;     }   }   /**    * Get ref to table; the reference and the cells it accesses will be at    * least as fresh as from last use of barrierLock    * @return table cells    */   protected final Entry[] getTableForReading()   {     synchronized (barrierLock)     {       return table;     }   }   /**    * The default initial number of table slots for this table (32). Used when    * not otherwise specified in constructor.    */ [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.IOException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.Serializable;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractCollection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractMap;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractSet;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Collection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Enumeration;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Iterator;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Map;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.NoSuchElementException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Set;</span></code></p>
<p><code><span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">ConcurrentReaderHashMap </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractMap </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Map, Cloneable, Serializable</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">serialVersionUID = </span><span style="color: #990000;">1L</span><span style="color: #000000;">;</span></code></p>
<p><code><span style="color: #3f5fbf;">/** A Serializable class for barrier lock * */</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static class </strong></span><span style="color: #000000;">BarrierLock </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">java.io.Serializable</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">serialVersionUID = </span><span style="color: #990000;">1L</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Lock used only for its memory effects.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">BarrierLock barrierLock = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">BarrierLock</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* field written to only to guarantee lock ordering.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Object lastWrite;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Force a memory synchronization that will cause all readers to see table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Call only when already holding main synch lock.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">x </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">Object x</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">barrierLock</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">lastWrite = x;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Get ref to table; the reference and the cells it accesses will be at</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* least as fresh as from last use of barrierLock</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">table cells</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">getTableForReading</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">barrierLock</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The default initial number of table slots for this table (32). Used when</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* not otherwise specified in constructor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">DEFAULT_INITIAL_CAPACITY = </span><span style="color: #990000;">32</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The minimum capacity, used if a lower value is implicitly specified by</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* either of the constructors with arguments. MUST be a power of two.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">MINIMUM_CAPACITY = </span><span style="color: #990000;">4</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The maximum capacity, used if a higher value is implicitly specified by</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* either of the constructors with arguments. MUST be a power of two &lt;= 1&lt;&lt;30.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">MAXIMUM_CAPACITY = </span><span style="color: #990000;">1 </span><span style="color: #000000;">&lt;&lt; </span><span style="color: #990000;">30</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The default load factor for this table (1.0). Used when not otherwise</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified in constructor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public static final </strong></span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">DEFAULT_LOAD_FACTOR = </span><span style="color: #990000;">0.75f</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The hash table data.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">table;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The total number of mappings in the hash table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">count;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The table is rehashed when its size exceeds this threshold. (The value of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this field is always (int)(capacity * loadFactor).)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">threshold;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The load factor for the hash table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">loadFactor;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the appropriate capacity (power of two) for the specified initial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* capacity argument.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">appropriate capacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">p2capacity</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap = initialCapacity;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Compute the appropriate capacity</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">cap &gt; MAXIMUM_CAPACITY || cap &lt; </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">result = MAXIMUM_CAPACITY;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">result = MINIMUM_CAPACITY;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">result &lt; cap</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">result &lt;&lt;= </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return hash code for Object x. Since we are using power-of-two tables, it</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* is worth the effort to improve hashcode via the same multiplicative</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* scheme as used in IdentityHashMap.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">x </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">hash code</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash</span><span style="color: #000000;">(</span><span style="color: #000000;">Object x</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">h = x.hashCode</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Multiply by 127 (quickly, via shifts), and mix in some high</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// bits to help guard against bunching of codes that are</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// consecutive or equally spaced.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">((</span><span style="color: #000000;">h &lt;&lt; </span><span style="color: #990000;">7</span><span style="color: #000000;">) </span><span style="color: #000000;">- h + </span><span style="color: #000000;">(</span><span style="color: #000000;">h &gt;&gt;&gt; </span><span style="color: #990000;">9</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #000000;">(</span><span style="color: #000000;">h &gt;&gt;&gt; </span><span style="color: #990000;">17</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Check for equality of non-null references x and y.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">x </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">y </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">equality</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">eq</span><span style="color: #000000;">(</span><span style="color: #000000;">Object x, Object y</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">x == y || x.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">y</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with the specified initial capacity and the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the initial capacity The actual initial capacity is rounded to</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the nearest power of two.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">loadFactor</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the load factor of the ConcurrentReaderHashMap</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IllegalArgumentException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the initial maximum number of elements is less than zero,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             or if the load factor is nonpositive.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentReaderHashMap</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity, </span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">loadFactor</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">loadFactor &lt;= </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Illegal Load factor: " </span><span style="color: #000000;">+ loadFactor</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.loadFactor = loadFactor;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap = p2capacity</span><span style="color: #000000;">(</span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">table = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[</span><span style="color: #000000;">cap</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">threshold = </span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">)(</span><span style="color: #000000;">cap * loadFactor</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with the specified initial capacity and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* default load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the initial capacity of the ConcurrentReaderHashMap.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IllegalArgumentException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the initial maximum number of elements is less than zero.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentReaderHashMap</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">initialCapacity, DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with a default initial capacity and load</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentReaderHashMap</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new map with the same mappings as the given map. The map is</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* created with a capacity of twice the number of mappings in the given map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* or 16 (whichever is greater), and a default load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">t </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentReaderHashMap</span><span style="color: #000000;">(</span><span style="color: #000000;">Map t</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Math.max</span><span style="color: #000000;">((</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">)(</span><span style="color: #000000;">t.size</span><span style="color: #000000;">() </span><span style="color: #000000;">/ DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #990000;">1</span><span style="color: #000000;">, </span><span style="color: #990000;">16</span><span style="color: #000000;">)</span><span style="color: #000000;">, DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">putAll</span><span style="color: #000000;">(</span><span style="color: #000000;">t</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the number of key-value mappings in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the number of key-value mappings in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">count;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this map contains no key-value mappings.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this map contains no key-value mappings.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isEmpty</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">count == </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the value to which the specified key is mapped in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            a key in the table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the value to which the key is mapped in this table;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if the key is not mapped to any value in this</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#put(Object, Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object get</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// throw null pointer exception if key null</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* Start off at the apparently correct bin. If entry is found, we need</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* to check after a barrier anyway. If not found, we need a barrier to</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* check if we are actually in right bin. So either way, we encounter</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* only one barrier unless we need to retry. And we only need to fully</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* synchronize if there have been concurrent modifications.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry e = first;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// If key apparently not there, check to</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// make sure this was a valid read</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">reread = getTableForReading</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">tab == reread &amp;&amp; first == tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// Wrong list -- must restart traversal at new first</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">tab = reread;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">e = first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>else if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Object value = e.value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// Entry was invalidated during deletion. But it could</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// have been re-inserted, so we must retraverse.</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// To avoid useless contention, get lock to wait out</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// modifications</span><br />
<span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// before retraversing.</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e = first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e = e.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tests if the specified object is a key in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            possible key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;code&gt;true&lt;/code&gt; if and only if the specified object is a key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         in this table, as determined by the &lt;tt&gt;equals&lt;/tt&gt; method;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;false&lt;/code&gt; otherwise.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#contains(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">containsKey</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Maps the specified &lt;code&gt;key&lt;/code&gt; to the specified &lt;code&gt;value&lt;/code&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* in this table. Neither the key nor the value can be &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The value can be retrieved by calling the &lt;code&gt;get&lt;/code&gt; method with</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* a key that is equal to the original key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the table key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the value.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the previous value of the specified key in this table, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if it did not have one.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key or value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Object#equals(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#get(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object put</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key, Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry e;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e = first; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">tab == table</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// make sure we are adding to correct list</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">first == tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #3f7f5f;">// Add to front of list</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">Entry newEntry = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">hash, key, value, first</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= newEntry;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">++count &gt;= threshold</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">newEntry</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">first == tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">&amp;&amp; oldValue != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">e.value = value;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// retry if wrong list or lost race against concurrent remove</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">sput</span><span style="color: #000000;">(</span><span style="color: #000000;">key, value, hash</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Continuation of put(), called only when synch lock is held and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* interference has been detected.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">hash </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">continuation object</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object sput</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key, Object value, </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry e = first;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry newEntry = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">hash, key, value, first</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= newEntry;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">++count &gt;= threshold</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">newEntry</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>else if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e.value = value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e = e.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Rehashes the contents of this map into a new table with a larger</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* capacity. This method is called automatically when the number of keys in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this map exceeds its capacity and load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">oldTable = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">oldCapacity = oldTable.length;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">oldCapacity &gt;= MAXIMUM_CAPACITY</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">threshold = Integer.MAX_VALUE; </span><span style="color: #3f7f5f;">// avoid retriggering</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">newCapacity = oldCapacity &lt;&lt; </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">mask = newCapacity - </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">threshold = </span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">)(</span><span style="color: #000000;">newCapacity * loadFactor</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">newTable = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[</span><span style="color: #000000;">newCapacity</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* Reclassify nodes in each list to new Map. Because we are using</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* power-of-two expansion, the elements from each bin must either stay</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* at same index, or move to oldCapacity+index. We also eliminate</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* unnecessary node creation by catching cases where old nodes can be</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* reused because their next fields won't change. Statistically, at the</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* default threshhold, only about one-sixth of them need cloning. (The</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* nodes they replace will be garbage collectable as soon as they are no</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* longer referenced by any reader thread that may be in the midst of</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* traversing table right now.)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; oldCapacity; i++</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// We need to guarantee that any existing reads of old Map can</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// proceed. So we cannot yet null out each bin.</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry e = oldTable</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">idx = e.hash &amp; mask;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry next = e.next;</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// Single node on list</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">next == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">idx</span><span style="color: #000000;">] </span><span style="color: #000000;">= e;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// Reuse trailing consecutive sequence of all same bit</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Entry lastRun = e;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">lastIdx = idx;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry last = next; last != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; last = last.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">k = last.hash &amp; mask;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">k != lastIdx</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">lastIdx = k;</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">lastRun = last;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">lastIdx</span><span style="color: #000000;">] </span><span style="color: #000000;">= lastRun;</span></p>
<p><span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// Clone all remaining nodes</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry p = e; p != lastRun; p = p.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">k = p.hash &amp; mask;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">k</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">p.hash, p.key, p.value, newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">k</span><span style="color: #000000;">])</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">table = newTable;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">newTable</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the key (and its corresponding value) from this table. This</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* method does nothing if the key is not in the table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the key that needs to be removed.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the value to which the key had been mapped in this table, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if the key did not have a mapping.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* Find the entry, then 1. Set value field to null, to force get() to</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* retry 2. Rebuild the list without this entry. All entries following</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* removed node can stay in list, but all preceeding ones need to be</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* cloned. Traversals rely on this strategy to ensure that elements will</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* not be repeated during iteration.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry e = first;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e = first; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">tab == table</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">first == tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">first == tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">&amp;&amp; oldValue != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">e.value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">count--;</span></p>
<p><span style="color: #ffffff;">            </span><span style="color: #000000;">Entry head = e.next;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry p = first; p != e; p = p.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">head = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">p.hash, p.key, p.value, head</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">            </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= head;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">head</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// Wrong list or interference</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">sremove</span><span style="color: #000000;">(</span><span style="color: #000000;">key, hash</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Continuation of remove(), called only when synch lock is held and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* interference has been detected.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">hash </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">continuation object</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object sremove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key, </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = first; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e.value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">count--;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry head = e.next;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry p = first; p != e; p = p.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">head = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">p.hash, p.key, p.value, head</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= head;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">head</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this map maps one or more keys to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified value. Note: This method requires a full internal traversal of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the hash table, and so is much slower than method &lt;tt&gt;containsKey&lt;/tt&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            value whose presence in this map is to be tested.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this map maps one or more keys to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         specified value.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry tab</span><span style="color: #000000;">[] </span><span style="color: #000000;">= getTableForReading</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; tab.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.value</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tests if some key maps into the specified value in this table. This</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operation is more expensive than the &lt;code&gt;containsKey&lt;/code&gt; method.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Note that this method is identical in functionality to containsValue,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (which is part of the Map interface in the collections framework).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            a value to search for.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;code&gt;true&lt;/code&gt; if and only if some key maps to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;value&lt;/code&gt; argument in this table as determined by the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;tt&gt;equals&lt;/tt&gt; method; &lt;code&gt;false&lt;/code&gt; otherwise.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#containsKey(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#containsValue(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Copies all of the mappings from the specified map to this one.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* These mappings replace any mappings that this map had for any of the keys</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* currently in the specified Map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">t</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            Mappings to be stored in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">putAll</span><span style="color: #000000;">(</span><span style="color: #000000;">Map t</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">n = t.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Expand enough to hold at least n elements without resizing.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// We can only resize table by factor of two at a time.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// It is faster to rehash with fewer elements, so do it now.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n &gt;= threshold</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Iterator it = t.entrySet</span><span style="color: #000000;">()</span><span style="color: #000000;">.iterator</span><span style="color: #000000;">()</span><span style="color: #000000;">; it.hasNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry entry = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">it.next</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object key = entry.getKey</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object value = entry.getValue</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">put</span><span style="color: #000000;">(</span><span style="color: #000000;">key, value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes all mappings from this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry tab</span><span style="color: #000000;">[] </span><span style="color: #000000;">= table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; tab.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// must invalidate all to force concurrent get's to wait and then</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// retry</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e.value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">count = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">recordModification</span><span style="color: #000000;">(</span><span style="color: #000000;">tab</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a shallow copy of this &lt;tt&gt;ConcurrentReaderHashMap&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* instance: the keys and values themselves are not cloned.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a shallow copy of this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #000000;">Object clone</span><span style="color: #000000;">() </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">CloneNotSupportedException</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>try</strong></span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentReaderHashMap t = </span><span style="color: #000000;">(</span><span style="color: #000000;">ConcurrentReaderHashMap</span><span style="color: #000000;">)</span><span style="color: #7f0055;"><strong>super</strong></span><span style="color: #000000;">.clone</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">t.keySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.entrySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.values = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.table = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[</span><span style="color: #000000;">tab.length</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">ttab = t.table;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; tab.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry first = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">first = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash, e.key, e.value, first</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">ttab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= first;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">t;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">CloneNotSupportedException e</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// this shouldn't happen, since we are Cloneable</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">InternalError</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f7f5f;">// Views</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Set keySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Set entrySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Collection values = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a set view of the keys contained in this map. The set is backed</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* by the map, so changes to the map are reflected in the set, and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* vice-versa. The set supports element removal, which removes the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* corresponding mapping from this map, via the &lt;tt&gt;Iterator.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Set.remove&lt;/tt&gt;, &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;clear&lt;/tt&gt; operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;addAll&lt;/tt&gt; operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a set view of the keys contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Set keySet</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Set ks = keySet;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">ks != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? ks : </span><span style="color: #000000;">(</span><span style="color: #000000;">keySet = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">KeySet</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">KeySet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractSet</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">KeyIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.containsKey</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#remove(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.remove</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a collection view of the values contained in this map. The</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* collection is backed by the map, so changes to the map are reflected in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the collection, and vice-versa. The collection supports element removal,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* which removes the corresponding mapping from this map, via the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Iterator.remove&lt;/tt&gt;, &lt;tt&gt;Collection.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and &lt;tt&gt;clear&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or &lt;tt&gt;addAll&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a collection view of the values contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Collection values</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Collection vs = values;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">vs != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? vs : </span><span style="color: #000000;">(</span><span style="color: #000000;">values = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Values</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">Values </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractCollection</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">ValueIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a collection view of the mappings contained in this map. Each</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* element in the returned collection is a &lt;tt&gt;Map.Entry&lt;/tt&gt;. The</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* collection is backed by the map, so changes to the map are reflected in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the collection, and vice-versa. The collection supports element removal,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* which removes the corresponding mapping from the map, via the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Iterator.remove&lt;/tt&gt;, &lt;tt&gt;Collection.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and &lt;tt&gt;clear&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or &lt;tt&gt;addAll&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a collection view of the mappings contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Set entrySet</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Set es = entrySet;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">es != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? es : </span><span style="color: #000000;">(</span><span style="color: #000000;">entrySet = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">EntrySet</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">EntrySet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractSet</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">HashIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry entry = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object v = ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.get</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getKey</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">v != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; v.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getValue</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#remove(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.findAndRemoveEntry</span><span style="color: #000000;">((</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Collection#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Helper method for entrySet.remove</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">entry</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;code&gt;true&lt;/code&gt; when the element was found and removed.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected synchronized </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">findAndRemoveEntry</span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry entry</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Object key = entry.getKey</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Object v = get</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">v != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; v.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getValue</span><span style="color: #000000;">()))</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an enumeration of the keys in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an enumeration of the keys in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#elements()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#keySet()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Enumeration keys</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">KeyIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an enumeration of the values in this table. Use the Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* methods on the returned object to fetch the elements sequentially.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an enumeration of the values in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#keys()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#values()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Enumeration elements</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">ValueIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* ConcurrentReaderHashMap collision list entry.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static class </strong></span><span style="color: #000000;">Entry </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Map.Entry</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* The use of volatile for value field ensures that we can detect status</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* changes without synchronization. The other fields are never changed,</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* and are marked as final.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Object key;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Entry next;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected volatile </strong></span><span style="color: #000000;">Object value;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash, Object key, Object value, Entry next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.hash = hash;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.key = key;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.next = next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Map.Entry Ops</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map.Entry#getKey()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object getKey</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Get the value. Note: In an entrySet or entrySet.iterator, unless the</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* set or iterator is used under synchronization of the table as a whole</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* (or you can otherwise guarantee lack of concurrent modification),</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* &lt;tt&gt;getValue&lt;/tt&gt; &lt;em&gt;might&lt;/em&gt; return null, reflecting the fact</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* that the entry has been concurrently removed. However, there are no</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* assurances that concurrent removals will be reflected using this</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* method.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the current value, or null if the entry has been detectably</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*         removed.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object getValue</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Set the value of this entry. Note: In an entrySet or</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* entrySet.iterator), unless the set or iterator is used under</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* synchronization of the table as a whole (or you can otherwise</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* guarantee lack of concurrent modification), &lt;tt&gt;setValue&lt;/tt&gt; is</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* not strictly guaranteed to actually replace the value field obtained</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* via the &lt;tt&gt;get&lt;/tt&gt; operation of the underlying hash table in</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* multithreaded applications. If iterator-wide synchronization is not</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* used, and any other concurrent &lt;tt&gt;put&lt;/tt&gt; or &lt;tt&gt;remove&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* operations occur, sometimes even to &lt;em&gt;other&lt;/em&gt; entries, then</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* this change is not guaranteed to be reflected in the hash table. (It</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* might, or it might not. There are no assurances either way.)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*            the new value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the previous value, or null if entry has been detectably</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*         removed.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object setValue</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object oldValue = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Object#equals(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">equals</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry e = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">key.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getKey</span><span style="color: #000000;">()) </span><span style="color: #000000;">&amp;&amp; value.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getValue</span><span style="color: #000000;">()))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Object#hashCode()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hashCode</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key.hashCode</span><span style="color: #000000;">() </span><span style="color: #000000;">^ value.hashCode</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Object#toString()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String toString</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key + </span><span style="color: #2a00ff;">"=" </span><span style="color: #000000;">+ value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">HashIterator </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Iterator, Enumeration</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab; </span><span style="color: #3f7f5f;">// snapshot of table</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index; </span><span style="color: #3f7f5f;">// current slot</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Entry entry = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// current node of slot</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object currentKey; </span><span style="color: #3f7f5f;">// key for current node</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object currentValue; </span><span style="color: #3f7f5f;">// value for current node</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Entry lastReturned = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// last node returned by next</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">HashIterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">tab = ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.getTableForReading</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">index = tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Enumeration#hasMoreElements()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">hasMoreElements</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">hasNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Enumeration#nextElement()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object nextElement</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">next</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Iterator#hasNext()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">hasNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* currentkey and currentValue are set here to ensure that next()</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* returns normally if hasNext() returns true. This avoids surprises</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* especially when final element is removed during traversal --</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* instead, we just ignore the removal during current traversal.</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Object v = entry.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">v != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">currentKey = entry.key;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">currentValue = v;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">entry = entry.next;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; index &gt;= </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">entry = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index--</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">currentKey = currentValue = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">entry;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Iterator#next()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object next</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">currentKey == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; !hasNext</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">NoSuchElementException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Object result = returnValueOfNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">lastReturned = entry;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">currentKey = currentValue = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">entry = entry.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Iterator#remove()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">lastReturned == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentReaderHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.remove</span><span style="color: #000000;">(</span><span style="color: #000000;">lastReturned.key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">lastReturned = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">KeyIterator </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HashIterator</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">currentKey;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">ValueIterator </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HashIterator</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">currentValue;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Save the state of the &lt;tt&gt;ConcurrentReaderHashMap&lt;/tt&gt; instance to a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* stream (i.e., serialize it).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">s </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IOException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serialData </span><span style="color: #3f5fbf;">The &lt;i&gt;capacity&lt;/i&gt; of the ConcurrentReaderHashMap (the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             length of the bucket array) is emitted (int), followed by the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             &lt;i&gt;size&lt;/i&gt; of the ConcurrentReaderHashMap (the number of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             key-value mappings), followed by the key (Object) and value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             (Object) for each key-value mapping represented by the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             ConcurrentReaderHashMap The key-value mappings are emitted in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             no particular order.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">java.io.ObjectOutputStream s</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IOException</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out the threshold, loadfactor, and any hidden stuff</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.defaultWriteObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out number of buckets</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.writeInt</span><span style="color: #000000;">(</span><span style="color: #000000;">table.length</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out size (number of Mappings)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.writeInt</span><span style="color: #000000;">(</span><span style="color: #000000;">count</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out keys and values (alternating)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = table.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">; index &gt;= </span><span style="color: #990000;">0</span><span style="color: #000000;">; index--</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry entry = table</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">entry = entry.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Reconstitute the &lt;tt&gt;ConcurrentReaderHashMap&lt;/tt&gt; instance from a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* stream (i.e., deserialize it).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">s </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IOException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">ClassNotFoundException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">readObject</span><span style="color: #000000;">(</span><span style="color: #000000;">java.io.ObjectInputStream s</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IOException,</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ClassNotFoundException</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read in the threshold, loadfactor, and any hidden stuff</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.defaultReadObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read in number of buckets and allocate the bucket array;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">numBuckets = s.readInt</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">table = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[</span><span style="color: #000000;">numBuckets</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read in size (number of Mappings)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size = s.readInt</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read the keys and values, and put the mappings in the table</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; size; i++</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object key = s.readObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object value = s.readObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">put</span><span style="color: #000000;">(</span><span style="color: #000000;">key, value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return the number of slots in this table</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">number of slots in this table</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">capacity</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">table.length;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return the load factor</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the load factor</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">loadFactor</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">loadFactor;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code><code></code><code></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/a-version-of-hashtable-that-supports-mostly-concurrent-reading-but-exclusive-writing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A version of Hashtable supporting concurrency for both retrievals and updates</title>
		<link>http://code.jarplus.com/a-version-of-hashtable-supporting-concurrency-for-both-retrievals-and-updates/</link>
		<comments>http://code.jarplus.com/a-version-of-hashtable-supporting-concurrency-for-both-retrievals-and-updates/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:43:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Concurrent]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4253</guid>
		<description><![CDATA[import java.io.IOException; import java.io.Serializable; import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; public class ConcurrentHashMap extends AbstractMap implements Map, Cloneable, Serializable {   private static final long serialVersionUID = 1L;  /**    * The hash table data.    */   protected transient Entry[] table;   /**    * The number of concurrency control segments. The value can be at most 32    * since ints are used as bitsets over segments. Emprically, it doesn't seem    * to pay to decrease it either, so the value should be at least 32. In    * other words, do not redefine this :-)    */   protected static final int CONCURRENCY_LEVEL = 32;   /**    * Mask value for indexing into segments    */   protected static final int SEGMENT_MASK = CONCURRENCY_LEVEL - 1;   /**    * Bookkeeping for each concurrency control segment. Each segment contains a    * local count of the number of elements in its region. However, the main    * use of a Segment is for its lock.    */   protected final static class Segment implements Serializable   {     private static final long serialVersionUID = 1L;          /**      * The number of elements in this segment's region. It is always updated      * within synchronized blocks.      */     protected int count;     /**      * Get the count under synch.      * @return count under sync      */     protected synchronized int getCount()     {       return count;     }     /**      * Force a synchronization      */     protected synchronized void synch() [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.IOException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.Serializable;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractCollection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractMap;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.AbstractSet;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Collection;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Enumeration;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Iterator;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Map;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.NoSuchElementException;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Set;</span><br />
<code><span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">ConcurrentHashMap </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractMap </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Map, Cloneable, Serializable</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">serialVersionUID = </span><span style="color: #990000;">1L</span><span style="color: #000000;">;</span></code></code></p>
<p><code><span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The hash table data.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">table;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The number of concurrency control segments. The value can be at most 32</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* since ints are used as bitsets over segments. Emprically, it doesn't seem</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* to pay to decrease it either, so the value should be at least 32. In</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* other words, do not redefine this :-)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">CONCURRENCY_LEVEL = </span><span style="color: #990000;">32</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Mask value for indexing into segments</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">SEGMENT_MASK = CONCURRENCY_LEVEL - </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Bookkeeping for each concurrency control segment. Each segment contains a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* local count of the number of elements in its region. However, the main</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* use of a Segment is for its lock.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final static class </strong></span><span style="color: #000000;">Segment </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Serializable</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>long </strong></span><span style="color: #000000;">serialVersionUID = </span><span style="color: #990000;">1L</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* The number of elements in this segment's region. It is always updated</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* within synchronized blocks.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">count;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Get the count under synch.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">count under sync</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected synchronized </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">getCount</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">count;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Force a synchronization</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">synch</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The array of concurrency control segments.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Segment</span><span style="color: #000000;">[] </span><span style="color: #000000;">segments = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Segment</span><span style="color: #000000;">[</span><span style="color: #000000;">CONCURRENCY_LEVEL</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The default initial number of table slots for this table (32). Used when</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* not otherwise specified in constructor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">DEFAULT_INITIAL_CAPACITY = </span><span style="color: #990000;">32</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The minimum capacity, used if a lower value is implicitly specified by</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* either of the constructors with arguments. MUST be a power of two.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">MINIMUM_CAPACITY = </span><span style="color: #990000;">32</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The maximum capacity, used if a higher value is implicitly specified by</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* either of the constructors with arguments. MUST be a power of two &lt;= 1&lt;&lt;30.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">MAXIMUM_CAPACITY = </span><span style="color: #990000;">1 </span><span style="color: #000000;">&lt;&lt; </span><span style="color: #990000;">30</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The default load factor for this table (0.75) Used when not otherwise</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified in constructor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public static final </strong></span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">DEFAULT_LOAD_FACTOR = </span><span style="color: #990000;">0.75f</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The load factor for the hash table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">loadFactor;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Per-segment resize threshold.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">threshold;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Number of segments voting for resize. The table is doubled when 1/4 of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the segments reach threshold. Volatile but updated without synch since</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* this is just a heuristic.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient volatile </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">votesForResize;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return the number of set bits in w. For a derivation of this algorithm,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* see "Algorithms and data structures with applications to graphics and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* geometry", by Jurg Nievergelt and Klaus Hinrichs, Prentice Hall, 1993.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* See also notes by Torsten Sillke at</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* http://www.mathematik.uni-bielefeld.de/~sillke/PROBLEMS/bitcount</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">w arg</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">number of set bits</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">bitcount</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">w</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">w -= </span><span style="color: #000000;">(</span><span style="color: #990000;">0xaaaaaaaa </span><span style="color: #000000;">&amp; w</span><span style="color: #000000;">) </span><span style="color: #000000;">&gt;&gt;&gt; </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">w = </span><span style="color: #000000;">(</span><span style="color: #000000;">w &amp; </span><span style="color: #990000;">0x33333333</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #000000;">((</span><span style="color: #000000;">w &gt;&gt;&gt; </span><span style="color: #990000;">2</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp; </span><span style="color: #990000;">0x33333333</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">w = </span><span style="color: #000000;">(</span><span style="color: #000000;">w + </span><span style="color: #000000;">(</span><span style="color: #000000;">w &gt;&gt;&gt; </span><span style="color: #990000;">4</span><span style="color: #000000;">)) </span><span style="color: #000000;">&amp; </span><span style="color: #990000;">0x0f0f0f0f</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">w += w &gt;&gt;&gt; </span><span style="color: #990000;">8</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">w += w &gt;&gt;&gt; </span><span style="color: #990000;">16</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">w &amp; </span><span style="color: #990000;">0xff</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the appropriate capacity (power of two) for the specified initial</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* capacity argument.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity the initial capacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">appropriate capacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">p2capacity</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap = initialCapacity;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Compute the appropriate capacity</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">cap &gt; MAXIMUM_CAPACITY || cap &lt; </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">result = MAXIMUM_CAPACITY;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">result = MINIMUM_CAPACITY;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">result &lt; cap</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">result &lt;&lt;= </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return hash code for Object x. Since we are using power-of-two tables, it</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* is worth the effort to improve hashcode via the same multiplicative</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* scheme as used in IdentityHashMap.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">x </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">hash code</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash</span><span style="color: #000000;">(</span><span style="color: #000000;">Object x</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">h = x.hashCode</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Multiply by 127 (quickly, via shifts), and mix in some high</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// bits to help guard against bunching of codes that are</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// consecutive or equally spaced.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">((</span><span style="color: #000000;">h &lt;&lt; </span><span style="color: #990000;">7</span><span style="color: #000000;">) </span><span style="color: #000000;">- h + </span><span style="color: #000000;">(</span><span style="color: #000000;">h &gt;&gt;&gt; </span><span style="color: #990000;">9</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #000000;">(</span><span style="color: #000000;">h &gt;&gt;&gt; </span><span style="color: #990000;">17</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Check for equality of non-null references x and y.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">x ref</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">y ref</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">is equal</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">eq</span><span style="color: #000000;">(</span><span style="color: #000000;">Object x, Object y</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">x == y || x.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">y</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Create table array and set the per-segment threshold * </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">capacity </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">table array</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">newTable</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">capacity</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">threshold = </span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">)(</span><span style="color: #000000;">capacity * loadFactor / CONCURRENCY_LEVEL</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[</span><span style="color: #000000;">capacity</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with the specified initial capacity and the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the initial capacity. The actual initial capacity is rounded</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            to the nearest power of two.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">loadFactor</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the load factor threshold, used to control resizing. This</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            value is used in an approximate way: When at least a quarter</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            of the segments of the table reach per-segment threshold, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            one of the segments itself exceeds overall threshold, the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            table is doubled. This will on average cause resizing when the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            table-wide load factor is slightly less than the threshold. If</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            you'd like to avoid resizing, you can set this to a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            ridiculously large value.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IllegalArgumentException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the load factor is nonpositive.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentHashMap</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity, </span><span style="color: #7f0055;"><strong>float </strong></span><span style="color: #000000;">loadFactor</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">loadFactor &gt; </span><span style="color: #990000;">0</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Illegal Load factor: " </span><span style="color: #000000;">+ loadFactor</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.loadFactor = loadFactor;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; segments.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Segment</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap = p2capacity</span><span style="color: #000000;">(</span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">table = newTable</span><span style="color: #000000;">(</span><span style="color: #000000;">cap</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with the specified initial capacity and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* default load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">initialCapacity</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the initial capacity of the ConcurrentHashMap.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IllegalArgumentException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             if the initial maximum number of elements is less than zero.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentHashMap</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">initialCapacity</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">initialCapacity, DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new, empty map with a default initial capacity and default</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentHashMap</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Constructs a new map with the same mappings as the given map. The map is</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* created with a capacity of twice the number of mappings in the given map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* or 32 (whichever is greater), and a default load factor.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">t map to copy</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">ConcurrentHashMap</span><span style="color: #000000;">(</span><span style="color: #000000;">Map t</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Math.max</span><span style="color: #000000;">((</span><span style="color: #7f0055;"><strong>int</strong></span><span style="color: #000000;">)(</span><span style="color: #000000;">t.size</span><span style="color: #000000;">() </span><span style="color: #000000;">/ DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">) </span><span style="color: #000000;">+ </span><span style="color: #990000;">1</span><span style="color: #000000;">, MINIMUM_CAPACITY</span><span style="color: #000000;">)</span><span style="color: #000000;">,</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">DEFAULT_LOAD_FACTOR</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">putAll</span><span style="color: #000000;">(</span><span style="color: #000000;">t</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the number of key-value mappings in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the number of key-value mappings in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">c = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; segments.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">c += segments</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">.getCount</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">c;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this map contains no key-value mappings.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this map contains no key-value mappings.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isEmpty</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; segments.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">.getCount</span><span style="color: #000000;">() </span><span style="color: #000000;">!= </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns the value to which the specified key is mapped in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            a key in the table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the value to which the key is mapped in this table;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if the key is not mapped to any value in this</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#put(Object, Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object get</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// throws null pointer exception if key null</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Try first without locking...</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry e;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e = first; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Object value = e.value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">value;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Recheck under synch if key apparently not there or interference</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">hash &amp; SEGMENT_MASK</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry newFirst = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">|| first != newFirst</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e = newFirst; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">e.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tests if the specified object is a key in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            possible key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;code&gt;true&lt;/code&gt; if and only if the specified object is a key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         in this table, as determined by the &lt;tt&gt;equals&lt;/tt&gt; method;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;false&lt;/code&gt; otherwise.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#contains(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">containsKey</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Maps the specified &lt;code&gt;key&lt;/code&gt; to the specified &lt;code&gt;value&lt;/code&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* in this table. Neither the key nor the value can be &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (Note that this policy is the same as for java.util.Hashtable, but unlike</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* java.util.HashMap, which does accept nulls as valid keys and values.)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* The value can be retrieved by calling the &lt;code&gt;get&lt;/code&gt; method with</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* a key that is equal to the original key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the table key.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the value.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the previous value of the specified key in this table, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if it did not have one.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key or value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Object#equals(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#get(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object put</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key, Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">hash &amp; SEGMENT_MASK</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">segcount;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">votes;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = first; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">e.value = value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// Add to front of list</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry newEntry = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">hash, key, value, first</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= newEntry;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">((</span><span style="color: #000000;">segcount = ++seg.count</span><span style="color: #000000;">) </span><span style="color: #000000;">&lt; threshold</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">bit = </span><span style="color: #000000;">(</span><span style="color: #990000;">1 </span><span style="color: #000000;">&lt;&lt; </span><span style="color: #000000;">(</span><span style="color: #000000;">hash &amp; SEGMENT_MASK</span><span style="color: #000000;">))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">votes = votesForResize;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">((</span><span style="color: #000000;">votes &amp; bit</span><span style="color: #000000;">) </span><span style="color: #000000;">== </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">votes = votesForResize |= bit;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Attempt resize if 1/4 segs vote,</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// or if this seg itself reaches the overall threshold.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// (The latter check is just a safeguard to avoid pathological cases.)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">bitcount</span><span style="color: #000000;">(</span><span style="color: #000000;">votes</span><span style="color: #000000;">) </span><span style="color: #000000;">&gt;= CONCURRENCY_LEVEL / </span><span style="color: #990000;">4 </span><span style="color: #000000;">|| segcount &gt; </span><span style="color: #000000;">(</span><span style="color: #000000;">threshold * CONCURRENCY_LEVEL</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">resize</span><span style="color: #000000;">(</span><span style="color: #990000;">0</span><span style="color: #000000;">, tab</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Gather all locks in order to call rehash, by recursing within synch</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* blocks for each segment index.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">index</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the current segment. initially call value must be 0</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">assumedTab</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the state of table on first call to resize. If this changes on</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            any call, the attempt is aborted because the table has already</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            been resized by another thread.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">resize</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index, Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">assumedTab</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">assumedTab == table</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">next = index + </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">next &lt; segments.length</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">resize</span><span style="color: #000000;">(</span><span style="color: #000000;">next, assumedTab</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Rehashes the contents of this map into a new table with a larger</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* capacity.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">rehash</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">votesForResize = </span><span style="color: #990000;">0</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// reset</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">oldTable = table;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">oldCapacity = oldTable.length;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">oldCapacity &gt;= MAXIMUM_CAPACITY</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">threshold = Integer.MAX_VALUE; </span><span style="color: #3f7f5f;">// avoid retriggering</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">newCapacity = oldCapacity &lt;&lt; </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">newTable = newTable</span><span style="color: #000000;">(</span><span style="color: #000000;">newCapacity</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">mask = newCapacity - </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* Reclassify nodes in each list to new Map. Because we are using</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* power-of-two expansion, the elements from each bin must either stay</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* at same index, or move to oldCapacity+index. We also eliminate</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* unnecessary node creation by catching cases where old nodes can be</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* reused because their next fields won't change. Statistically, at the</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* default threshhold, only about one-sixth of them need cloning. (The</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* nodes they replace will be garbage collectable as soon as they are no</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* longer referenced by any reader thread that may be in the midst of</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* traversing table right now.)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; oldCapacity; i++</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// We need to guarantee that any existing reads of old Map can</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// proceed. So we cannot yet null out each bin.</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry e = oldTable</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">idx = e.hash &amp; mask;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry next = e.next;</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #3f7f5f;">// Single node on list</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">next == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">idx</span><span style="color: #000000;">] </span><span style="color: #000000;">= e;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// Reuse trailing consecutive sequence of all same bit</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Entry lastRun = e;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">lastIdx = idx;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry last = next; last != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; last = last.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">k = last.hash &amp; mask;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">k != lastIdx</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">lastIdx = k;</span><br />
<span style="color: #ffffff;">              </span><span style="color: #000000;">lastRun = last;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">lastIdx</span><span style="color: #000000;">] </span><span style="color: #000000;">= lastRun;</span></p>
<p><span style="color: #ffffff;">          </span><span style="color: #3f7f5f;">// Clone all remaining nodes</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry p = e; p != lastRun; p = p.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">k = p.hash &amp; mask;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">k</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">p.hash, p.key, p.value, newTable</span><span style="color: #000000;">[</span><span style="color: #000000;">k</span><span style="color: #000000;">])</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">table = newTable;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the key (and its corresponding value) from this table. This</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* method does nothing if the key is not in the table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the key that needs to be removed.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the value to which the key had been mapped in this table, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if the key did not have a mapping.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">key, </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes the (key, value) pair from this table. This method does nothing</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* if the key is not in the table, or if the key is associated with a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* different value. This method is needed by EntrySet.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">key</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the key that needs to be removed.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            the associated value. If the value is null, it means "any</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            value".</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the value to which the key had been mapped in this table, or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;null&lt;/code&gt; if the key did not have a mapping.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the key is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object key, Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* Find the entry, then 1. Set value field to null, to force get() to</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* retry 2. Rebuild the list without this entry. All entries following</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* removed node can stay in list, but all preceeding ones need to be</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* cloned. Traversals rely on this strategy to ensure that elements will</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* not be repeated during iteration.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash = hash</span><span style="color: #000000;">(</span><span style="color: #000000;">key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">hash &amp; SEGMENT_MASK</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index = hash &amp; </span><span style="color: #000000;">(</span><span style="color: #000000;">tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry first = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry e = first;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">e.hash == hash &amp;&amp; eq</span><span style="color: #000000;">(</span><span style="color: #000000;">key, e.key</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">e = e.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Object oldValue = e.value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; !value.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">oldValue</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">e.value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Entry head = e.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry p = first; p != e; p = p.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">head = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #000000;">p.hash, p.key, p.value, head</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index</span><span style="color: #000000;">] </span><span style="color: #000000;">= head;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">seg.count--;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns &lt;tt&gt;true&lt;/tt&gt; if this map maps one or more keys to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* specified value. Note: This method requires a full internal traversal of</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the hash table, and so is much slower than method &lt;tt&gt;containsKey&lt;/tt&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            value whose presence in this map is to be tested.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;tt&gt;true&lt;/tt&gt; if this map maps one or more keys to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         specified value.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">s = </span><span style="color: #990000;">0</span><span style="color: #000000;">; s &lt; segments.length; ++s</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">s</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = s; i &lt; tab.length; i += segments.length</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.value</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Tests if some key maps into the specified value in this table. This</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operation is more expensive than the &lt;code&gt;containsKey&lt;/code&gt; method.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;p&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Note that this method is identical in functionality to containsValue,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (which is part of the Map interface in the collections framework).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            a value to search for.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">&lt;code&gt;true&lt;/code&gt; if and only if some key maps to the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;code&gt;value&lt;/code&gt; argument in this table as determined by the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*         &lt;tt&gt;equals&lt;/tt&gt; method; &lt;code&gt;false&lt;/code&gt; otherwise.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#containsKey(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#containsValue(Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Copies all of the mappings from the specified map to this one.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* These mappings replace any mappings that this map had for any of the keys</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* currently in the specified Map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">t</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*            Mappings to be stored in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">putAll</span><span style="color: #000000;">(</span><span style="color: #000000;">Map t</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">n = t.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n == </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Expand enough to hold at least n elements without resizing.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// We can only resize table by factor of two at a time.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// It is faster to rehash with fewer elements, so do it now.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">max;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #990000;">0</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{ </span><span style="color: #3f7f5f;">// must synch on some segment. pick 0.</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">max = threshold * CONCURRENCY_LEVEL;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">n &lt; max</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">resize</span><span style="color: #000000;">(</span><span style="color: #990000;">0</span><span style="color: #000000;">, tab</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Iterator it = t.entrySet</span><span style="color: #000000;">()</span><span style="color: #000000;">.iterator</span><span style="color: #000000;">()</span><span style="color: #000000;">; it.hasNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry entry = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">it.next</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">put</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getKey</span><span style="color: #000000;">()</span><span style="color: #000000;">, entry.getValue</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Removes all mappings from this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// We don't need all locks at once so long as locks</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// are obtained in low to high order</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">s = </span><span style="color: #990000;">0</span><span style="color: #000000;">; s &lt; segments.length; ++s</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">s</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = s; i &lt; tab.length; i += segments.length</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">e.value = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">seg.count = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a shallow copy of this &lt;tt&gt;ConcurrentHashMap&lt;/tt&gt; instance: the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* keys and values themselves are not cloned.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a shallow copy of this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object clone</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// We cannot call super.clone, since it would share final segments</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// array,</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// and there's no way to reassign finals.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">ConcurrentHashMap</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f7f5f;">// Views</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Set keySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Set entrySet = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected transient </strong></span><span style="color: #000000;">Collection values = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a set view of the keys contained in this map. The set is backed</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* by the map, so changes to the map are reflected in the set, and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* vice-versa. The set supports element removal, which removes the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* corresponding mapping from this map, via the &lt;tt&gt;Iterator.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Set.remove&lt;/tt&gt;, &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;clear&lt;/tt&gt; operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;addAll&lt;/tt&gt; operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a set view of the keys contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Set keySet</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Set ks = keySet;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">ks != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? ks : </span><span style="color: #000000;">(</span><span style="color: #000000;">keySet = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">KeySet</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">KeySet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractSet</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">KeyIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.containsKey</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#remove(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.remove</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a collection view of the values contained in this map. The</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* collection is backed by the map, so changes to the map are reflected in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the collection, and vice-versa. The collection supports element removal,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* which removes the corresponding mapping from this map, via the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Iterator.remove&lt;/tt&gt;, &lt;tt&gt;Collection.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and &lt;tt&gt;clear&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or &lt;tt&gt;addAll&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a collection view of the values contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Collection values</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Collection vs = values;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">vs != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? vs : </span><span style="color: #000000;">(</span><span style="color: #000000;">values = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Values</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">Values </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractCollection</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.AbstractCollection#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">ValueIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.AbstractCollection#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.AbstractCollection#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.containsValue</span><span style="color: #000000;">(</span><span style="color: #000000;">o</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.AbstractCollection#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns a collection view of the mappings contained in this map. Each</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* element in the returned collection is a &lt;tt&gt;Map.Entry&lt;/tt&gt;. The</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* collection is backed by the map, so changes to the map are reflected in</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* the collection, and vice-versa. The collection supports element removal,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* which removes the corresponding mapping from the map, via the</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;Iterator.remove&lt;/tt&gt;, &lt;tt&gt;Collection.remove&lt;/tt&gt;,</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* &lt;tt&gt;removeAll&lt;/tt&gt;, &lt;tt&gt;retainAll&lt;/tt&gt;, and &lt;tt&gt;clear&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations. It does not support the &lt;tt&gt;add&lt;/tt&gt; or &lt;tt&gt;addAll&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* operations.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">a collection view of the mappings contained in this map.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Set entrySet</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">Set es = entrySet;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">es != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #000000;">? es : </span><span style="color: #000000;">(</span><span style="color: #000000;">entrySet = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">EntrySet</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private class </strong></span><span style="color: #000000;">EntrySet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">AbstractSet</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#iterator()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Iterator iterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">HashIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#contains(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">contains</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry entry = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object v = ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.get</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getKey</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">v != </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; v.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">entry.getValue</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#remove(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry e = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.remove</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getKey</span><span style="color: #000000;">()</span><span style="color: #000000;">, e.getValue</span><span style="color: #000000;">()) </span><span style="color: #000000;">!= </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#size()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">size</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.size</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Set#clear()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">clear</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.clear</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an enumeration of the keys in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an enumeration of the keys in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#elements()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#keySet()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Enumeration keys</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">KeyIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Returns an enumeration of the values in this table. Use the Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* methods on the returned object to fetch the elements sequentially.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">an enumeration of the values in this table.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Enumeration</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#keys()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">#values()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">Map</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Enumeration elements</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return new </strong></span><span style="color: #000000;">ValueIterator</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* ConcurrentHashMap collision list entry.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected static class </strong></span><span style="color: #000000;">Entry </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Map.Entry</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* The use of volatile for value field ensures that we can detect status</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* changes without synchronization. The other fields are never changed,</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">* and are marked as final.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Object key;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected volatile </strong></span><span style="color: #000000;">Object value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Entry next;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">Entry</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hash, Object key, Object value, Entry next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.hash = hash;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.key = key;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.next = next;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Map.Entry Ops</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Map.Entry#getKey()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object getKey</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Get the value. Note: In an entrySet or entrySet.iterator, unless you</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* can guarantee lack of concurrent modification,</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* &lt;tt&gt;getValue&lt;/tt&gt; &lt;em&gt;might&lt;/em&gt; return null, reflecting the fact</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* that the entry has been concurrently removed. However, there are no</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* assurances that concurrent removals will be reflected using this</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* method.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the current value, or null if the entry has been detectably</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*         removed.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object getValue</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* Set the value of this entry. Note: In an entrySet or</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* entrySet.iterator), unless you can guarantee lack of concurrent</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* modification, &lt;tt&gt;setValue&lt;/tt&gt; is not strictly guaranteed to</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* actually replace the value field obtained via the &lt;tt&gt;get&lt;/tt&gt;</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* operation of the underlying hash table in multithreaded applications.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* If iterator-wide synchronization is not used, and any other</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* concurrent &lt;tt&gt;put&lt;/tt&gt; or &lt;tt&gt;remove&lt;/tt&gt; operations occur,</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* sometimes even to &lt;em&gt;other&lt;/em&gt; entries, then this change is not</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* guaranteed to be reflected in the hash table. (It might, or it might</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* not. There are no assurances either way.)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">value</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*            the new value.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@return </span><span style="color: #3f5fbf;">the previous value, or null if entry has been detectably</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*         removed.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@exception </span><span style="color: #3f5fbf;">NullPointerException</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*                if the value is &lt;code&gt;null&lt;/code&gt;.</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object setValue</span><span style="color: #000000;">(</span><span style="color: #000000;">Object value</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">value == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalArgumentException</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Value must not be null"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object oldValue = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.value = value;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">oldValue;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Map.Entry#equals(java.lang.Object)</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">equals</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">o </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">))</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Map.Entry e = </span><span style="color: #000000;">(</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">)</span><span style="color: #000000;">o;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">key.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getKey</span><span style="color: #000000;">()) </span><span style="color: #000000;">&amp;&amp; value.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">e.getValue</span><span style="color: #000000;">()))</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Map.Entry#hashCode()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hashCode</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key.hashCode</span><span style="color: #000000;">() </span><span style="color: #000000;">^ value.hashCode</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.lang.Object#toString()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String toString</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">key + </span><span style="color: #2a00ff;">"=" </span><span style="color: #000000;">+ value;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">HashIterator </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Iterator, Enumeration</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected final </strong></span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab; </span><span style="color: #3f7f5f;">// snapshot of table</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">index; </span><span style="color: #3f7f5f;">// current slot</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Entry entry = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// current node of slot</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object currentKey; </span><span style="color: #3f7f5f;">// key for current node</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object currentValue; </span><span style="color: #3f7f5f;">// value for current node</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Entry lastReturned = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// last node returned by next</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">HashIterator</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// force all segments to synch</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #990000;">0</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">1</span><span style="color: #000000;">; i &lt; segments.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">.synch</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">index = tab.length - </span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Enumeration#hasMoreElements()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">hasMoreElements</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">hasNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Enumeration#nextElement()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object nextElement</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">next</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Iterator#hasNext()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">hasNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">/*</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* currentkey and currentValue are set here to ensure that next()</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* returns normally if hasNext() returns true. This avoids surprises</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* especially when final element is removed during traversal --</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">* instead, we just ignore the removal during current traversal.</span><br />
<span style="color: #ffffff;">       </span><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">Object v = entry.value;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">v != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">currentKey = entry.key;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">currentValue = v;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>else</strong></span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">entry = entry.next;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>while </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; index &gt;= </span><span style="color: #990000;">0</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">entry = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">index--</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">entry == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">currentKey = currentValue = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">entry;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Iterator#next()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Object next</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">currentKey == </span><span style="color: #7f0055;"><strong>null </strong></span><span style="color: #000000;">&amp;&amp; !hasNext</span><span style="color: #000000;">())</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">NoSuchElementException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Object result = returnValueOfNext</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">lastReturned = entry;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">currentKey = currentValue = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">entry = entry.next;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@see </span><span style="color: #3f5fbf;">java.util.Iterator#remove()</span><br />
<span style="color: #ffffff;">     </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">remove</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">lastReturned == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>throw new </strong></span><span style="color: #000000;">IllegalStateException</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ConcurrentHashMap.</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.remove</span><span style="color: #000000;">(</span><span style="color: #000000;">lastReturned.key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">lastReturned = </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">KeyIterator </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HashIterator</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">currentKey;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>protected class </strong></span><span style="color: #000000;">ValueIterator </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HashIterator</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #000000;">Object returnValueOfNext</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">currentValue;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Save the state of the &lt;tt&gt;ConcurrentHashMap&lt;/tt&gt; instance to a stream</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (i.e., serialize it).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">s </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IOException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@serialData </span><span style="color: #3f5fbf;">An estimate of the table size, followed by the key (Object)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             and value (Object) for each key-value mapping, followed by a</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             null pair. The key-value mappings are emitted in no</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*             particular order.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">java.io.ObjectOutputStream s</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IOException</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out the loadfactor, and any hidden stuff</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.defaultWriteObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out capacity estimate. It is OK if this</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// changes during the write, since it is only used by</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// readObject to set initial capacity, to avoid needless resizings.</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #990000;">0</span><span style="color: #000000;">])</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">cap = table.length;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.writeInt</span><span style="color: #000000;">(</span><span style="color: #000000;">cap</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Write out keys and values (alternating)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">k = </span><span style="color: #990000;">0</span><span style="color: #000000;">; k &lt; segments.length; ++k</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Segment seg = segments</span><span style="color: #000000;">[</span><span style="color: #000000;">k</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Entry</span><span style="color: #000000;">[] </span><span style="color: #000000;">tab;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>synchronized </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">seg</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">tab = table;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = k; i &lt; tab.length; i += segments.length</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Entry e = tab</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">]</span><span style="color: #000000;">; e != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">; e = e.next</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">e.key</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #000000;">e.value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.writeObject</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Reconstitute the &lt;tt&gt;ConcurrentHashMap&lt;/tt&gt; instance from a stream</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* (i.e., deserialize it).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">s </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">IOException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@throws </span><span style="color: #3f5fbf;">ClassNotFoundException </span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">readObject</span><span style="color: #000000;">(</span><span style="color: #000000;">java.io.ObjectInputStream s</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">IOException, ClassNotFoundException</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read in the threshold, loadfactor, and any hidden stuff</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">s.defaultReadObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">cap = s.readInt</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">table = newTable</span><span style="color: #000000;">(</span><span style="color: #000000;">cap</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; segments.length; ++i</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">segments</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Segment</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">    </span><span style="color: #3f7f5f;">// Read the keys and values, and put the mappings in the table</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">;;</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object key = s.readObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Object value = s.readObject</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">key == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>break</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">put</span><span style="color: #000000;">(</span><span style="color: #000000;">key, value</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></code><code><code></code><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/a-version-of-hashtable-supporting-concurrency-for-both-retrievals-and-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This program animates a sort algorithm</title>
		<link>http://code.jarplus.com/this-program-animates-a-sort-algorithm/</link>
		<comments>http://code.jarplus.com/this-program-animates-a-sort-algorithm/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:42:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Comparator]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4251</guid>
		<description><![CDATA[*/ import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Rectangle2D; import java.util.Arrays; import java.util.Comparator; import java.util.concurrent.Semaphore; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; /**  * This program animates a sort algorithm.  * @version 1.01 2007-05-18  * @author Cay Horstmann  */ public class AlgorithmAnimation {    public static void main(String[] args)    {       EventQueue.invokeLater(new Runnable()          {             public void run()             {                JFrame frame = new AnimationFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);             }          });    } } /**  * This frame shows the array as it is sorted, together with buttons to single-step the animation or  * to run it without interruption.  */ class AnimationFrame extends JFrame {    public AnimationFrame()    {       ArrayComponent comp = new ArrayComponent();       add(comp, BorderLayout.CENTER);       final Sorter sorter = new Sorter(comp);       JButton runButton = new JButton("Run");       runButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                sorter.setRun();             }          });       JButton stepButton = new JButton("Step"); [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #3f7f5f;">*/</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.BorderLayout;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.EventQueue;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.Graphics;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.Graphics2D;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.event.ActionEvent;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.event.ActionListener;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.awt.geom.Rectangle2D;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Arrays;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Comparator;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.concurrent.Semaphore;</span></p>
<p><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">javax.swing.JButton;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">javax.swing.JComponent;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">javax.swing.JFrame;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">javax.swing.JPanel;</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* This program animates a sort algorithm.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@version </span><span style="color: #3f5fbf;">1.01 2007-05-18</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@author </span><span style="color: #3f5fbf;">Cay Horstmann</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">AlgorithmAnimation</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public static </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">main</span><span style="color: #000000;">(</span><span style="color: #000000;">String</span><span style="color: #000000;">[] </span><span style="color: #000000;">args</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">EventQueue.invokeLater</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Runnable</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">run</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">JFrame frame = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">AnimationFrame</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">frame.setDefaultCloseOperation</span><span style="color: #000000;">(</span><span style="color: #000000;">JFrame.EXIT_ON_CLOSE</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">frame.setVisible</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* This frame shows the array as it is sorted, together with buttons to single-step the animation or</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* to run it without interruption.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>class </strong></span><span style="color: #000000;">AnimationFrame </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">JFrame</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">AnimationFrame</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">ArrayComponent comp = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ArrayComponent</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">add</span><span style="color: #000000;">(</span><span style="color: #000000;">comp, BorderLayout.CENTER</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>final </strong></span><span style="color: #000000;">Sorter sorter = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Sorter</span><span style="color: #000000;">(</span><span style="color: #000000;">comp</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">JButton runButton = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">JButton</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Run"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">runButton.addActionListener</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ActionListener</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">actionPerformed</span><span style="color: #000000;">(</span><span style="color: #000000;">ActionEvent event</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">sorter.setRun</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">JButton stepButton = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">JButton</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Step"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">stepButton.addActionListener</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ActionListener</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">actionPerformed</span><span style="color: #000000;">(</span><span style="color: #000000;">ActionEvent event</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">sorter.setStep</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">})</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">JPanel buttons = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">JPanel</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">buttons.add</span><span style="color: #000000;">(</span><span style="color: #000000;">runButton</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">buttons.add</span><span style="color: #000000;">(</span><span style="color: #000000;">stepButton</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">add</span><span style="color: #000000;">(</span><span style="color: #000000;">buttons, BorderLayout.NORTH</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">setSize</span><span style="color: #000000;">(</span><span style="color: #000000;">DEFAULT_WIDTH, DEFAULT_HEIGHT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">      </span><span style="color: #000000;">Thread t = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Thread</span><span style="color: #000000;">(</span><span style="color: #000000;">sorter</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">t.start</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">DEFAULT_WIDTH = </span><span style="color: #990000;">300</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">DEFAULT_HEIGHT = </span><span style="color: #990000;">300</span><span style="color: #000000;">;</span><br />
<span style="color: #000000;">}</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* This runnable executes a sort algorithm. When two elements are compared, the algorithm pauses and</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* updates a component.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>class </strong></span><span style="color: #000000;">Sorter </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Runnable</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Constructs a Sorter.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">values the array to be sorted</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">comp the component on which to display the sorting progress</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">Sorter</span><span style="color: #000000;">(</span><span style="color: #000000;">ArrayComponent comp</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">values = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Double</span><span style="color: #000000;">[</span><span style="color: #000000;">VALUES_LENGTH</span><span style="color: #000000;">]</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; values.length; i++</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">values</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Double</span><span style="color: #000000;">(</span><span style="color: #000000;">Math.random</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.component = comp;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.gate = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Semaphore</span><span style="color: #000000;">(</span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.run = </span><span style="color: #7f0055;"><strong>false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Sets the sorter to "run" mode. Called on the event dispatch thread.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setRun</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">run = </span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">gate.release</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Sets the sorter to "step" mode. Called on the event dispatch thread.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setStep</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">run = </span><span style="color: #7f0055;"><strong>false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">gate.release</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">run</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Comparator&lt;Double&gt; comp = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Comparator&lt;Double&gt;</span><span style="color: #000000;">()</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">            </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">compare</span><span style="color: #000000;">(</span><span style="color: #000000;">Double i1, Double i2</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">component.setValues</span><span style="color: #000000;">(</span><span style="color: #000000;">values, i1, i2</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">               </span><span style="color: #7f0055;"><strong>try</strong></span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                  </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">run</span><span style="color: #000000;">) </span><span style="color: #000000;">Thread.sleep</span><span style="color: #000000;">(</span><span style="color: #000000;">DELAY</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">                  </span><span style="color: #7f0055;"><strong>else </strong></span><span style="color: #000000;">gate.acquire</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">               </span><span style="color: #7f0055;"><strong>catch </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">InterruptedException exception</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">                  </span><span style="color: #000000;">Thread.currentThread</span><span style="color: #000000;">()</span><span style="color: #000000;">.interrupt</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">               </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">               </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">i1.compareTo</span><span style="color: #000000;">(</span><span style="color: #000000;">i2</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">            </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">}</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Arrays.sort</span><span style="color: #000000;">(</span><span style="color: #000000;">values, comp</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">component.setValues</span><span style="color: #000000;">(</span><span style="color: #000000;">values, null, </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Double</span><span style="color: #000000;">[] </span><span style="color: #000000;">values;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">ArrayComponent component;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Semaphore gate;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">DELAY = </span><span style="color: #990000;">100</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private volatile </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">run;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">VALUES_LENGTH = </span><span style="color: #990000;">30</span><span style="color: #000000;">;</span><br />
<span style="color: #000000;">}</span></p>
<p><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">* This component draws an array and marks two elements in the array.</span><br />
<span style="color: #ffffff;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>class </strong></span><span style="color: #000000;">ArrayComponent </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">JComponent</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* Sets the values to be painted. Called on the sorter thread.</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">values the array of values to display</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">marked1 the first marked element</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">marked2 the second marked element</span><br />
<span style="color: #ffffff;">    </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setValues</span><span style="color: #000000;">(</span><span style="color: #000000;">Double</span><span style="color: #000000;">[] </span><span style="color: #000000;">values, Double marked1, Double marked2</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.values = values.clone</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.marked1 = marked1;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.marked2 = marked2;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">repaint</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>public synchronized </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">paintComponent</span><span style="color: #000000;">(</span><span style="color: #000000;">Graphics g</span><span style="color: #000000;">) </span><span style="color: #3f7f5f;">// Called on the event dispatch thread</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">values == </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>return</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">Graphics2D g2 = </span><span style="color: #000000;">(</span><span style="color: #000000;">Graphics2D</span><span style="color: #000000;">) </span><span style="color: #000000;">g;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">width = getWidth</span><span style="color: #000000;">() </span><span style="color: #000000;">/ values.length;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; values.length; i++</span><span style="color: #000000;">)</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">         </span><span style="color: #7f0055;"><strong>double </strong></span><span style="color: #000000;">height = values</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">* getHeight</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">         </span><span style="color: #000000;">Rectangle2D bar = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">Rectangle2D.Double</span><span style="color: #000000;">(</span><span style="color: #000000;">width * i, </span><span style="color: #990000;">0</span><span style="color: #000000;">, width, height</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">         </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">values</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">== marked1 || values</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">] </span><span style="color: #000000;">== marked2</span><span style="color: #000000;">) </span><span style="color: #000000;">g2.fill</span><span style="color: #000000;">(</span><span style="color: #000000;">bar</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">         </span><span style="color: #7f0055;"><strong>else </strong></span><span style="color: #000000;">g2.draw</span><span style="color: #000000;">(</span><span style="color: #000000;">bar</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">   </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Double marked1;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Double marked2;</span><br />
<span style="color: #ffffff;">   </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">Double</span><span style="color: #000000;">[] </span><span style="color: #000000;">values;</span><br />
<span style="color: #000000;">}</span></code></p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/this-program-animates-a-sort-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Invertible Comparator</title>
		<link>http://code.jarplus.com/invertible-comparator/</link>
		<comments>http://code.jarplus.com/invertible-comparator/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 18:41:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Comparator]]></category>

		<guid isPermaLink="false">http://code.jarplus.com/?p=4249</guid>
		<description><![CDATA[import java.io.Serializable; import java.util.Comparator; */ public class InvertibleComparator implements Comparator, Serializable {   private final Comparator comparator;   private boolean ascending = true;   /**    * Create an InvertibleComparator that sorts ascending by default.    * For the actual comparison, the specified Comparator will be used.    * @param comparator the comparator to decorate    */   public InvertibleComparator(Comparator comparator) {     this.comparator = comparator;   }   /**    * Create an InvertibleComparator that sorts based on the provided order.    * For the actual comparison, the specified Comparator will be used.    * @param comparator the comparator to decorate    * @param ascending the sort order: ascending (true) or descending (false)    */   public InvertibleComparator(Comparator comparator, boolean ascending) {     this.comparator = comparator;     setAscending(ascending);   }   /**    * Specify the sort order: ascending (true) or descending (false).    */   public void setAscending(boolean ascending) {     this.ascending = ascending;   }   /**    * Return the sort order: ascending (true) or descending (false).    */   public boolean isAscending() {     return ascending;   }   /**    * Invert the sort order: ascending -&#62; descending or    * descending -&#62; ascending.    */   public void invertOrder() {     this.ascending = !this.ascending;   }   public int compare(Object o1, Object o2) {     int result = this.comparator.compare(o1, o2);     if (result != 0) {       // Invert the order if it is a reverse sort.       if (!this.ascending) {         if (Integer.MIN_VALUE == result) {           result = Integer.MAX_VALUE;         }         else {           result *= -1;         }       } [...]]]></description>
			<content:encoded><![CDATA[<p><code><span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.io.Serializable;</span><br />
<span style="color: #7f0055;"><strong>import </strong></span><span style="color: #000000;">java.util.Comparator;</span></code></p>
<p><code><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">InvertibleComparator </span><span style="color: #7f0055;"><strong>implements </strong></span><span style="color: #000000;">Comparator, Serializable </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private final </strong></span><span style="color: #000000;">Comparator comparator;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">ascending = </span><span style="color: #7f0055;"><strong>true</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Create an InvertibleComparator that sorts ascending by default.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* For the actual comparison, the specified Comparator will be used.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">comparator the comparator to decorate</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">InvertibleComparator</span><span style="color: #000000;">(</span><span style="color: #000000;">Comparator comparator</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.comparator = comparator;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Create an InvertibleComparator that sorts based on the provided order.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* For the actual comparison, the specified Comparator will be used.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">comparator the comparator to decorate</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@param </span><span style="color: #3f5fbf;">ascending the sort order: ascending (true) or descending (false)</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">InvertibleComparator</span><span style="color: #000000;">(</span><span style="color: #000000;">Comparator comparator, </span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">ascending</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.comparator = comparator;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">setAscending</span><span style="color: #000000;">(</span><span style="color: #000000;">ascending</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Specify the sort order: ascending (true) or descending (false).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">setAscending</span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">ascending</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending = ascending;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Return the sort order: ascending (true) or descending (false).</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">isAscending</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">ascending;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #3f5fbf;">/**</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* Invert the sort order: ascending -&gt; descending or</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">* descending -&gt; ascending.</span><br />
<span style="color: #ffffff;">   </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">invertOrder</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending = !</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">compare</span><span style="color: #000000;">(</span><span style="color: #000000;">Object o1, Object o2</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">result = </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.comparator.compare</span><span style="color: #000000;">(</span><span style="color: #000000;">o1, o2</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">result != </span><span style="color: #990000;">0</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #3f7f5f;">// Invert the order if it is a reverse sort.</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Integer.MIN_VALUE == result</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">result = Integer.MAX_VALUE;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">        </span><span style="color: #7f0055;"><strong>else </strong></span><span style="color: #000000;">{</span><br />
<span style="color: #ffffff;">          </span><span style="color: #000000;">result *= -</span><span style="color: #990000;">1</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">        </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">result;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #990000;">0</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>boolean </strong></span><span style="color: #000000;">equals</span><span style="color: #000000;">(</span><span style="color: #000000;">Object obj</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this </strong></span><span style="color: #000000;">== obj</span><span style="color: #000000;">) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>if </strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">obj </span><span style="color: #7f0055;"><strong>instanceof </strong></span><span style="color: #000000;">InvertibleComparator</span><span style="color: #000000;">)) {</span><br />
<span style="color: #ffffff;">      </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">}</span><br />
<span style="color: #ffffff;">    </span><span style="color: #000000;">InvertibleComparator other = </span><span style="color: #000000;">(</span><span style="color: #000000;">InvertibleComparator</span><span style="color: #000000;">) </span><span style="color: #000000;">obj;</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.comparator.equals</span><span style="color: #000000;">(</span><span style="color: #000000;">other.comparator</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp;&amp; </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending == other.ascending</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">hashCode</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return this</strong></span><span style="color: #000000;">.comparator.hashCode</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;">  </span><span style="color: #7f0055;"><strong>public </strong></span><span style="color: #000000;">String toString</span><span style="color: #000000;">() {</span><br />
<span style="color: #ffffff;">    </span><span style="color: #7f0055;"><strong>return </strong></span><span style="color: #2a00ff;">"InvertibleComparator: [" </span><span style="color: #000000;">+ </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.comparator + </span><span style="color: #2a00ff;">"]; ascending=" </span><span style="color: #000000;">+ </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.ascending;</span><br />
<span style="color: #ffffff;">  </span><span style="color: #000000;">}</span></p>
<p><span style="color: #000000;">}</span></code><code></code></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://code.jarplus.com/invertible-comparator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

