What is a
tricky question? Well, tricky Java interview questions are those questions
which has some surprise element on it. If you try to answer a tricky question
with common sense, you will most likely fail because they require some specific
knowledge. Most of the tricky Java questions comes from confusing
concepts like function overloading
and overriding,
Multi-threading which is really tricky to master, character encoding, checked vs unchecked
exceptions and
subtle Java programming details like Integer overflow. Most important
thing to answer a tricky Java question is attitude and analytical thinking
, which helps even if you don't know the answer. Anyway in this Java article we
will see 10 Java questions which is real tricky and requires more than average
knowledge of Java programming language to answer them correctly. As per my
experience there are always one or two tricky or tough Java interview
question on any
core Java or J2EE interviews, so its good to prepare tricky
questions from Java in advance. If I take interview, I purposefully put these
kind of question to gauge depth of candidate's understanding in Java. Another
advantage of asking such question is surprise element, which is key factor to
put candidate on some pressure during interviews. Since these questions are
less common, there is good chance that many Java developer doesn't know about
it.
10 Tricky Java interview question - Answered
Question: What does the following Java program print?
public class Test {
public static void main(String[]
args) {
System.out.println(Math.min(Double.MIN_VALUE,
0.0d));
}
}
Answer: This questions is tricky
because unlike the Integer, where MIN_VALUE is negative, both the MAX_VALUE and MIN_VALUE of the Double class are positive numbers. The Double.MIN_VALUE is 2^(-1074), a double constant whose
magnitude is the least among all double values. So unlike the obvious answer,
this program will print 0.0 because Double.MIN_VALUE is
greater than 0. I have asked this question to Java developer having experience
up to 3 to 5 years and surprisingly almost 70% candidate got it wrong.
Question
: What will happen if you put return statement or System.exit () on try or
catch block ? Will finally block execute?
This is a very popular
tricky Java question and its tricky because many programmer think that no
matter what, but finally block will always execute. This question challenge
that misconcept by putting return statement in try or
catch block or calling System.exit from try or catch block.
Answer of this tricky question in Java is that finally block
will execute even if you put return statement in try block
or catch block but finally block won't run if you call System.exit form
try or catch.
Can you
override private or static method in Java ?
Another popular Java tricky question, As I said
method overriding is a good topic to ask trick questions in Java. Anyway, you can not override private or static method in Java, if
you create similar method with same return type and same method arguments in
child class then it will hide the super class method, this is known as method
hiding. Similarly you cannot override private method in sub class because it's
not accessible there, what you do is create another private method with same
name in child class. See Can you override private method in Java or more details.
Question: What does the the expression 1.0 / 0.0 will return? will it throw Exception? any compile time error?
Answer : This is another tricky question from Double class. Though Java developer knows about double primitive type and Double class, while doing floating point arithmetic they don't pay enough attention to Double.INFINITY, NaN, and -0.0 and other rules that govern the arithmetic calculations involving them. Simple answer to this question is that it will not throw ArithmeticExcpetion and return Double.INFINITY. Also note that the comparison x == Double.NaN always evaluates to false, even if x itself is a NaN. To test if x is a NaN, one should use the method call Double.isNaN(x) to check if given number is NaN or not. If you know SQL, this is very close to NULL there.
Does Java
support multiple inheritance ?
This is
the trickiest question in Java, if C++ can support direct multiple inheritance
than why not Java is the argument Interviewer often give. Answer of this
question is much more subtle then it looks like, because Java does support
multiple inheritance of Type by allowing interface to extend other interfaces,
what Java doesn't support is multiple inheritance of implementation. This
distinction also get blur because of default method of Java 8, which now
provides Java, multiple inheritance of behaviour as well. See Why multiple
inheritance is not supported in Java to answer this tricky Java question.
What will
happen if we put a key object in a HashMap which is already there ?
This tricky Java questions is part of another
frequently asked question, How HashMap works in Java. HashMap is also a popular
topic to create confusing and tricky question in Java. Answer of this question
is, if you put the same key again than it will replace the old mapping because
HashMap doesn't allow duplicate keys. Same key will result in same hashcode and
will end up at same position in bucket. Each bucket contains a linked list of
Map.Entry object, which contains both Key and Value. Now Java will take Key
object form each entry and compare with this new key using equals() method, if
that return true then value object in that entry will be replaced by new value.
See How HashMap works in Java for more tricky Java
questions from HashMap.
Question : What does the following Java program print?
public class Test {
public static void main(String[]
args) throws Exception
{
char[]
chars = new
char[] {'\u0097'};
String
str = new
String(chars);
byte[]
bytes = str.getBytes();
System.out.println(Arrays.toString(bytes));
}
}
Answer: The trikyness of this question lies on character encoding and how String to byte array conversion works. In this program, we are first creating a String from a character array, which just has one character '\u0097', after than we are getting byte array from that String and printing that byte. Since \u0097 is within the 8-bit range of byte primitive type, it is reasonable to guess that the str.getBytes() call will return a byte array that contains one element with a value of -105 ((byte) 0x97). However, that's not what the program prints and that's why this question is tricky. As a matter of fact, the output of the program is operating system and locale dependent. On a Windows XP with the US locale, the above program prints [63], if you run this program on Linux or Solaris, you will get different values.
To answer this question correctly, you need to know about how Unicode characters are represented in Java char values and in Java strings, and what role character encoding plays in String.getBytes(). In simple word, to convert a string to a byte array, Java iterate through all the characters that the string represents and turn each one into a number of bytes and finally put the bytes together. The rule that maps each Unicode character into a byte array is called a character encoding. So It's possible that if same character encoding is not used during both encoding and decoding then retrieved value may not be correct. When we call str.getBytes() without specifying a character encoding scheme, the JVM uses the default character encoding of platform to do the job. The default encoding scheme is operating system and locale dependent. On Linux, it is UTF-8 and on Windows with a US locale, the default encoding is Cp1252. This explains the output we get from runing this program on Windows machines with a US locale. No matter which character encoding scheme is used, Java will always translate Unicode characters not recognized by the encoding to 63, which represents the character U+003F (the question mark, ?) in all encodings.
If a
method throws NullPointerException in super class, can we override it with a
method which throws RuntimeException?
One more tricky Java questions from overloading and
overriding concept. Answer is you can very well throw super class of
RuntimeException in overridden method but you can not do same if its checked
Exception. See Rules of method overriding in Java for more details.
What is
the issue with following implementation of compareTo() method in Java
public int compareTo(Object
o){
Employee
emp = (Employee)
emp;
return
this.id -
o.id;
}
where id
is an integer number ?
Well three is nothing wrong in this Java question
until you guarantee that id is always positive. This Java question becomes
tricky when you can't guaranteed that id is positive or negative. tricky part
is, If id becomes negative than subtraction may overflow and produce
incorrect result. See How to override compareTo method in Java for
complete answer of this Java tricky question for experienced programmer.
How do you ensure that N thread can access N resources without deadlock
If you are not well versed in writing
multi-threading code then this is real tricky question for you. This Java
question can be tricky even for experienced and senior programmer, who are not
really exposed to deadlock and race conditions. Key point here is order, if you
acquire resources in a particular order and release resources in reverse order
you can prevent deadlock. See how to avoid deadlock in Java for a sample code
example.
Question : Consider the following Java code snippet, which is initializing two variables and both are not volatile, and two threads T1 and T2 are modifying these values as following, both are not synchronized
int x = 0;
boolean bExit = false;
Thread 1 (not synchronized)
x = 1;
bExit = true;
Thread 2 (not synchronized)
if (bExit == true)
System.out.println("x="
+ x);
Now tell us, is it possible for
Thread 2 to print “x=0”?
Answer: It's impossible for a list of tricky Java questions to not contain anythign from multi-threading. This is the simplest one I can get. Answer of this question is Yes, It's possible that thread T2 may print x=0.Why? because without any instruction to compiler e.g. synchronized or volatile, bExit=true might come before x=1 in compiler reordering. Also x=1 might not become visible in Thread 2, so Thread 2 will load x=0. Now, how do you fix it? When I asked this question to couple of programmers they answer differently, one suggest to make both thread synchronized on a common mutex, another one said make both variable volatile. Both are correct, as it will prevent reordering and guarantee visibility. But best answer is you just need to make bExit as volatile, then Thread 2 can only print “x=1”. x does not need to be volatile because x cannot be reordered to come after bExit=true when bExit is volatile.
Answer: It's impossible for a list of tricky Java questions to not contain anythign from multi-threading. This is the simplest one I can get. Answer of this question is Yes, It's possible that thread T2 may print x=0.Why? because without any instruction to compiler e.g. synchronized or volatile, bExit=true might come before x=1 in compiler reordering. Also x=1 might not become visible in Thread 2, so Thread 2 will load x=0. Now, how do you fix it? When I asked this question to couple of programmers they answer differently, one suggest to make both thread synchronized on a common mutex, another one said make both variable volatile. Both are correct, as it will prevent reordering and guarantee visibility. But best answer is you just need to make bExit as volatile, then Thread 2 can only print “x=1”. x does not need to be volatile because x cannot be reordered to come after bExit=true when bExit is volatile.
What is
difference between CyclicBarrier and CountDownLatch in Java
Relatively newer Java tricky question, only been
introduced form Java 5. Main difference between both of them is that you can
reuse CyclicBarrier even if Barrier is
broken but you can not reuse CountDownLatch in Java. See CyclicBarrier vs CountDownLatch in Java for more differences.
What is
difference between StringBuffer and StringBuilder in Java ?
Classic Java questions which some people think
tricky and some consider very easy. StringBuilder in Java was introduced
in JDK 1.5 and only difference between both of them is that StringBuffer
methods e.g. length(), capacity() or append() are synchronized while corresponding methods in StringBuilder are
not-synchronized. Because of this fundamental difference, concatenation of
String using StringBuilder is faster than StringBuffer. Actually its considered
bad practice to use StringBuffer any more, because in almost 99% scenario, you
perform string concatenation on same thread. See StringBuilder vs StringBuffer for more differences.
Can you
access non static variable in static context?
Another tricky Java question from Java fundamentals.
No you can not access non-static variable from static context in Java. If you
try, it will give compile time error. This is actually a common problem
beginners in Java face, when they try to access instance variable inside main
method. Because main is static in Java, and instance variables are non-static,
you can not access instance variable inside main. Read why you can not access non-static variable from static method to
learn more about this tricky Java questions.
No comments:
Post a Comment