Wednesday 30 January 2019

Java HashMap Interview Questions

Java HashMap Interview Questions

Here is my list of HashMap questions from Java Interviews. This list includes questions based on the internal implementation of HashMap, the Map API, how you use HashMap and common best practices while using HashMap in a Java application.


How does put() method of HashMap works in Java? (answer)
The put() method of HashMap works in the principle of hashing. It is responsible for storing an object into backend array. The hashcode() method is used in conjunction with a hash function to find the correct location for the object into the bucket. If a collision occurs then the entry object which contains both key and value is added to a linked list and that linked list is stored into the bucket location.


What is the requirement for an object to be used as key or value in HashMap? (answer)
The key or value object must implement equals() and hashcode() method. The hash code is used when you insert the key object into the map while equals are used when you try to retrieve a value from the map.


What will happen if you try to store a key which is already present in HashMap? (answer)
If you store an existing key in the HashMap then it will override the old value with the new value and put() will return the old value. There will not be any exception or error.


Can you store a null key in Java HashMap? (answer)
Yes, HashMap allows one null key which is stored at the first location of bucket array e.g. bucket[0] = value. The HashMap doesn't call hashCode() on null key because it will throw NullPointerException, hence when a user call get() method with null then the value of the first index is returned.


Can you store a null value inside HashMap in Java? (answer)
Yes, HashMap also allows null value, you can store as many null values as you want as shown in the hashmap example post in this blog.


How does HashMap handle collisions in Java? (answer)
The java.util.HashMap uses chaining to handle collisions, which means new entries, an object which contains both key and values, are stored in a linked list along with existing value and then that linked list is stored in the bucket location. In the worst case, where all key has the same hashcode, your hash table will be turned into a linked list and searching a value will take O(n) time as opposed to O(1) time.


Which data structure HashMap represents? (answer)
The HashMap is an implementation of hash table data structure which is idle for mapping one value to other e.g. id to name as you can search for value in O(1) time if you have the key.


Which data structure is used to implement HashMap in Java? (answer)
Even though HashMap represents a hash table, it is internally implemented by using an array and linked list data structure in JDK. The array is used as bucket while a linked list is used to store all mappings which land in the same bucket. From Java 8 onwards, the linked list is dynamically replaced by binary search tree, once a number of elements in the linked list cross a certain threshold to improve performance.


Can you store a duplicate key in HashMap? (answer)
No, you cannot insert duplicate keys in HashMap, it doesn't allow duplicate keys. If you try to insert an existing key with new or same value then it will override the old value but size of HashMap will not change i.e. it will remain same. This is one of the reason when you get all keys from the HashMap by calling keySet() it returns a Set, not a Collection because Set doesn't allow duplicates.


Can you store the duplicate value in Java HashMap? (answer)
Yes, you can put duplicate values in HashMap of Java. It allows duplicate values, that's why when you retrieve all values from the Hashmap by calling values() method it returns a Collection and not Set. Worth noting is that it doesn't return List because HashMap doesn't provide any ordering guarantee for key or value.

If you want to explore, you can also see Java Fundamentals: Collections course from Pluralsight to learn more about fundamental properties of different collections in Java e.g. List, Set, and Map.

Is HashMap thread-safe in Java? (answer)
No, HashMap is not thread-safe in Java. You should not share an HashMap with multiple threads if one or more thread is modifying the HashMap e.g. inserting or removing a map. Though, you can easily share a read-only HashMap.


What will happen if you use HashMap in a multithreaded Java application? (answer)
If you use HashMap in a multithreaded environment in such a way that multiple threads structurally modify the map e.g. add, remove or modify mapping then the internal data structure of HashMap may get corrupt i.e. some links may go missing, some may point to incorrect entries and the map itself may become completely useless. Hence, it is advised not to use HashMap in the concurrent application, instead, you should use a thread-safe map e.g. ConcurrentHashMap or Hashtable.


