1: What’s wrong
using HashMap in the multi-threaded environment? When does the get() method go to an
infinite loop?
For example, if you initialize the HashMap just by
one thread and then all threads are only reading from it, then it’s perfectly
fine. One example of this is a Map which contains configuration properties.
The real problem starts
when at-least one of that thread is updating HashMap i.e. adding, changing or
removing any key value pair. Since put() operation can cause re-sizing and
which can further lead to infinite loop, that’s why either you should use Hashtable or ConcurrentHashMap, later is better.
2. Does
overriding the hashCode() method have any performance implication?
This is a good question
and open to all, as per my knowledge a poor hash code function will result in
the frequent collision in HashMap which eventually increases the time for
adding an object into Hash Map.
From Java 8 onwards
though, collision will not impact performance as much as it does in earlier
versions, because after a threshold the linked list will be replaced by the
binary tree, which will give you O(logN) performance in the worst case, as
compared to O(n) of linked list.
3) Do all
properties of an Immutable Object need to be final?
Not necessarily, as stated
above you can achieve same functionality by making the member non-final but
private and not modifying them except in a constructor. Don’t provide setter
methods for them and if it is a mutable object, then don’t ever leak any
reference for that member.
4) How does the
substring() method inside String works?
I think the answer is not sufficient, but here it is
“Substring creates a new object out of source string by taking a portion of
original string”.
This question was mainly
asked to see if the developer is familiar with the risk of memory leaks, which
a sub-string can create. Until Java 1.7, substring holds the reference of the
original character array, which means even a sub-string of 5 character
long, can prevent 1GB character array from garbage collection, by holding
a strong reference.This issue is fixed in
Java 1.7, where the original character array is not referenced anymore, but
that change also made the creation of substring a bit more costly in terms of
time. Earlier it was on the range of O(1), which could be O(n) in worst
case on Java 7.
5) Can you write
a critical section code for the singleton?
This core Java question is
a followup of the previous question and expecting the candidate to write Java
singleton using double checked locking. Remember to use the volatile variable
to make Singleton thread-safe.
6: How do you
handle error condition while writing stored procedure or accessing stored
procedure from java?
This is one of the tough
Java interview questions and its open for all, my friend didn’t know
the answer so he didn’t mind telling me. My take is that stored procedure
should return an error code if some operation fails but if stored procedure
itself fails than catching SQLException is the only choice.
7) What is
difference between Executor.submit() and Executer.execute() methods ?
This question is from my
list of Top 15 Java multi-threading question answers. It’s getting popular day
by day because of huge demand of Java developers with good concurrency skills.
The answer is that former returns an object of Future which can be used to find
result from worker thread.
There is a difference when
looking at exception handling. If your tasks throw an exception and if it was
submitted with executing this exception will go to the uncaught exception
handler (when you don’t have provided one explicitly, the default one will just
print the stack trace to System.err).
If you submitted the task
with submit any thrown exception, checked exception or not, is then part
of the task’s return status. For a task that was submitted with submitting and
that terminates with an exception, the Future.get() will re-throw this
exception, wrapped in an ExecutionException.
8)What is
the difference between factory and abstract factory pattern?
Abstract Factory provides
one more level of abstraction. Consider different factories each extended from
an Abstract Factory and responsible for the creation of different hierarchies
of objects based on the type of factory. E.g. AbstractFactory extended by AutomobileFactory, UserFactory, RoleFactory etc. Each individual
factory would be responsible for the creation of objects in that genre. Here is
UML diagram of factory and abstract factory pattern:
9) What is a
Singleton? Is it better to make the whole method synchronized or only critical
section synchronized?
Singleton in Java is a
class with just one instance in the whole Java application, for example, java.lang.Runtime is a Singleton
class. Creating Singleton was tricky prior Java 4 but once Java 5 introduced
Enum its very easy.
10: Can you
write code for iterating over HashMap in Java 4 and Java 5?
Tricky one but he managed
to write using while and a for loop. Actually there are four ways to iterate
over any Map in Java, one involves using keySet() and iterating over
key and then using get() method to retrieve values, which is bit expensive.
11) When do you
override hashCode() and equals()?
Whenever necessary,
especially if you want to do equality check based upon business logic rather
than object equality, e.g. two employee objects are equal if they have the same
emp_id, despite the fact that they are two different objects, created by
different part of the code.
Also overriding both these
methods are must if you want to use them as key in HashMap. Now as part of the
equals-hashcode contract in Java, when you override equals, you must override hashcode as
well, otherwise your object will not break invariant of classes e.g. Set,
Map which relies on equals() method for functioning properly.