Jekyll2016-12-16T04:41:24+00:00https://sonnyit.github.io/java//&lt; s o n n y &gt;Where I note some things I have read&lt; s o n n y &gt;Java Inner Classes2016-07-20T00:00:00+00:002016-07-20T00:00:00+00:00https://sonnyit.github.io/java/java-basic/jb-inner-classes<h3 id="tables">Tables</h3> <ul> <li><a href="#nested-classes-10548tables">Nested classes</a></li> <li><a href="#syntax-10548tables">Syntax</a></li> <li><a href="#inner-classes-non-static-nested-classes-10548tables">Inner Classes (Non-static Nested Classes)</a> <ul> <li><a href="#member-inner-class-10548tables">Member Inner Class</a></li> <li><a href="#method-local-inner-class-10548tables">Method-local Inner Class</a></li> <li><a href="#anonymous-inner-class-10548tables">Anonymous Inner Class</a></li> </ul> </li> <li><a href="#static-nested-class-10548tables">Static Nested Class</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="nested-classes-10548tables">Nested classes <a href="#tables">⤴</a></h2> <p>In Java, just like methods, variables of a class too can have another class as its member. Writing a class within another is allowed in Java. The class written within is called the <strong>nested class</strong>, and the class that holds the inner class is called the <strong>outer class</strong>.</p> <h2 id="syntax-10548tables">Syntax <a href="#tables">⤴</a></h2> <p>The syntax to write a nested class is given below. Here the class Outer_Demo is the outer class and the class Inner_Demo is the nested class.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Outer_Demo</span><span class="o">{</span> <span class="kd">class</span> <span class="nc">Nested_Demo</span><span class="o">{</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Nested classes are divided into two types:</p> <ol> <li><strong>Non-static nested classes:</strong> These are the non-static members of a class.</li> <li><strong>Static nested classes:</strong> These are the static members of a class.</li> </ol> <p><img src="http://www.tutorialspoint.com/java/images/inner_classes.jpg" alt="inner_classes" /></p> <h2 id="inner-classes-non-static-nested-classes-10548tables">Inner Classes (Non-static Nested Classes) <a href="#tables">⤴</a></h2> <p>Inner classes are a security mechanism in Java. We know a class cannot be associated with the access modifier private, but if we have the class as a member of other class, then the inner class can be made private. And this is also used to access the private members of a class.</p> <p>Inner classes are of three types depending on how and where you define them. They are:</p> <ol> <li>Member Inner Class</li> <li>Method-local Inner Classlass</li> <li>Anonymous Inner Class</li> </ol> <h3 id="member-inner-class-10548tables">Member Inner Class <a href="#tables">⤴</a></h3> <p>Creating an inner class is quite simple, just need to write a class within a class.</p> <p>Unlike a class, an inner class can be private and once you declare an inner class private, it cannot be accessed from an object outside the class.</p> <p>Given below is the program to create an inner class and access it. In the given example, we make the inner class private and access the class through a method.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Outer_Demo</span><span class="o">{</span> <span class="kt">int</span> <span class="n">num</span><span class="o">;</span> <span class="c1">//inner class</span> <span class="kd">private</span> <span class="kd">class</span> <span class="nc">Inner_Demo</span><span class="o">{</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">print</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"This is an inner class"</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="c1">//Accessing he inner class from the method within</span> <span class="kt">void</span> <span class="nf">display_Inner</span><span class="o">(){</span> <span class="n">Inner_Demo</span> <span class="n">inner</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Inner_Demo</span><span class="o">();</span> <span class="n">inner</span><span class="o">.</span><span class="na">print</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">My_class</span><span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="c1">//Instantiating the outer class </span> <span class="n">Outer_Demo</span> <span class="n">outer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Outer_Demo</span><span class="o">();</span> <span class="c1">//Accessing the display_Inner() method.</span> <span class="n">outer</span><span class="o">.</span><span class="na">display_Inner</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>This is an inner class. </code></pre> </div> <h4 id="accessing-the-private-members-10548tables">Accessing the Private members <a href="#tables">⤴</a></h4> <p>Inner classes are also used to access the private members of a class.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Outer_Demo</span> <span class="o">{</span> <span class="c1">//private variable of the outer class</span> <span class="kd">private</span> <span class="kt">int</span> <span class="n">num</span><span class="o">=</span> <span class="mi">175</span><span class="o">;</span> <span class="c1">//inner class </span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Inner_Demo</span><span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">getNum</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"This is the getnum method of the inner class"</span><span class="o">);</span> <span class="k">return</span> <span class="n">num</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">My_class2</span><span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="c1">//Instantiating the outer class</span> <span class="n">Outer_Demo</span> <span class="n">outer</span><span class="o">=</span><span class="k">new</span> <span class="n">Outer_Demo</span><span class="o">();</span> <span class="c1">//Instantiating the inner class</span> <span class="n">Outer_Demo</span><span class="o">.</span><span class="na">Inner_Demo</span> <span class="n">inner</span><span class="o">=</span><span class="n">outer</span><span class="o">.</span><span class="na">new</span> <span class="nf">Inner_Demo</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">inner</span><span class="o">.</span><span class="na">getNum</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>The value of num <span class="k">in </span>the class Test is: 175 </code></pre> </div> <h3 id="method-local-inner-class-10548tables">Method-local Inner Class <a href="#tables">⤴</a></h3> <p>In Java, we can write a class within a method and this will be a local type. Like local variables, the scope of the inner class is restricted within the method.</p> <p>A method-local inner class can be instantiated only within the method where the inner class is defined. The following program shows how to use a method-local inner class.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Outerclass</span><span class="o">{</span> <span class="c1">//instance method of the outer class </span> <span class="kt">void</span> <span class="nf">my_Method</span><span class="o">(){</span> <span class="kt">int</span> <span class="n">num</span> <span class="o">=</span> <span class="mi">23</span><span class="o">;</span> <span class="c1">//method-local inner class</span> <span class="kd">class</span> <span class="nc">MethodInner_Demo</span><span class="o">{</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">print</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"This is method inner class "</span><span class="o">+</span><span class="n">num</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span><span class="c1">//end of inner class</span> <span class="c1">//Accessing the inner class</span> <span class="n">MethodInner_Demo</span> <span class="n">inner</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MethodInner_Demo</span><span class="o">();</span> <span class="n">inner</span><span class="o">.</span><span class="na">print</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="n">Outerclass</span> <span class="n">outer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Outerclass</span><span class="o">();</span> <span class="n">outer</span><span class="o">.</span><span class="na">my_Method</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>This is method inner class 23 </code></pre> </div> <h3 id="anonymous-inner-class-10548tables">Anonymous Inner Class <a href="#tables">⤴</a></h3> <p>An inner class declared without a class name is known as an anonymous inner class. In case of anonymous inner classes, we declare and instantiate them at the same time. Generally they are used whenever you need to override the method of a class or an interface. The syntax of an anonymous inner class is as follows:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">AnonymousInner</span> <span class="n">an_inner</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AnonymousInner</span><span class="o">(){</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">my_method</span><span class="o">(){</span> <span class="o">........</span> <span class="o">........</span> <span class="o">}</span> <span class="o">};</span> </code></pre> </div> <p>The following program shows how to override the method of a class using anonymous inner class.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">AnonymousInner</span><span class="o">{</span> <span class="kd">public</span> <span class="kd">abstract</span> <span class="kt">void</span> <span class="nf">mymethod</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Outer_class</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="n">AnonymousInner</span> <span class="n">inner</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AnonymousInner</span><span class="o">(){</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">mymethod</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"This is an example of anonymous inner class"</span><span class="o">);</span> <span class="o">}</span> <span class="o">};</span> <span class="n">inner</span><span class="o">.</span><span class="na">mymethod</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>If you compile and execute the above program, you will get the following result.</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>This is an example of anonymous inner class </code></pre> </div> <p>In the same way, you can override the methods of the concrete class as well as the interface using an anonymous inner class.</p> <h3 id="anonymous-inner-class-as-argument-10548tables">Anonymous Inner Class as Argument <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="c1">//interface</span> <span class="kd">interface</span> <span class="nc">Message</span><span class="o">{</span> <span class="n">String</span> <span class="nf">greet</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">My_class</span> <span class="o">{</span> <span class="c1">//method which accepts the object of interface Message</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">displayMessage</span><span class="o">(</span><span class="n">Message</span> <span class="n">m</span><span class="o">){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">m</span><span class="o">.</span><span class="na">greet</span><span class="o">()</span> <span class="o">+</span><span class="s">", This is an example of anonymous inner class as an argument"</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="c1">//Instantiating the class</span> <span class="n">My_class</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">My_class</span><span class="o">();</span> <span class="c1">//Passing an anonymous inner class as an argument</span> <span class="n">obj</span><span class="o">.</span><span class="na">displayMessage</span><span class="o">(</span><span class="k">new</span> <span class="n">Message</span><span class="o">(){</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">greet</span><span class="o">(){</span> <span class="k">return</span> <span class="s">"Hello"</span><span class="o">;</span> <span class="o">}</span> <span class="o">});</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>Hello This is an example of anonymous inner class as an argument </code></pre> </div> <h2 id="static-nested-class-10548tables">Static Nested Class <a href="#tables">⤴</a></h2> <p>A static inner class is a nested class which is a static member of the outer class. It can be accessed without instantiating the outer class, using other static members. Just like static members, a static nested class does not have access to the instance variables and methods of the outer class. The syntax of static nested class is as follows:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">MyOuter</span> <span class="o">{</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">Nested_Demo</span><span class="o">{</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Instantiating a static nested class is a bit different from instantiating an inner class. The following program shows how to use a static nested class.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Outer</span><span class="o">{</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">Nested_Demo</span><span class="o">{</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">my_method</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"This is my nested class"</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[]){</span> <span class="n">Outer</span><span class="o">.</span><span class="na">Nested_Demo</span> <span class="n">nested</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Outer</span><span class="o">.</span><span class="na">Nested_Demo</span><span class="o">();</span> <span class="n">nested</span><span class="o">.</span><span class="na">my_method</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>This is my nested class </code></pre> </div> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.tutorialspoint.com/java/java_innerclasses.htm">tutorialspoint-innerclasses</a></li> </ul>&lt; s o n n y &gt;TablesJava Assert, Static Block, Initializer Block2016-07-20T00:00:00+00:002016-07-20T00:00:00+00:00https://sonnyit.github.io/java/java-basic/jb-assert<h3 id="tables">Tables</h3> <ul> <li><a href="#assertion-10548tables">Assertion</a> <ul> <li><a href="#advantage-of-assertion-10548tables">Advantage of Assertion</a></li> <li><a href="#syntax-of-using-assertion-10548tables">Syntax of using Assertion</a></li> <li><a href="#where-not-to-use-assertion-10548tables">Where not to use Assertion</a></li> <li><a href="#note-10548tables">Note</a></li> </ul> </li> <li><a href="#static-block-10548tables">Static block</a></li> <li><a href="#initializer-block-10548tables">Initializer block</a></li> <li><a href="#References-10548tables">References</a></li> </ul> <h2 id="assertion-10548tables">Assertion <a href="#tables">⤴</a></h2> <p>Assertion is a statement in java. It can be used to test your assumptions about the program.</p> <p>While executing assertion, it is believed to be true. If it fails, JVM will throw an error named <strong>AssertionError</strong>. It is mainly used for testing purpose.</p> <h3 id="advantage-of-assertion-10548tables">Advantage of Assertion <a href="#tables">⤴</a></h3> <p>It provides an effective way to detect and correct programming errors.</p> <h3 id="syntax-of-using-assertion-10548tables">Syntax of using Assertion <a href="#tables">⤴</a></h3> <p>There are two ways to use assertion. First way is:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="k">assert</span> <span class="n">booleanExpression</span><span class="o">;</span> </code></pre> </div> <p>and second way is:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="k">assert</span> <span class="n">booleanExpression</span> <span class="o">:</span> <span class="n">errorMessage</span><span class="o">;</span> </code></pre> </div> <p><strong>Note:</strong> booleanExpression, so that expression must return an boolean.</p> <h3 id="where-not-to-use-assertion-10548tables">Where not to use Assertion <a href="#tables">⤴</a></h3> <ol> <li>According to Sun Specification, assertion should not be used to check arguments in the public methods because it should result in appropriate runtime exception e.g. IllegalArgumentException, NullPointerException etc.</li> <li>Do not use assertion, if you don’t want any error in any situation.</li> </ol> <h3 id="note-10548tables">Note <a href="#tables">⤴</a></h3> <ul> <li>Assert statements should not cause side effects (mean should not change value of variable in assert statement).</li> </ul> <h2 id="static-block-10548tables">Static block <a href="#tables">⤴</a></h2> <p>Unlike C++, Java supports a special block, called static block (also called static clause) which can be used for <strong>static initializations</strong> of a class.</p> <p>This code inside static block is executed <strong>only once</strong>: the first time you make an object of that class or the first time you access a static member of that class (even if you never make an object of that class). For example, check output of following Java program.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="c1">// filename: Main.java</span> <span class="kd">class</span> <span class="nc">Test</span> <span class="o">{</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">i</span><span class="o">;</span> <span class="kt">int</span> <span class="n">j</span><span class="o">;</span> <span class="c1">// start of static block </span> <span class="kd">static</span> <span class="o">{</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"static block called "</span><span class="o">);</span> <span class="o">}</span> <span class="c1">// end of static block </span> <span class="o">}</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span> <span class="c1">// Although we don't have an object of Test, static block is </span> <span class="c1">// called because i is being accessed in following statement.</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">Test</span><span class="o">.</span><span class="na">i</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>static block called 10 </code></pre> </div> <p>Also, static blocks are executed before constructors. For example, check output of following Java program.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="c1">// filename: Main.java</span> <span class="kd">class</span> <span class="nc">Test</span> <span class="o">{</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">i</span><span class="o">;</span> <span class="kt">int</span> <span class="n">j</span><span class="o">;</span> <span class="kd">static</span> <span class="o">{</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"static block called "</span><span class="o">);</span> <span class="o">}</span> <span class="n">Test</span><span class="o">(){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Constructor called"</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span> <span class="c1">// Although we have two objects, static block is executed only once.</span> <span class="n">Test</span> <span class="n">t1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Test</span><span class="o">();</span> <span class="n">Test</span> <span class="n">t2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Test</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>static block called Constructor called Constructor called </code></pre> </div> <h3 id="what-if-we-want-to-execute-some-code-for-every-object">What if we want to execute some code for every object?</h3> <p>We use <a href="#initializer-block-10548tables">Initializer Block in Java</a></p> <h2 id="initializer-block-10548tables">Initializer block <a href="#tables">⤴</a></h2> <p><strong>Initializer block</strong> contains the code that is <strong>always executed whenever an instance is created</strong>.</p> <p>It is used to declare/initialize the common part of various constructors of a class. For example,</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.io.*</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">GFG</span> <span class="o">{</span> <span class="c1">// Initializer block starts..</span> <span class="o">{</span> <span class="c1">// This code is executed before every constructor.</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Common part of constructors invoked !!"</span><span class="o">);</span> <span class="o">}</span> <span class="c1">// Initializer block ends</span> <span class="kd">public</span> <span class="nf">GFG</span><span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Default Constructor invoked"</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="nf">GFG</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Parametrized constructor invoked"</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">arr</span><span class="o">[])</span> <span class="o">{</span> <span class="n">GFG</span> <span class="n">obj1</span><span class="o">,</span> <span class="n">obj2</span><span class="o">;</span> <span class="n">obj1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GFG</span><span class="o">();</span> <span class="n">obj2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GFG</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>Common part of constructors invoked!! Default Constructor invoked Common part of constructors invoked!! Parametrized constructor invoked </code></pre> </div> <p>We can note that the contents of initializer block are executed whenever any constructor is invoked (before the constructor’s contents)</p> <p>The order of initialization constructors and initializer block doesn’t matter, initializer block is always executed before constructor.</p> <h3 id="what-if-we-want-to-execute-some-code-once-for-all-objects-of-a-class">What if we want to execute some code once for all objects of a class?</h3> <p>We use <a href="#static-block-10548tables">Static Block in Java</a></p> <h2 id="java-integer-to-string-examples">Java Integer To String Examples</h2> <ul> <li>Convert using Integer.toString(int)</li> <li>Convert using String.valueOf(int)</li> <li>Convert using new Integer(int).toString()</li> <li>Convert using String.format()</li> <li>Convert using DecimalFormat</li> <li>Convert using StringBuffer or StringBuilder</li> <li>Quick Solution: + “”</li> <li>Convert with special radix (not base 10 system)</li> </ul> <p><a href="http://javadevnotes.com/java-integer-to-string-examples">detail</a></p> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.javatpoint.com/assertion-in-java">javatpoint-assertion</a></li> <li><a href="http://www.geeksforgeeks.org/g-fact-79/">geeksforgeeks-static-block</a></li> <li><a href="http://www.geeksforgeeks.org/g-fact-26-the-initializer-block-in-java/">geeksforgeeks-initializer-block</a></li> </ul>&lt; s o n n y &gt;TablesJava Multithreading2016-07-19T00:00:00+00:002016-07-19T00:00:00+00:00https://sonnyit.github.io/java/java-advance/ja-java-multithreading<h3 id="tables">Tables</h3> <ul> <li><a href="#introduction-10548tables">Introduction</a> <ul> <li><a href="#thread-vs-process-in-java-10548tables">Thread vs Process in Java</a></li> <li><a href="#multitasking-vs-multithreading-vs-multiprocessing-vs-parallel-processing-10548tables">Multitasking vs Multithreading vs Multiprocessing vs parallel processing</a></li> </ul> </li> <li><a href="#life-cycle-of-a-thread-10548tables">Life cycle of a Thread</a></li> <li><a href="#thread-priorities-10548tables">Thread priorities</a></li> <li><a href="#create-a-thread-in-java-10548tables">Create a thread in Java</a> <ul> <li><a href="#thread-creation-by-extending-thread-class-10548tables">Thread creation by extending Thread class</a></li> <li><a href="#thread-creation-by-implementing-runable-interface-10548tables">Thread creation by implementing Runable Interface</a></li> </ul> </li> <li><a href="#method-isalive-and-join-10548tables">Method: isAlive() and join()</a></li> <li><a href="#synchronization-10548tables">Synchronization</a></li> <li><a href="#inter-thread-communication-10548tables">Inter-thread Communication</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="introduction-10548tables">Introduction <a href="#tables">⤴</a></h2> <h3 id="thread-vs-process-in-java-10548tables">Thread vs Process in Java <a href="#tables">⤴</a></h3> <ol> <li>Both process and Thread are independent path of execution but one process can have multiple Threads.</li> <li>Every process has its own memory space, executable code and a unique process identifier (PID) while every thread has its own stack in Java but it uses process main memory and share it with other threads.</li> <li>Threads are also refereed as task or light weight process (LWP) in operating system.</li> <li>Threads from same process can communicate with each other by using Programming language construct like <a href="http://javarevisited.blogspot.sg/2011/05/wait-notify-and-notifyall-in-java.html">wait and notify in Java</a> and much simpler than inter process communication.</li> <li>Another difference between Process and Thread in Java is: how Thread and process are created. It’s easy to create Thread as compared to Process which requires duplication of parent process.</li> <li>All Threads which is part of same process share system resource like file descriptors, Heap Memory and other resource but each Thread has its own Exception handler and own stack in Java.</li> </ol> <h3 id="multitasking-vs-multithreading-vs-multiprocessing-vs-parallel-processing-10548tables">Multitasking vs Multithreading vs Multiprocessing vs parallel processing <a href="#tables">⤴</a></h3> <ul> <li><strong>Multitasking:</strong> Ability to execute more than one task at the same time is known as multitasking.</li> <li><strong>Multithreading:</strong> It is a process of executing multiple threads simultaneously. Multithreading is also known as Thread-based Multitasking.</li> <li><strong>Multiprocessing:</strong> It is same as multitasking, however in multiprocessing more than one CPUs are involved. On the other hand one CPU is involved in multitasking.</li> <li><strong>Parallel Processing:</strong> It refers to the utilization of multiple CPUs in a single computer system.</li> </ul> <h2 id="life-cycle-of-a-thread-10548tables">Life cycle of a Thread <a href="#tables">⤴</a></h2> <p>A thread goes through various stages in its life cycle. For example, a thread is born, started, runs, and then dies. Following diagram shows complete life cycle of a thread.</p> <p><img src="http://www.tutorialspoint.com/java/images/Thread_Life_Cycle.jpg" alt="thread-life-cycle" /></p> <p>A thread can be in one of the following states:</p> <ul> <li><strong>New:</strong> A new thread begins its life cycle in the new state. It remains in this state until the program starts the thread. It is also referred to as a born thread.</li> <li><strong>Runnable:</strong> After a newly born thread is started, the thread becomes runnable. A thread in this state is considered to be executing its task.</li> <li><strong>Waiting:</strong> Sometimes, a thread transitions to the waiting state while the thread waits for another thread to perform a task.A thread transitions back to the runnable state only when another thread signals the waiting thread to continue executing.</li> <li><strong>Timed waiting:</strong> A runnable thread can enter the timed waiting state for a specified interval of time. A thread in this state transitions back to the runnable state when that time interval expires or when the event it is waiting for occurs.</li> <li><strong>Terminated ( Dead ):</strong> A runnable thread enters the terminated state when it completes its task or otherwise terminates.</li> </ul> <h2 id="thread-priorities-10548tables">Thread priorities <a href="#tables">⤴</a></h2> <p>Every Java thread has a priority that helps the operating system determine the order in which threads are scheduled.</p> <p>Java thread priorities are in the range between MIN_PRIORITY (a constant of 1) and MAX_PRIORITY (a constant of 10). By default, every thread is given priority NORM_PRIORITY (a constant of 5).</p> <p>Threads with higher priority are more important to a program and should be allocated processor time before lower-priority threads. However, thread priorities cannot guarantee the order in which threads execute and very much platform dependent.</p> <p>To set the priority of the thread setPriority() method is used which is a method of the class Thread Class.</p> <h2 id="create-a-thread-in-java-10548tables">Create a thread in Java <a href="#tables">⤴</a></h2> <p>There are two ways to create a thread in Java:</p> <ol> <li>By extending Thread class.</li> <li>By implementing Runnable interface.</li> </ol> <p>Before we begin with the programs(code) of creating threads, let’s have a look at these methods of Thread class. We have used few of these methods in the example below.</p> <ul> <li>getName(): It is used for Obtaining a thread’s name</li> <li>getPriority(): Obtain a thread’s priority</li> <li>isAlive(): Determine if a thread is still running</li> <li>join(): Wait for a thread to terminate</li> <li>run(): Entry point for the thread. The join() method must be place in a try catch block</li> <li>sleep(): suspend a thread for a period of time</li> <li>start(): start a thread by calling its run() method</li> </ul> <h3 id="thread-creation-by-extending-thread-class-10548tables">Thread creation by extending Thread class <a href="#tables">⤴</a></h3> <h4 id="step-1">Step 1</h4> <p>You will need to override <strong>run( )</strong> method available in Thread class. This method provides entry point for the thread and you will put you complete business logic inside this method. Following is simple syntax of <strong>run()</strong> method:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span> <span class="o">)</span> </code></pre> </div> <h4 id="step-2">Step 2</h4> <p>Once Thread object is created, you can start it by calling <strong>start( )</strong> method, which executes a call to <strong>run( )</strong> method. Following is simple syntax of <strong>start()</strong> method:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">start</span><span class="o">(</span> <span class="o">);</span> </code></pre> </div> <h4 id="example">Example</h4> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">ThreadDemo</span> <span class="kd">extends</span> <span class="n">Thread</span> <span class="o">{</span> <span class="kd">private</span> <span class="n">Thread</span> <span class="n">t</span><span class="o">;</span> <span class="kd">private</span> <span class="n">String</span> <span class="n">threadName</span><span class="o">;</span> <span class="n">ThreadDemo</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">){</span> <span class="n">threadName</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Creating "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Running "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="k">try</span> <span class="o">{</span> <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">--)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread: "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">", "</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span> <span class="c1">// Let the thread sleep for a while.</span> <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">50</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">" interrupted."</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">" exiting."</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">start</span> <span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Starting "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">t</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span> <span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">threadName</span><span class="o">);</span> <span class="n">t</span><span class="o">.</span><span class="na">start</span> <span class="o">();</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestThread</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span> <span class="n">ThreadDemo</span> <span class="n">T1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ThreadDemo</span><span class="o">(</span><span class="s">"Thread-1"</span><span class="o">);</span> <span class="n">T1</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">ThreadDemo</span> <span class="n">T2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ThreadDemo</span><span class="o">(</span><span class="s">"Thread-2"</span><span class="o">);</span> <span class="n">T2</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>Creating Thread-1 Starting Thread-1 Creating Thread-2 Starting Thread-2 Running Thread-1 Thread: Thread-1, 4 Running Thread-2 Thread: Thread-2, 4 Thread: Thread-1, 3 Thread: Thread-2, 3 Thread: Thread-1, 2 Thread: Thread-2, 2 Thread: Thread-1, 1 Thread: Thread-2, 1 Thread Thread-1 exiting. Thread Thread-2 exiting. </code></pre> </div> <h3 id="thread-creation-by-implementing-runable-interface-10548tables">Thread creation by implementing Runable Interface <a href="#tables">⤴</a></h3> <h4 id="step-1-1">Step 1</h4> <p>As a first step you need to implement a <strong>run()</strong> method provided by Runnable interface. This method provides entry point for the thread and you will put you complete business logic inside this method. Following is simple syntax of <strong>run()</strong> method:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span> <span class="o">)</span> </code></pre> </div> <h4 id="step-2-1">Step 2</h4> <p>At second step you will instantiate a Thread object using the following constructor:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">Thread</span><span class="o">(</span><span class="n">Runnable</span> <span class="n">threadObj</span><span class="o">,</span> <span class="n">String</span> <span class="n">threadName</span><span class="o">);</span> </code></pre> </div> <p>Where, <em>threadObj</em> is an instance of a class that implements the Runnable interface and <em>threadName</em> is the name given to the new thread.</p> <h4 id="step-3">Step 3</h4> <p>Once Thread object is created, you can start it by calling <strong>start( )</strong> method, which executes a call to <strong>run( )</strong> method. Following is simple syntax of <strong>start()</strong> method:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">start</span><span class="o">(</span> <span class="o">);</span> </code></pre> </div> <h4 id="example-1">Example</h4> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">RunnableDemo</span> <span class="kd">implements</span> <span class="n">Runnable</span> <span class="o">{</span> <span class="kd">private</span> <span class="n">Thread</span> <span class="n">t</span><span class="o">;</span> <span class="kd">private</span> <span class="n">String</span> <span class="n">threadName</span><span class="o">;</span> <span class="n">RunnableDemo</span><span class="o">(</span> <span class="n">String</span> <span class="n">name</span><span class="o">){</span> <span class="n">threadName</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Creating "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Running "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="k">try</span> <span class="o">{</span> <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">--)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread: "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">", "</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span> <span class="c1">// Let the thread sleep for a while.</span> <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">50</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">" interrupted."</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Thread "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">+</span> <span class="s">" exiting."</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">start</span> <span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Starting "</span> <span class="o">+</span> <span class="n">threadName</span> <span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">t</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span> <span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">threadName</span><span class="o">);</span> <span class="n">t</span><span class="o">.</span><span class="na">start</span> <span class="o">();</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestThread</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span> <span class="n">RunnableDemo</span> <span class="n">R1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RunnableDemo</span><span class="o">(</span> <span class="s">"Thread-1"</span><span class="o">);</span> <span class="n">R1</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">RunnableDemo</span> <span class="n">R2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RunnableDemo</span><span class="o">(</span> <span class="s">"Thread-2"</span><span class="o">);</span> <span class="n">R2</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>Creating Thread-1 Starting Thread-1 Creating Thread-2 Starting Thread-2 Running Thread-1 Thread: Thread-1, 4 Running Thread-2 Thread: Thread-2, 4 Thread: Thread-1, 3 Thread: Thread-2, 3 Thread: Thread-1, 2 Thread: Thread-2, 2 Thread: Thread-1, 1 Thread: Thread-2, 1 Thread Thread-1 exiting. Thread Thread-2 exiting. </code></pre> </div> <h2 id="method-isalive-and-join-10548tables">Method: isAlive() and join() <a href="#tables">⤴</a></h2> <ul> <li>Main thread should finish last else other threads which have spawned from the main thread will also finish.</li> <li>To know whether the thread has finished we can call <strong>isAlive()</strong> on the thread which returns true if the thread is not finished.</li> <li>Another way to achieve this by using <strong>join()</strong> method, this method when called from the parent thread makes parent thread wait till child thread terminates. The join() method must be place in a try catch block.</li> <li>These methods are defined in the Thread class.</li> <li>However, <strong>wait()</strong>, <strong>notify()</strong>, <strong>notifyAll()</strong> are defined in the Object class.</li> </ul> <h2 id="synchronization-10548tables">Synchronization <a href="#tables">⤴</a></h2> <ul> <li>Multithreading introduces asynchronous behavior to the programs. If a thread is writing some data another thread may be reading the same data at that time. This may bring inconsistency.</li> <li>When two or more threads need access to a shared resource there should be some way that the resource will be used only by one resource at a time. The process to achieve this is called synchronization.</li> <li>To implement the synchronous behavior java has synchronous method. Once a thread is inside a synchronized method, no other thread can call any other synchronized method on the same object. * All the other threads then wait until the first thread come out of the synchronized block.</li> <li>When we want to synchronize access to objects of a class which was not designed for the multithreaded access and the code of the method which needs to be accessed synchronously is not available with us, in this case we cannot add the synchronized to the appropriate methods. In java we have the solution for this, put the calls to the methods (which needs to be synchronized) defined by this class inside a synchronized block in following manner.</li> </ul> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">Synchronized</span><span class="o">(</span><span class="n">object</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// statement to be synchronized</span> <span class="o">}</span> </code></pre> </div> <h2 id="inter-thread-communication-10548tables">Inter-thread Communication <a href="#tables">⤴</a></h2> <p>We have few methods through which java threads can communicate with each other. These methods are <strong>wait()</strong>, <strong>notify()</strong>, <strong>notifyAll()</strong>. All these methods can only be called from within a synchronized method.</p> <ol> <li>To understand synchronization java has a concept of monitor. Monitor can be thought of as a box which can hold only one thread. Once a thread enters the monitor all the other threads have to wait until that thread exits the monitor.</li> <li><strong>wait()</strong> tells the calling thread to give up the monitor and go to sleep until some other thread enters the same monitor and calls notify().</li> <li><strong>notify()</strong> wakes up the first thread that called wait() on the same object.</li> <li><strong>notifyAll()</strong> wakes up all the threads that called wait() on the same object. The highest priority thread will run first.</li> </ol> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.tutorialspoint.com/java/java_multithreading.htm">tutorialspoint-java-multithreading</a></li> <li><a href="http://www.java67.com/2012/12/what-is-difference-between-thread-vs-process-java.html">java67-thread-vs-process</a></li> <li><a href="http://beginnersbook.com/2013/03/multithreading-in-java/">beginnersbook-multithreading-in-java</a></li> </ul>&lt; s o n n y &gt;TablesJava Polymorphism2016-07-18T00:00:00+00:002016-07-18T00:00:00+00:00https://sonnyit.github.io/java/java-object-oriented/joo-java-polymorphism<p>Polymorphism is the ability of an object to take on many forms. The most common use of polymorphism in OOP occurs when a parent class reference is used to refer to a child class object.</p> <p>Any Java object that can pass more than one IS-A test is considered to be polymorphic. In Java, all Java objects are polymorphic since any object will pass the IS-A test for their own type and for the class Object.</p> <p><img src="http://www.javatpoint.com/images/polymorphism.gif" alt="polymorphism" /></p> <h3 id="tables">Tables</h3> <ul> <li><a href="#example-10548tables">Example</a></li> <li><a href="#how-polymorphism-supported-in-java-10548tables">How Polymorphism supported in Java</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="example">Example</h2> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Vegetarian</span> <span class="o">{}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Animal</span> <span class="o">{}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Deer</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="kd">implements</span> <span class="n">Vegetarian</span> <span class="o">{}</span> </code></pre> </div> <p>Now, the Deer class is considered to be polymorphic since this has multiple inheritance. Following are true for the above example:</p> <ul> <li>A Deer IS-A Animal</li> <li>A Deer IS-A Vegetarian</li> <li>A Deer IS-A Deer</li> <li>A Deer IS-A Object</li> </ul> <p>When we apply the reference variable facts to a Deer object reference, the following declarations are legal:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">Deer</span> <span class="n">d</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Deer</span><span class="o">();</span> <span class="n">Animal</span> <span class="n">a</span> <span class="o">=</span> <span class="n">d</span><span class="o">;</span> <span class="n">Vegetarian</span> <span class="n">v</span> <span class="o">=</span> <span class="n">d</span><span class="o">;</span> <span class="n">Object</span> <span class="n">o</span> <span class="o">=</span> <span class="n">d</span><span class="o">;</span> </code></pre> </div> <p>All the reference variables d,a,v,o refer to the same Deer object in the heap.</p> <p>Polymorphism is only for instance method not for instance variable.</p> <h2 id="how-polymorphism-supported-in-java">How Polymorphism supported in Java</h2> <p>Java has excellent support of polymorphism in terms of Inheritance, method overloading and method overriding.</p> <p>In case of overloading method signature changes while in case of overriding method signature remains same and binding and invocation of method is decided on runtime based on actual object. This facility allows Java programmer to write very flexibly and maintainable code using interfaces without worrying about concrete implementation.</p> <p>It is possible to override a method by changing its return type. (if they return a subtype)</p> <h2 id="references">References</h2> <ul> <li><a href="http://www.tutorialspoint.com/java/java_polymorphism.htm">tutorialspoint-polymorphism</a></li> <li><a href="http://javarevisited.blogspot.com/2011/08/what-is-polymorphism-in-java-example.html">javarevisited-polymorphism</a></li> </ul>&lt; s o n n y &gt;Polymorphism is the ability of an object to take on many forms. The most common use of polymorphism in OOP occurs when a parent class reference is used to refer to a child class object.Java Collections - HashSet vs. TreeSet vs. LinkedHashSet2016-06-20T00:00:00+00:002016-06-20T00:00:00+00:00https://sonnyit.github.io/java/java-collections/jc-set<h3 id="tables">Tables</h3> <ul> <li><a href="#set-interface-10548tables">Set Interface</a></li> <li><a href="#hashset-vs-treeset-vs-linkedhashset-10548tables">HashSet vs. TreeSet vs. LinkedHashSet</a></li> <li><a href="#example-10548tables">Example</a> <ul> <li><a href="#treeset-example-10548tables">TreeSet Example</a></li> <li><a href="#hashset-example-10548tables">HashSet Example</a></li> <li><a href="#linkedhashset-example-10548tables">LinkedHashSet Example</a></li> </ul> </li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="set-interface-10548tables">Set Interface <a href="#tables">⤴</a></h2> <p><strong>Set</strong> interface extends <strong>Collection</strong> interface. In a set, <strong>no duplicates</strong> are allowed. Every element in a set must be unique. You can simply add elements to a set, and duplicates will be removed automatically.</p> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/java-collection-hierarchy.jpeg" alt="collection-hierarchy" /></p> <h2 id="hashset-vs-treeset-vs-linkedhashset-10548tables">HashSet vs. TreeSet vs. LinkedHashSet <a href="#tables">⤴</a></h2> <ul> <li><strong>HashSet</strong> is Implemented using a hash table. Elements are not ordered. The <strong>add, remove</strong>, and <strong>contains</strong> methods have constant time complexity O(1).</li> <li><strong>TreeSet</strong> is implemented using a tree structure(red-black tree). The elements in a set are sorted, but the <strong>add, remove</strong>, and <strong>contains</strong> methods has time complexity of O(log(n)). It offers several methods to deal with the ordered set like first(), last(), headSet(), tailSet(), etc.</li> <li><strong>LinkedHashSet</strong> is between HashSet and TreeSet. It is implemented as a hash table with a linked list running through it, so it provides the order of insertion. The time complexity of basic methods is O(1).</li> </ul> <h2 id="example-10548tables">Example <a href="#tables">⤴</a></h2> <h3 id="treeset-example-10548tables">TreeSet Example <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">implements</span> <span class="n">Comparable</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;{</span> <span class="kt">int</span> <span class="n">size</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">Dog</span><span class="o">(</span><span class="kt">int</span> <span class="n">s</span><span class="o">)</span> <span class="o">{</span> <span class="n">size</span> <span class="o">=</span> <span class="n">s</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">size</span> <span class="o">+</span> <span class="s">""</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="c1">// must have, if not, run-time error occurs: java.lang.ClassCastException</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="n">Dog</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">size</span> <span class="o">-</span> <span class="n">o</span><span class="o">.</span><span class="na">size</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Let’s add some dogs to TreeSet like the following:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.util.Iterator</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.TreeSet</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestTreeSet</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">TreeSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">dset</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TreeSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;();</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">2</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">3</span><span class="o">));</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">iterator</span> <span class="o">=</span> <span class="n">dset</span><span class="o">.</span><span class="na">iterator</span><span class="o">();</span> <span class="k">while</span> <span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">next</span><span class="o">()</span> <span class="o">+</span> <span class="s">" "</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>The output is:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>1 2 3 </code></pre> </div> <h3 id="hashset-example-10548tables">HashSet Example <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">dset</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;();</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">2</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">3</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">5</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">4</span><span class="o">));</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">iterator</span> <span class="o">=</span> <span class="n">dset</span><span class="o">.</span><span class="na">iterator</span><span class="o">();</span> <span class="k">while</span> <span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">next</span><span class="o">()</span> <span class="o">+</span> <span class="s">" "</span><span class="o">);</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>5 3 2 1 4 </code></pre> </div> <p><strong>Note:</strong> the order is not certain.</p> <h3 id="linkedhashset-example-10548tables">LinkedHashSet Example <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">LinkedHashSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">dset</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedHashSet</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;();</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">2</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">3</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">5</span><span class="o">));</span> <span class="n">dset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="mi">4</span><span class="o">));</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;</span> <span class="n">iterator</span> <span class="o">=</span> <span class="n">dset</span><span class="o">.</span><span class="na">iterator</span><span class="o">();</span> <span class="k">while</span> <span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="n">iterator</span><span class="o">.</span><span class="na">next</span><span class="o">()</span> <span class="o">+</span> <span class="s">" "</span><span class="o">);</span> <span class="o">}</span> </code></pre> </div> <p>The order of the output is certain and it is the insertion order:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>2 1 3 5 4 </code></pre> </div> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.programcreek.com/2013/03/hashset-vs-treeset-vs-linkedhashset/">programcreek-set</a></li> </ul>&lt; s o n n y &gt;TablesJava Collections - HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap2016-06-20T00:00:00+00:002016-06-20T00:00:00+00:00https://sonnyit.github.io/java/java-collections/jc-map<h3 id="tables">Tables</h3> <ul> <li><a href="#map-overview-10548tables">Map Overview</a></li> <li><a href="#hashmap-10548tables">HashMap</a></li> <li><a href="#treemap-10548tables">TreeMap</a></li> <li><a href="#hashtable-10548tables">Hashtable</a></li> <li><a href="#linkedhashmap-10548tables">LinkedHashMap</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="map-overview-10548tables">Map Overview <a href="#tables">⤴</a></h2> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/MapClassHierarchy-600x354.jpg" alt="map-classes-hierarchy" /></p> <p>There are 4 commonly used implementations of Map in Java SE - HashMap, TreeMap, Hashtable and LinkedHashMap. If we use only one sentence to describe each implementation, it would be the following:</p> <ul> <li><strong>HashMap</strong> is implemented as a hash table, and there is no ordering on keys or values.</li> <li><strong>TreeMap</strong> is implemented based on red-black tree structure, and it is ordered by the key.</li> <li><strong>LinkedHashMap</strong> preserves the insertion order.</li> <li><strong>Hashtable</strong> is synchronized, in contrast to HashMap. It has an overhead for synchronization.</li> </ul> <p>This is the reason that HashMap should be used if the program is thread-safe.</p> <h2 id="hashmap-10548tables">HashMap <a href="#tables">⤴</a></h2> <p>If the key of a HashMap is a self-defined object, then the equals() and hashCode() contract need to be followed.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="o">{</span> <span class="n">String</span> <span class="n">color</span><span class="o">;</span> <span class="n">Dog</span><span class="o">(</span><span class="n">String</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span> <span class="n">color</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">(){</span> <span class="k">return</span> <span class="n">color</span> <span class="o">+</span> <span class="s">" dog"</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestHashMap</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">hashMap</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">Dog</span> <span class="n">d1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"red"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"black"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">hashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d1</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">hashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d2</span><span class="o">,</span> <span class="mi">15</span><span class="o">);</span> <span class="n">hashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d3</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span> <span class="n">hashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d4</span><span class="o">,</span> <span class="mi">20</span><span class="o">);</span> <span class="c1">//print size</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">hashMap</span><span class="o">.</span><span class="na">size</span><span class="o">());</span> <span class="c1">//loop HashMap</span> <span class="k">for</span> <span class="o">(</span><span class="n">Entry</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">hashMap</span><span class="o">.</span><span class="na">entrySet</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">().</span><span class="na">toString</span><span class="o">()</span> <span class="o">+</span> <span class="s">" - "</span> <span class="o">+</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>4 white dog - 5 black dog - 15 red dog - 10 white dog - 20 </code></pre> </div> <p>Note here, we add “white dogs” twice by mistake, but the HashMap accepts it. This does not make sense, because now we are confused with how many white dogs are really there.</p> <p>The Dog class should be defined as follows:</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="o">{</span> <span class="n">String</span> <span class="n">color</span><span class="o">;</span> <span class="n">Dog</span><span class="o">(</span><span class="n">String</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span> <span class="n">color</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">equals</span><span class="o">(</span><span class="n">Object</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="o">((</span><span class="n">Dog</span><span class="o">)</span> <span class="n">o</span><span class="o">).</span><span class="na">color</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">color</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">hashCode</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">color</span><span class="o">.</span><span class="na">length</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">(){</span> <span class="k">return</span> <span class="n">color</span> <span class="o">+</span> <span class="s">" dog"</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Now the output is:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>3 red dog - 10 white dog - 20 black dog - 15 </code></pre> </div> <p>The reason is that HashMap doesn’t allow two identical elements. By default, the hashCode() and equals() methods implemented in the Object class are used. The default hashCode() method gives distinct integers for distinct objects, and the equals() method only returns true when two references refer to the same object. Check out <a href="http://www.programcreek.com/2011/07/java-equals-and-hashcode-contract/">the hashCode() and equals() contract</a> if this is not obvious to you.</p> <p>Check out the <a href="http://www.programcreek.com/2013/04/frequently-used-methods-of-java-hashmap/">most frequently used methods for HashMap</a>, such as iteration, print, etc.</p> <h2 id="treemap-10548tables">TreeMap <a href="#tables">⤴</a></h2> <p>A TreeMap is sorted by keys. Let’s first take a look at the following example to understand the “sorted by keys” idea.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="o">{</span> <span class="n">String</span> <span class="n">color</span><span class="o">;</span> <span class="n">Dog</span><span class="o">(</span><span class="n">String</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span> <span class="n">color</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">equals</span><span class="o">(</span><span class="n">Object</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="o">((</span><span class="n">Dog</span><span class="o">)</span> <span class="n">o</span><span class="o">).</span><span class="na">color</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">color</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">hashCode</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">color</span><span class="o">.</span><span class="na">length</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">(){</span> <span class="k">return</span> <span class="n">color</span> <span class="o">+</span> <span class="s">" dog"</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestTreeMap</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Dog</span> <span class="n">d1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"red"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"black"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">TreeMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">treeMap</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TreeMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d1</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d2</span><span class="o">,</span> <span class="mi">15</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d3</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d4</span><span class="o">,</span> <span class="mi">20</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">Entry</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">entrySet</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">()</span> <span class="o">+</span> <span class="s">" - "</span> <span class="o">+</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>Exception <span class="k">in </span>thread <span class="s2">"main"</span> java.lang.ClassCastException: collection.Dog cannot be cast to java.lang.Comparable at java.util.TreeMap.put<span class="o">(</span>Unknown Source<span class="o">)</span> at collection.TestHashMap.main<span class="o">(</span>TestHashMap.java:35<span class="o">)</span> </code></pre> </div> <p>Since TreeMaps are sorted by keys, the object for key has to be able to compare with each other, that’s why it has to implement Comparable interface. For example, you use String as key, because String implements Comparable interface.</p> <p>Let’s change the Dog, and make it comparable.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">implements</span> <span class="n">Comparable</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">&gt;{</span> <span class="n">String</span> <span class="n">color</span><span class="o">;</span> <span class="kt">int</span> <span class="n">size</span><span class="o">;</span> <span class="n">Dog</span><span class="o">(</span><span class="n">String</span> <span class="n">c</span><span class="o">,</span> <span class="kt">int</span> <span class="n">s</span><span class="o">)</span> <span class="o">{</span> <span class="n">color</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span> <span class="n">size</span> <span class="o">=</span> <span class="n">s</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">(){</span> <span class="k">return</span> <span class="n">color</span> <span class="o">+</span> <span class="s">" dog"</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="n">Dog</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">o</span><span class="o">.</span><span class="na">size</span> <span class="o">-</span> <span class="k">this</span><span class="o">.</span><span class="na">size</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestTreeMap</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Dog</span> <span class="n">d1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"red"</span><span class="o">,</span> <span class="mi">30</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"black"</span><span class="o">,</span> <span class="mi">20</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">TreeMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">treeMap</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TreeMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d1</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d2</span><span class="o">,</span> <span class="mi">15</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d3</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d4</span><span class="o">,</span> <span class="mi">20</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">Entry</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">treeMap</span><span class="o">.</span><span class="na">entrySet</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">()</span> <span class="o">+</span> <span class="s">" - "</span> <span class="o">+</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>red dog - 10 black dog - 15 white dog - 20 </code></pre> </div> <p>It is sorted by key, i.e., dog size in this case.</p> <p>If “Dog d4 = new Dog(“white”, 10);” is replaced with “Dog d4 = new Dog(“white”, 40);”, the output would be:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>white dog - 20 red dog - 10 black dog - 15 white dog - 5 </code></pre> </div> <p>The reason is that TreeMap now uses compareTo() method to compare keys. Different sizes make different dogs!</p> <h2 id="hashtable-10548tables">Hashtable <a href="#tables">⤴</a></h2> <p>From Java Doc: The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.</p> <h2 id="linkedhashmap-10548tables">LinkedHashMap <a href="#tables">⤴</a></h2> <p>LinkedHashMap is a subclass of HashMap. That means it inherits the features of HashMap. In addition, the linked list preserves the insertion-order.</p> <p>Let’s replace the HashMap with LinkedHashMap using the same code used for HashMap.</p> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Dog</span> <span class="o">{</span> <span class="n">String</span> <span class="n">color</span><span class="o">;</span> <span class="n">Dog</span><span class="o">(</span><span class="n">String</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span> <span class="n">color</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">equals</span><span class="o">(</span><span class="n">Object</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="o">((</span><span class="n">Dog</span><span class="o">)</span> <span class="n">o</span><span class="o">).</span><span class="na">color</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">color</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">hashCode</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">color</span><span class="o">.</span><span class="na">length</span><span class="o">();</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">(){</span> <span class="k">return</span> <span class="n">color</span> <span class="o">+</span> <span class="s">" dog"</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestHashMap</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Dog</span> <span class="n">d1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"red"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"black"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">Dog</span> <span class="n">d4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="o">(</span><span class="s">"white"</span><span class="o">);</span> <span class="n">LinkedHashMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">linkedHashMap</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedHashMap</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">linkedHashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d1</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span> <span class="n">linkedHashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d2</span><span class="o">,</span> <span class="mi">15</span><span class="o">);</span> <span class="n">linkedHashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d3</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span> <span class="n">linkedHashMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">d4</span><span class="o">,</span> <span class="mi">20</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">Entry</span><span class="o">&lt;</span><span class="n">Dog</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">linkedHashMap</span><span class="o">.</span><span class="na">entrySet</span><span class="o">())</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">()</span> <span class="o">+</span> <span class="s">" - "</span> <span class="o">+</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre> </div> <p>Output is:</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>red dog - 10 black dog - 15 white dog - 20 </code></pre> </div> <p>The difference is that if we use HashMap the output could be the following - the insertion order is not preserved.</p> <div class="language-bash highlighter-rouge"><pre class="highlight"><code>red dog - 10 white dog - 20 black dog - 15 </code></pre> </div> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.programcreek.com/2013/03/hashmap-vs-treemap-vs-hashtable-vs-linkedhashmap/">programcreek-map</a></li> </ul>&lt; s o n n y &gt;TablesJava Collections - ArrayList vs. LinkedList vs. Vector2016-06-20T00:00:00+00:002016-06-20T00:00:00+00:00https://sonnyit.github.io/java/java-collections/jc-list<h3 id="tables">Tables</h3> <ul> <li><a href="#list-overview-10548tables">List Overview</a></li> <li><a href="#arraylist-vs-linkedlist-vs-vector-10548tables">ArrayList vs. LinkedList vs. Vector</a></li> <li><a href="#example-10548tables">Example</a> <ul> <li><a href="#arraylist-example-10548tables">ArrayList example</a></li> <li><a href="#linkedlist-example-10548tables">LinkedList example</a></li> <li><a href="#vector-10548tables">Vector</a></li> </ul> </li> <li><a href="#performance-of-arraylist-vs-linkedlist-10548tables">Performance of ArrayList vs. LinkedList</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="list-overview-10548tables">List Overview <a href="#tables">⤴</a></h2> <p>List, as its name indicates, is an ordered sequence of elements. When we talk about List, it is a good idea to compare it with Set which is a set of unique and unordered elements. The following is the class hierarchy diagram of Collection. From the hierarchy diagram you can get a general idea of Java Collections.</p> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/java-collection-hierarchy.jpeg" alt="collection-hierarchy" /></p> <h2 id="arraylist-vs-linkedlist-vs-vector-10548tables">ArrayList vs. LinkedList vs. Vector <a href="#tables">⤴</a></h2> <p>From the hierarchy diagram, they all implement <strong>List</strong> interface. They are very similar to use. Their main difference is their implementation which causes different performance for different operations.</p> <ul> <li><strong>ArrayList</strong> is implemented as a resizable array. As more elements are added to ArrayList, its size is increased dynamically. It’s elements can be accessed directly by using the get and set methods, since ArrayList is essentially an array.</li> <li><strong>LinkedList</strong> is implemented as a double linked list. Its performance on add and remove is better than Arraylist, but worse on get and set methods.</li> <li><strong>Vector</strong> is similar with ArrayList, but it is synchronized.</li> </ul> <p>ArrayList is a better choice if your program is thread-safe. Vector and ArrayList require more space as more elements are added. Vector each time doubles its array size, while ArrayList grow 50% of its size each time. LinkedList, however, also implements Queue interface which adds more methods than ArrayList and Vector, such as offer(), peek(), poll(), etc.</p> <p><strong>Note:</strong> The default initial capacity of an ArrayList is pretty small (maybe 10 elements). It is a good habit to construct the ArrayList with a higher initial capacity. This can avoid the resizing cost.</p> <h2 id="example-10548tables">Example <a href="#tables">⤴</a></h2> <h3 id="arraylist-example-10548tables">ArrayList example <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">al</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">4</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">6</span><span class="o">);</span> <span class="n">al</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">6</span><span class="o">);</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">iter1</span> <span class="o">=</span> <span class="n">al</span><span class="o">.</span><span class="na">iterator</span><span class="o">();</span> <span class="k">while</span><span class="o">(</span><span class="n">iter1</span><span class="o">.</span><span class="na">hasNext</span><span class="o">()){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">iter1</span><span class="o">.</span><span class="na">next</span><span class="o">());</span> <span class="o">}</span> </code></pre> </div> <h3 id="linkedlist-example-10548tables">LinkedList example <a href="#tables">⤴</a></h3> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">ll</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">4</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">6</span><span class="o">);</span> <span class="n">ll</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">6</span><span class="o">);</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">iter2</span> <span class="o">=</span> <span class="n">ll</span><span class="o">.</span><span class="na">iterator</span><span class="o">();</span> <span class="k">while</span><span class="o">(</span><span class="n">iter2</span><span class="o">.</span><span class="na">hasNext</span><span class="o">()){</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">iter2</span><span class="o">.</span><span class="na">next</span><span class="o">());</span> <span class="o">}</span> </code></pre> </div> <p>As shown in the examples above, they are similar to use. The real difference is their underlying implementation and their operation complexity.</p> <h3 id="vector-10548tables">Vector <a href="#tables">⤴</a></h3> <p>Vector is almost identical to ArrayList, and the difference is that Vector is synchronized. Because of this, it has an overhead than ArrayList. Normally, most Java programmers use ArrayList instead of Vector because they can synchronize explicitly by themselves.</p> <h2 id="performance-of-arraylist-vs-linkedlist-10548tables">Performance of ArrayList vs. LinkedList <a href="#tables">⤴</a></h2> <p>The time complexity comparison is as follows:</p> <p><img src="http://www.programcreek.com/wp-content/uploads/2013/03/arraylist-vs-linkedlist-complexity.png" alt="performance-arraylist-linkedlist" /></p> <ul> <li>add() in the table refers to add(E e), and remove() refers to remove(int index)</li> <li>ArrayList has O(n) time complexity for arbitrary indices of add/remove, but O(1) for the operation at the end of the list.</li> <li>LinkedList has O(n) time complexity for arbitrary indices of add/remove, but O(1) for operations at end/beginning of the List.</li> </ul> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/">programcreek-list</a></li> </ul>&lt; s o n n y &gt;TablesJava Collections - Collections Hierarchy Diagram2016-06-20T00:00:00+00:002016-06-20T00:00:00+00:00https://sonnyit.github.io/java/java-collections/jc-collections-hierarchy<h3 id="tables">Tables</h3> <ul> <li><a href="#collection-vs-collections-10548tables">Collection vs. Collections</a></li> <li><a href="#class-hierarchy-of-collection-10548tables">Class hierarchy of Collection</a> <ul> <li><a href="#class-hierarchy-of-map-10548tables">Class hierarchy of Map</a></li> </ul> </li> <li><a href="#collection-classes-summary-table-10548tables">Collection Classes Summary Table</a></li> <li><a href="#code-example-10548tables">Code Example</a></li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="collection-vs-collections-10548tables">Collection vs. Collections <a href="#tables">⤴</a></h2> <p>First of all, “Collection” and “Collections” are two different concepts. As you will see from the hierarchy diagram below:</p> <ul> <li>“Collection” is a root interface in the Collection hierarchy.</li> <li>but “Collections” is a class which provide static methods to manipulate on some Collection types.</li> </ul> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/CollectionVsCollections.jpeg" alt="collection-vs-collections" /></p> <h2 id="class-hierarchy-of-collection-10548tables">Class hierarchy of Collection <a href="#tables">⤴</a></h2> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/java-collection-hierarchy.jpeg" alt="class-hierarchy-collection" /></p> <h3 id="class-hierarchy-of-map-10548tables">Class hierarchy of Map <a href="#tables">⤴</a></h3> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/MapClassHierarchy-600x354.jpg" alt="class-hierarchy-map" /></p> <h2 id="collection-classes-summary-table-10548tables">Collection Classes Summary Table <a href="#tables">⤴</a></h2> <p><img src="http://www.programcreek.com/wp-content/uploads/2009/02/collection.bmp" alt="collection-classes-table" /></p> <h2 id="code-example-10548tables">Code Example <a href="#tables">⤴</a></h2> <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">a1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span> <span class="n">a1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Program"</span><span class="o">);</span> <span class="n">a1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Creek"</span><span class="o">);</span> <span class="n">a1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">a1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"ArrayList Elements"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">"\t"</span> <span class="o">+</span> <span class="n">a1</span> <span class="o">+</span> <span class="s">"\n"</span><span class="o">);</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">l1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span> <span class="n">l1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Program"</span><span class="o">);</span> <span class="n">l1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Creek"</span><span class="o">);</span> <span class="n">l1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">l1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"LinkedList Elements"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">"\t"</span> <span class="o">+</span> <span class="n">l1</span> <span class="o">+</span> <span class="s">"\n"</span><span class="o">);</span> <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">s1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span> <span class="c1">// or new TreeSet() will order the elements;</span> <span class="n">s1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Program"</span><span class="o">);</span> <span class="n">s1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Creek"</span><span class="o">);</span> <span class="n">s1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">s1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"Java"</span><span class="o">);</span> <span class="n">s1</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"tutorial"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Set Elements"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">"\t"</span> <span class="o">+</span> <span class="n">s1</span> <span class="o">+</span> <span class="s">"\n"</span><span class="o">);</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">m1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;();</span> <span class="c1">// or new TreeMap() will order based on keys</span> <span class="n">m1</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"Windows"</span><span class="o">,</span> <span class="s">"2000"</span><span class="o">);</span> <span class="n">m1</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"Windows"</span><span class="o">,</span> <span class="s">"XP"</span><span class="o">);</span> <span class="n">m1</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"Language"</span><span class="o">,</span> <span class="s">"Java"</span><span class="o">);</span> <span class="n">m1</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"Website"</span><span class="o">,</span> <span class="s">"programcreek.com"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Map Elements"</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">"\t"</span> <span class="o">+</span> <span class="n">m1</span><span class="o">);</span> </code></pre> </div> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://www.programcreek.com/2009/02/the-interface-and-class-hierarchy-for-collections/">programcreek-class-hierarchy-for-collections</a></li> <li><a href="http://www.programcreek.com/2009/02/collection-interface-concrete-implementation-classes-summary-and-some-examples/">programcreek-collection-classes-summary</a></li> <li><a href="http://www.programcreek.com/java-collections/">programcreek-java-collections</a></li> <li><a href="http://www.programcreek.com/2013/09/top-10-questions-for-java-collections/">programcreek-java-collections-questions</a></li> </ul>&lt; s o n n y &gt;TablesDesign Pattern - Singleton2016-06-20T00:00:00+00:002016-06-20T00:00:00+00:00https://sonnyit.github.io/java/java-design-pattern/dp-singleton<p>Singleton pattern is one of the most commonly used patterns in Java. It is used to control the number of objects created by preventing external instantiation and modification. This concept can be generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects, such as:</p> <ol> <li>private constructor - no other class can instantiate a new object.</li> <li>private reference - no external modification.</li> <li>public static method is the only place that can get an object.</li> </ol>&lt; s o n n y &gt;Singleton pattern is one of the most commonly used patterns in Java. It is used to control the number of objects created by preventing external instantiation and modification. This concept can be generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects, such as:Java - Types of Garbage Collectors2016-06-16T00:00:00+00:002016-06-16T00:00:00+00:00https://sonnyit.github.io/java/java-garbage-collection/j-types-of-garbage-collectors<h3 id="tables">Tables</h3> <ul> <li><a href="#introduction-10548tables">Introduction</a></li> <li><a href="#serial-garbage-collector-10548tables">Serial Garbage Collector</a></li> <li><a href="#parallel-garbage-collector-10548tables">Parallel Garbage Collector</a></li> <li><a href="#cms-garbage-collector-10548tables">CMS Garbage Collector</a></li> <li><a href="#g1-garbage-collector-10548tables">G1 Garbage Collector</a> <ul> <li><a href="#java-8-improvement-10548tables">Java 8 Improvement</a></li> </ul> </li> <li><a href="#garbage-collection-jvm-options-10548tables">Garbage Collection JVM Options</a> <ul> <li><a href="#type-of-garbage-collector-to-run-10548tables">Type of Garbage Collector to run</a></li> <li><a href="#gc-optimization-options-10548tables">GC Optimization Options</a></li> <li><a href="#example-usage-of-jvm-gc-options-10548tables">Example Usage of JVM GC Options</a></li> </ul> </li> <li><a href="#references-10548tables">References</a></li> </ul> <h2 id="introduction-10548tables">Introduction <a href="#tables">⤴</a></h2> <p>Java has four types of garbage collectors. Each of these four types has its own advantages and disadvantages.</p> <p>Most importantly, the programmers can choose the type of garbage collector to be used by the JVM.</p> <p>We can choose them by passing the choice as JVM argument. Each of these types differ largely and can provide completely different application performance. It is critical to understand each of these types of garbage collectors and use it rightly based on the application.</p> <p><img src="http://javapapers.com/wp-content/uploads/2014/10/Types-of-Java-Garbage-Collectors3_th_thumb.jpg" alt="types-of-garbage-collectors" /></p> <h2 id="serial-garbage-collector-10548tables">Serial Garbage Collector <a href="#tables">⤴</a></h2> <p>Serial garbage collector works by holding all the application threads. It is designed for the single-threaded environments.</p> <p>It uses just a single thread for garbage collection. The way it works by freezing all the application threads while doing garbage collection may not be suitable for a server environment. It is best suited for simple command-line programs.</p> <p>Turn on the <strong>-XX:+UseSerialGC</strong> JVM argument to use the serial garbage collector.</p> <h2 id="parallel-garbage-collector-10548tables">Parallel Garbage Collector <a href="#tables">⤴</a></h2> <p>Parallel garbage collector is also called as throughput collector. <strong>It is the default garbage collector of the JVM</strong>.</p> <p>Unlike serial garbage collector, this uses multiple threads for garbage collection. Similar to serial garbage collector this also freezes all the application threads while performing garbage collection.</p> <h2 id="cms-garbage-collector-10548tables">CMS Garbage Collector <a href="#tables">⤴</a></h2> <p>Concurrent Mark Sweep (CMS) garbage collector uses multiple threads to scan the heap memory to mark instances for eviction and then sweep the marked instances. CMS garbage collector holds all the application threads in the following two scenarios only:</p> <ul> <li>while marking the referenced objects in the tenured generation space.</li> <li>if there is a change in heap memory in parallel while doing the garbage collection.</li> </ul> <p>In comparison with parallel garbage collector, CMS collector uses more CPU to ensure better application throughput. If we can allocate more CPU for better performance then CMS garbage collector is the preferred choice over the parallel collector.</p> <p>Turn on the <strong>XX:+USeParNewGC</strong> JVM argument to use the CMS garbage collector.</p> <h2 id="g1-garbage-collector-10548tables">G1 Garbage Collector <a href="#tables">⤴</a></h2> <p>G1 garbage collector is used for large heap memory areas. It separates the heap memory into regions and does collection within them in parallel. G1 also does compacts the free heap space on the go just after reclaiming the memory. But CMS garbage collector compacts the memory on stop the world (STW) situations. G1 collector prioritizes the region based on most garbage first.</p> <p>Turn on the <strong>–XX:+UseG1GC</strong> JVM argument to use the G1 garbage collector.</p> <h4 id="java-8-improvement-10548tables">Java 8 Improvement <a href="#tables">⤴</a></h4> <p>Turn on the <strong>-XX:+UseStringDeduplication</strong> JVM argument while using <strong>G1</strong> garbage collector. This optimizes the heap memory by removing duplicate String values to a single char[] array. This option is introduced in Java 8u 20.</p> <h2 id="garbage-collection-jvm-options-10548tables">Garbage Collection JVM Options <a href="#tables">⤴</a></h2> <p>Following are the key JVM options that are related to Java garbage collection.</p> <h3 id="type-of-garbage-collector-to-run-10548tables">Type of Garbage Collector to run <a href="#tables">⤴</a></h3> <table> <thead> <tr> <th>Option</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>-XX:+UseSerialGC</td> <td>Serial Garbage Collector</td> </tr> <tr> <td>-XX:+UseParallelGC</td> <td>Parallel Garbage Collector</td> </tr> <tr> <td>-XX:+UseConcMarkSweepGC</td> <td>CMS Garbage Collector</td> </tr> <tr> <td>-XX:ParallelCMSThreads=</td> <td>CMS Collector – number of threads to use</td> </tr> <tr> <td>-XX:+UseG1GC</td> <td>G1 Gargbage Collector</td> </tr> </tbody> </table> <h3 id="gc-optimization-options-10548tables">GC Optimization Options <a href="#tables">⤴</a></h3> <table> <thead> <tr> <th>Option</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>-Xms</td> <td>Initial heap memory size</td> </tr> <tr> <td>-Xmx</td> <td>Maximum heap memory size</td> </tr> <tr> <td>-Xmn</td> <td>Size of Young Generation</td> </tr> <tr> <td>-XX:PermSize</td> <td>Initial Permanent Generation size</td> </tr> <tr> <td>-XX:MaxPermSize</td> <td>Maximum Permanent Generation size</td> </tr> </tbody> </table> <h3 id="example-usage-of-jvm-gc-options-10548tables">Example Usage of JVM GC Options <a href="#tables">⤴</a></h3> <div class="language-bash highlighter-rouge"><pre class="highlight"><code><span class="nv">$java</span> -Xmx12m -Xms3m -Xmn1m -XX:PermSize<span class="o">=</span>20m -XX:MaxPermSize<span class="o">=</span>20m -XX:+UseSerialGC -jar java-application.jar </code></pre> </div> <h2 id="references-10548tables">References <a href="#tables">⤴</a></h2> <ul> <li><a href="http://javapapers.com/java/types-of-java-garbage-collectors/">javapapers-types-of-java-garbage-colletors</a></li> </ul>&lt; s o n n y &gt;Tables