What are different ways to iterate over HashMap in Java? (answer)
Here are some of the ways to iterate over HashMap in Java:
by using keySet and iterator
by using entrySet and iterator
by using entrySet and enhanced for loop
by using keySet and get() method

You can see this article for example of each of these way to traverse an HashMap in Java.


How do you remove a mapping while iterating over HashMap in Java? (answer)
Even though HashMap provides remove() method to remove a key and a key/value pair, you cannot use them to remove a mapping while traversing an HashMap, instead, you need to use the Iterator's remove method to remove a mapping as shown in the following example:

Iterator itr = map.entrySet().iterator();

while(itr.hasNext()){
  Map.Entry current = itr.next();

  if(current.getKey().equals("matching"){
     itr.remove(); // this will remove the current entry.
  }
}

You can see that we have used Iterator.remove() method to remove the current entry while traversing the map.


In which order mappings are stored in HashMap? (answer)
Random order because HashMap doesn't provide any ordering guarantee for keys, values, or entries. When you iterate over an HashMap, you may get the different order every time you iterate over it.



Can you sort HashMap in Java? (answer)
No, you cannot sort a HashMap because unlike List it is not an ordered collection. Albeit, you can sort contents of HashMap by keys, values or by entries by sorting and then storing the result into an ordered map e.g. LinkedHashMap or a sorted map e.g. TreeMap.


What is load factor in HashMap? (answer)
A load factor is a number which controls the resizing of HashMap when a number of elements in the HashMap cross the load factor e.g. if the load factor is 0.75 and when becoming more than 75% full then resizing trigger which involves array copy.


How does resizing happens in HashMap? (answer)
The resizing happens when map becomes full or when the size of map crosses the load factor. For example, if the load factor is 0.75 and when become more than 75% full then resizing trigger which involves array copy. First, the size of the bucket is doubled and then old entries are copied into a new bucket.


How many entries you can store in HashMap? What is the maximum limit? (answer)
There is no maximum limit for HashMap, you can store as many entries as you want because when you run out of the bucket, entries will be added to a linked list which can support an infinite number of entries, of course until you exhaust all the memory you have.

Btw, the size() method of HashMap return an int, which has a limit, once a number of entries cross the limit, size() will overflow and if your program relies on that then it will break. This issue has been addressed in JDK 8 by introducing a new method called mappingCount() which returns a long value. So, you should use mappingCount() for large maps. See Java SE 8 for Really Impatient to learn more about new methods introduced in existing interfaces in JDK 8.


What is the difference between capacity and size of HashMap in Java? (answer)
The capacity denotes how many entries HashMap can store and size denotes how many mappings or key/value pair is currently present.


What will happen if two different keys of HashMap return same hashcode()? (answer)
If two keys of HashMap return same hash code then they will end up in the same bucket, hence collision will occur. They will be stored in a linked list together.


That's all about some of the important Java HashMap interview questions. I have tried to answer them as well, but if you disagree with any answer then feel free to comment. Since HashMap is a very important class in Java and equally important from Java interview point of view, it pays to understand this class and its implementation in deep.

Read more: http://www.java67.com/2017/08/top-10-java-hashmap-interview-questions.html#ixzz5e7ocz4Dt

Monday 28 January 2019

Creational Design pattern-Abstract Factory Pattern

Abstract Factory Pattern

Abstract Factory Pattern says that just define an interface or abstract class for creating families of related (or dependent) objects but without specifying their concrete sub-classes.That means Abstract Factory lets a class returns a factory of classes. So, this is the reason that Abstract Factory Pattern is one level higher than the Factory Pattern.
An Abstract Factory Pattern is also known as Kit.

Advantage of Abstract Factory Pattern

  • Abstract Factory Pattern isolates the client code from concrete (implementation) classes.
  • It eases the exchanging of object families.
  • It promotes consistency among objects.

Usage of Abstract Factory Pattern

  • When the system needs to be independent of how its object are created, composed, and represented.
  • When the family of related objects has to be used together, then this constraint needs to be enforced.
  • When you want to provide a library of objects that does not show implementations and only reveals interfaces.
  • When the system needs to be configured with one of a multiple family of objects.

UML for Abstract Factory Pattern

  • We are going to create a Bank interface and a Loan abstract class as well as their sub-classes.
  • Then we will create AbstractFactory class as next step.
  • Then after we will create concrete classes, BankFactory, and LoanFactory that will extends AbstractFactory class
  • After that, AbstractFactoryPatternExample class uses the FactoryCreator to get an object of AbstractFactory class.
  • See the diagram carefully which is given below:
abstract factory pattern

Example of Abstract Factory Pattern

Here, we are calculating the loan payment for different banks like HDFC, ICICI, SBI etc.
Step 1: Create a Bank interface

  1. import java.io.*;     
  2. interface Bank{  
  3.         String getBankName();  
  4. }  
Step 2: Create concrete classes that implement the Bank interface.
  1. class HDFC implements Bank{  
  2.          private final String BNAME;  
  3.          public HDFC(){  
  4.                 BNAME="HDFC BANK";  
  5.         }  
  6.         public String getBankName() {  
  7.                   return BNAME;  
  8.         }  
  9. }  
  1. class ICICI implements Bank{  
  2.        private final String BNAME;  
  3.        ICICI(){  
  4.                 BNAME="ICICI BANK";  
  5.         }  
  6.         public String getBankName() {  
  7.                   return BNAME;  
  8.        }  
  9. }  
  1. class SBI implements Bank{  
  2.       private final String BNAME;  
  3.       public SBI(){  
  4.                 BNAME="SBI BANK";  
  5.         }  
  6.        public String getBankName(){  
  7.                   return BNAME;  
  8.        }  
  9. }  
Step 3: Create the Loan abstract class.
  1. abstract class Loan{  
  2.    protected double rate;  
  3.    abstract void getInterestRate(double rate);  
  4.    public void calculateLoanPayment(double loanamount, int years)  
  5.    {  
  6.         /* 
  7.               to calculate the monthly loan payment i.e. EMI   
  8.                             
  9.               rate=annual interest rate/12*100; 
  10.               n=number of monthly installments;            
  11.               1year=12 months. 
  12.               so, n=years*12; 
  13.  
  14.             */  
  15.                 
  16.          double EMI;  
  17.          int n;  
  18.   
  19.          n=years*12;  
  20.          rate=rate/1200;  
  21.          EMI=((rate*Math.pow((1+rate),n))/((Math.pow((1+rate),n))-1))*loanamount;  
  22.   
  23. System.out.println("your monthly EMI is "+ EMI +" for the amount"+loanamount+" you have borrowed");     
  24.  }  
  25. }// end of the Loan abstract class.  
Step 4: Create concrete classes that extend the Loan abstract class..
  1. class HomeLoan extends Loan{  
  2.      public void getInterestRate(double r){  
  3.          rate=r;  
  4.     }  
  5. }//End of the HomeLoan class.  
  1. class BussinessLoan extends Loan{  
  2.     public void getInterestRate(double r){  
  3.           rate=r;  
  4.      }  
  5.   
  6. }//End of the BusssinessLoan class.  
  1. class EducationLoan extends Loan{  
  2.      public void getInterestRate(double r){  
  3.        rate=r;  
  4.  }  
  5. }//End of the EducationLoan class.  
Step 5: Create an abstract class (i.e AbstractFactory) to get the factories for Bank and Loan Objects.
  1. abstract class AbstractFactory{  
  2.   public abstract Bank getBank(String bank);  
  3.   public abstract Loan getLoan(String loan);  
  4. }  
Step 6: Create the factory classes that inherit AbstractFactory class to generate the object of concrete class based on given information.
  1. class BankFactory extends AbstractFactory{  
  2.    public Bank getBank(String bank){  
  3.       if(bank == null){  
  4.          return null;  
  5.       }  
  6.       if(bank.equalsIgnoreCase("HDFC")){  
  7.          return new HDFC();  
  8.       } else if(bank.equalsIgnoreCase("ICICI")){  
  9.          return new ICICI();  
  10.       } else if(bank.equalsIgnoreCase("SBI")){  
  11.          return new SBI();  
  12.       }  
  13.       return null;  
  14.    }  
  15.   public Loan getLoan(String loan) {  
  16.       return null;  
  17.    }  
  18. }//End of the BankFactory class.  
  1. class LoanFactory extends AbstractFactory{  
  2.            public Bank getBank(String bank){  
  3.                 return null;  
  4.           }  
  5.         
  6.      public Loan getLoan(String loan){  
  7.       if(loan == null){  
  8.          return null;  
  9.       }  
  10.       if(loan.equalsIgnoreCase("Home")){  
  11.          return new HomeLoan();  
  12.       } else if(loan.equalsIgnoreCase("Business")){  
  13.          return new BussinessLoan();  
  14.       } else if(loan.equalsIgnoreCase("Education")){  
  15.          return new EducationLoan();  
  16.       }  
  17.       return null;  
  18.    }  
  19.      
  20. }  
Step 7: Create a FactoryCreator class to get the factories by passing an information such as Bank or Loan.
  1. class FactoryCreator {  
  2.      public static AbstractFactory getFactory(String choice){  
  3.       if(choice.equalsIgnoreCase("Bank")){  
  4.          return new BankFactory();  
  5.       } else if(choice.equalsIgnoreCase("Loan")){  
  6.          return new LoanFactory();  
  7.       }  
  8.       return null;  
  9.    }  
  10. }//End of the FactoryCreator.  
Step 8: Use the FactoryCreator to get AbstractFactory in order to get factories of concrete classes by passing an information such as type.
  1. import java.io.*;  
  2. class AbstractFactoryPatternExample {  
  3.       public static void main(String args[])throws IOException {  
  4.        
  5.       BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  
  6.   
  7.       System.out.print("Enter the name of Bank from where you want to take loan amount: ");  
  8.       String bankName=br.readLine();  
  9.   
  10. System.out.print("\n");  
  11. System.out.print("Enter the type of loan e.g. home loan or business loan or education loan : ");  
  12.   
  13. String loanName=br.readLine();  
  14. AbstractFactory bankFactory = FactoryCreator.getFactory("Bank");  
  15. Bank b=bankFactory.getBank(bankName);  
  16.   
  17. System.out.print("\n");  
  18. System.out.print("Enter the interest rate for "+b.getBankName()+ ": ");  
  19.   
  20. double rate=Double.parseDouble(br.readLine());  
  21. System.out.print("\n");  
  22. System.out.print("Enter the loan amount you want to take: ");  
  23.   
  24. double loanAmount=Double.parseDouble(br.readLine());  
  25. System.out.print("\n");  
  26. System.out.print("Enter the number of years to pay your entire loan amount: ");  
  27. int years=Integer.parseInt(br.readLine());  
  28.   
  29. System.out.print("\n");  
  30. System.out.println("you are taking the loan from "+ b.getBankName());  
  31.   
  32. AbstractFactory loanFactory = FactoryCreator.getFactory("Loan");  
  33.            Loan l=loanFactory.getLoan(loanName);  
  34.            l.getInterestRate(rate);  
  35.            l.calculateLoanPayment(loanAmount,years);  
  36.   }  
  37. }//End of the  AbstractFactoryPatternExample   


Output

abstract factory pattern output

40 Latest Interview Questions and Answers on Spring, Spring MVC, and Spring Boot

  40 Latest Interview Questions and Answers on Spring, Spring MVC, and Spring Boot 1. What is Tight Coupling? When a class (ClassA) is depen...