What Is Java
What Is Java
Java is the high-level programming language that was developed by James Gosling in
the year 1982. It is based on the principles of object-oriented programming and can be
used to develop large-scale applications. Learn More.
The following article will cover all the popular Core Java interview questions, String
Handling interview questions, java 8 interview questions, java multithreading interview
questions, java OOPs interview questions, java exception handling interview questions,
collections interview questions, and some frequently asked java coding interview
questions.
Go through all the questions to enhance your chances of performing well in the
interviews. The questions will revolve around the basic, core & advanced fundamentals
of Java.
So, let’s dive deep into the plethora of useful Java Interview questions and answers
for freshers and experienced candidates in depth.
Play
Crack your next tech interview with confidence!
Take a free mock interview, get instant ⚡️feedback and recommendation 💡
Attempt Now
Java language was developed in such a way that it does not depend on any
hardware or software due to the fact that the compiler compiles the code
and then converts it to platform-independent byte code which can be run on
multiple systems.
The only condition to run that byte code is for the machine to have a runtime
environment (JRE) installed in it
3. Difference between Heap and Stack Memory in java. And how java
utilizes this.
Stack memory is the portion of memory that was assigned to every individual
program. And it was fixed. On the other hand, Heap memory is the portion
that was not allocated to the java program but it will be available for use by
the java program when it is required, mostly during the runtime of the
program.
When we write a java program then all the variables, methods, etc are stored
in the stack memory.
And when we create any object in the java program then that object was
created in the heap memory. And it was referenced from the stack memory.
For this java program. The stack and heap memory occupied by java is -
Main and PrintArray is the method that will be available in the stack area and
as well as the variables declared that will also be in the stack area.
And the Object (Integer Array of size 10) we have created, will be available in
the Heap area because that space will be allocated to the program during
runtime.
6. Pointers are used in C/ C++. Why does Java not make use of pointers?
Pointers are quite complicated and unsafe to use by beginner programmers.
Java focuses on code simplicity, and the usage of pointers can make it
challenging. Pointer utilization can also cause potential errors. Moreover,
security is also compromised if pointers are used because the users can
directly access memory with the help of pointers.
Instance variables are those variables that are accessible by all the methods
in the class. They are declared outside the methods and inside the class.
These variables describe the properties of an object and remain bound to it
at any cost.
All the objects of the class will have their copy of the variables for utilization.
If any modification is done on these variables, then only that instance will be
impacted by it, and all other class instances continue to remain unaffected.
Example:
class Athlete {
public String athleteName;
public double athleteSpeed;
public int athleteAge;
}
Example:
public void athlete() {
String athleteName;
double athleteSpeed;
int athleteAge;
}
JIT stands for Just-In-Time and it is used for improving the performance
during run time. It does the task of compiling parts of byte code having
similar functionality at the same time thereby reducing the amount of
compilation time for the code to run.
The compiler is nothing but a translator of source code to machine-
executable code. But what is special about the JIT compiler? Let us see how it
works:
o First, the Java source code (.java) conversion to byte code (.class) occurs with
the help of the javac compiler.
o Then, the .class files are loaded at run time by JVM and with the help of an
interpreter, these are converted to machine understandable code.
o JIT compiler is a part of JVM. When the JIT compiler is enabled, the JVM
analyzes the method calls in the .class files and compiles them to get more
efficient and native code. It also ensures that the prioritized method calls are
optimized.
o Once the above step is done, the JVM executes the optimized code directly
instead of interpreting the code again. This increases the performance and
speed of the execution.
11. Can you tell the difference between equals() method and equality
operator (==) in Java?
equals() ==
This is a method defined in the Object
It is a binary operator in Java.
class.
This method is used for checking the
This operator is used for comparing addresses
equality of contents between two
(or references), i.e checks if both the objects are
objects as per the specified business
pointing to the same memory location.
logic.
Note:
In the cases where the equals method is not overridden in a class, then the
class uses the default implementation of the equals method that is closest to
the parent class.
Object class is considered as the parent class of all the java classes. The
implementation of the equals method in the Object class uses the ==
operator to compare two objects. This default implementation can be
overridden as per the business logic.
Copy Constructor is the constructor used when we want to initialize the value
to the new object from the old object of the same class.
class InterviewBit{
String department;
String service;
InterviewBit(InterviewBit ib){
this.departments = ib.departments;
this.services = ib.services;
}
}
Here we are initializing the new object value from the old object value in the
constructor. Although, this can also be achieved with the help of object
cloning.
The only difference in the return type of the method does not promote
method overloading. The following example will furnish you with a clear
picture of it.
class OverloadingHelp {
public int findarea (int l, int b) {
int var1;
var1 = l * b;
return var1;
}
public int findarea (int l, int b, int h) {
int var2;
var2 = l * b * h;
return var2;
}
}
Both the functions have the same name but differ in the number of
arguments. The first method calculates the area of the rectangle, whereas the
second method calculates the area of a cuboid.
Method overriding is the concept in which two methods having the same
method signature are present in two different classes in which an inheritance
relationship is present. A particular method implementation (already present
in the base class) is possible for the derived class by using method
overriding.
Let’s give a look at this example:
class HumanBeing {
public int walk (int distance, int time) {
int speed = distance / time;
return speed;
}
}
class Athlete extends HumanBeing {
public int walk(int distance, int time) {
int speed = distance / time;
speed = speed * 2;
return speed;
}
}
Both class methods have the name walk and the same parameters, distance,
and time. If the derived class method is called, then the base class method
walk gets overridden by that of the derived class.
17. A single try block and multiple catch blocks can co-exist in a Java
Program. Explain.
Yes, multiple catch blocks can exist but specific approaches should come
prior to the general approach because only the first catch block satisfying the
catch condition is executed. The given code illustrates the same:
public class MultipleCatch {
public static void main(String args[]) {
try {
int n = 1000, x = 0;
int arr[] = new int[n];
for (int i = 0; i <= n; i++) {
arr[i] = i / x;
}
}
catch (ArrayIndexOutOfBoundsException exception) {
System.out.println("1st block = ArrayIndexOutOfBoundsException");
}
catch (ArithmeticException exception) {
System.out.println("2nd block = ArithmeticException");
}
catch (Exception exception) {
System.out.println("3rd block = Exception");
}
}
}
Here, the second catch block will be executed because of division by 0 (i / x).
In case x was greater than 0 then the first catch block will execute because
for loop runs till i = n and array index are till n-1.
18. Explain the use of final keyword in variable, method and class.
In Java, the final keyword is used as defining something as constant /final
and represents the non-access modifier.
final variable:
o When a variable is declared as final in Java, the value can’t be modified once
it has been assigned.
o If any value has not been assigned to that variable, then it can be assigned
only by the constructor of the class.
final method:
o A method declared as final cannot be overridden by its children's classes.
o A constructor cannot be marked as final because whenever a class is
inherited, the constructors are not inherited. Hence, marking it final doesn't
make sense. Java throws compilation error saying - modifier final not
allowed here
final class:
o No classes can be inherited from the class declared as final. But that final
class can extend other classes for its usage.
19. Do final, finally and finalize keywords have the same function?
Final: If any restriction is required for classes, variables, or methods, the final
keyword comes in handy. Inheritance of a final class and overriding of a final
method is restricted by the use of the final keyword. The variable value
becomes fixed after incorporating the final keyword. Example:
final int a=100;
a = 0; // error
Finally: It is the block present in a program where all the codes written inside
it get executed irrespective of handling of exceptions. Example:
try {
int variable = 5;
}
catch (Exception exception) {
System.out.println("Exception occurred");
}
finally {
System.out.println("Execution of finally block");
}
20. Is it possible that the ‘finally’ block will not be executed? If yes then
list the case.
Yes. It is possible that the ‘finally’ block will not be executed. The cases are-
21. Identify the output of the java program and state the reason.
1. public class InterviewBit
2. {
3. public static void main(String[] args) {
4. final int i;
5. i = 20;
6. int j = i+20;
7. i = j+30;
8. System.out.println(i + " " + j);
9. }
10. }
The above code will generate a compile-time error at Line 7 saying - [error:
variable i might already have been initialized]. It is because variable ‘i’ is
the final variable. And final variables are allowed to be initialized only once,
and that was already done on line no 5.
The super keyword is used to access hidden fields and overridden methods
or attributes of the parent class.
Following are the cases when this keyword can be used:
o Accessing data members of parent class when the member names of the
class and its child subclasses are same.
o To call the default and parameterized constructor of the parent class inside
the child class.
o Accessing the parent class methods when the child classes have overridden
them.
The following example demonstrates all 3 cases when a super keyword is
used.
public class Parent{
protected int num = 1;
Parent(){
System.out.println("Parent class default constructor.");
}
Parent(String x){
System.out.println("Parent class parameterised constructor.");
}
Child(){
System.out.println("Child class default Constructor");
void printNum(){
System.out.println(num);
System.out.println(super.num); //prints the value of num of
parent class
}
@Override
public void foo(){
System.out.println("Parent class foo!");
super.foo(); //Calls foo method of Parent class inside the
Overriden foo method of Child class.
}
}
23. Can the static methods be overloaded?
Yes! There can be two or more static methods in a class with the same name
but differing input parameters.
The main method is always static because static members are those methods
that belong to the classes, not to an individual object. So if the main method
will not be static then for every object, It is available. And that is not
acceptable by JVM. JVM calls the main method based on the class name
itself. Not by creating the object.
Because there must be only 1 main method in the java program as the
execution starts from the main method. So for this reason the main method
is static.
No! Declaration of static methods having the same signature can be done in
the subclass but run time polymorphism can not take place in such cases.
Overriding or dynamic polymorphism occurs during the runtime, but the
static methods are loaded and looked up at the compile time statically.
Hence, these methods cant be overridden.
Static Methods and Static variables are those methods and variables that
belong to the class of the java program, not to the object of the class. This
gets memory where the class is loaded. And these can directly be called with
the help of class names.
o For example - We have used mathematical functions in the java program like
- max(), min(), sqrt(), pow(), etc. And if we notice that, then we will find that
we call it directly with the class name. Like - Math.max(), Math.min(), etc. So
that is a static method. And Similarly static variables we have used like
(length) for the array to get the length. So that is the static method.
Static classes - A class in the java program cannot be static except if it is the
inner class. If it is an inner static class, then it exactly works like other static
members of the class.
The main objective of this process is to free up the memory space occupied
by the unnecessary and unreachable objects during the Java program
execution by deleting those unreachable objects.
This ensures that the memory resource is used efficiently, but it provides no
guarantee that there would be sufficient memory for the program execution.
Heap.
To copy the object's data, we have several methods like deep copy and
shallow copy.
Example -
class Rectangle{
int length = 5;
int breadth = 3;
}
Now by doing this what will happen is the new reference is created with the
name obj2 and that will point to the same memory location.
Deep Copy - In a deep copy, we create a new object and copy the old object
value to the new object. Example -
Rectangle obj3 = new Rectangle();
Obj3.length = obj1.length;
Obj3.breadth = obj1.breadth;
Both these objects will point to the memory location as stated below -
Now, if we change the values in shallow copy then they affect the other
reference as well. Let's see with the help of an example -
class Rectangle
{
int length = 5;
int breadth = 3;
}
public class Main
{
public static void main(String[] args) {
Rectangle obj1 = new Rectangle();
//Shallow Copy
Rectangle obj2 = obj1;
Output -
Before Changing the value of object 1, the object2 will be -
Object2 Length = 5, Object2 Breadth = 3
We can see that in the above code, if we change the values of object1, then
the object2 values also get changed. It is because of the reference.
Now, if we change the code to deep copy, then there will be no effect on
object2 if it is of type deep copy. Consider some snippets to be added in the
above code.
class Rectangle
{
int length = 5;
int breadth = 3;
}
public class Main
{
public static void main(String[] args) {
Rectangle obj1 = new Rectangle();
//Shallow Copy
Rectangle obj2 = new Rectangle();
obj2.length = obj1.length;
obj2.breadth = obj1.breadth;
}
}
The above snippet will not affect the object2 values. It has its separate values.
The output will be
Before Changing the value of object 1, the object2 will be -
Object2 Length = 5, Object2 Breadth = 3
Now we see that we need to write the number of codes for this deep copy.
So to reduce this, In java, there is a method called clone().
The clone() will do this deep copy internally and return a new object. And to
do this we need to write only 1 line of code. That is - Rectangle obj2 =
obj1.clone();
String Pool: Designers of Java were aware of the fact that String data type is
going to be majorly used by the programmers and developers. Thus, they
wanted optimization from the beginning. They came up with the notion of
using the String pool (a storage area in Java heap) to store the String literals.
They intended to decrease the temporary String object with the help of
sharing. An immutable class is needed to facilitate sharing. The sharing of the
mutable structures between two unknown parties is not possible. Thus,
immutable Java String helps in executing the concept of String Pool.
Singleton classes are those classes, whose objects are created only once. And
with only that object the class members can be accessed.
Consider the water jug in the office and if every employee wants that water
then they will not create a new water jug for drinking water. They will use the
existing one with their own reference as a glass. So programmatically it
should be implemented as -
class WaterJug{
private int waterQuantity = 500;
private WaterJug(){}
private WaterJug object = null;
In the above class, the Constructor is private so we cannot create the object
of the class. But we can get the object by calling the method getInstance().
And the getInstance is static so it can be called without creating the object.
And it returns the object. Now with that object, we can call getWater() to
get the water.
Waterjug glass1 = WaterJug.getInstance();
glass1.getWater(1);
We can get the single object using this getInstance(). And it is static, so it is a
thread-safe singleton class. Although there are many ways to create a
thread-safe singleton class. So thread-safe classes can also be:
Because the array requires the size in integer, none of the lines (1, 2, and 4)
will give a compile-time error. The program will compile fine. But we get the
runtime exception in line 2. The exception is - NegativeArraySizeException.
Here what will happen is - At the time when JVM will allocate the required
memory during runtime then it will find that the size is negative. And the
array size can’t be negative. So the JVM will throw the exception.
34. How would you differentiate between a String, StringBuffer, and a
StringBuilder?
Storage area: In string, the String pool serves as the storage area. For
StringBuilder and StringBuffer, heap memory is the storage area.
Mutability: A String is immutable, whereas both the StringBuilder and
StringBuffer are mutable.
Efficiency: It is quite slow to work with a String. However, StringBuilder is the
fastest in performing operations. The speed of a StringBuffer is more than a
String and less than a StringBuilder. (For example appending a character is
fastest in StringBuilder and very slow in String because a new memory is
required for the new String with appended character.)
Thread-safe: In the case of a threaded environment, StringBuilder and
StringBuffer are used whereas a String is not used. However, StringBuilder is
suitable for an environment with a single thread, and a StringBuffer is
suitable for multiple threads.
Syntax:
// String
String first = "InterviewBit";
String second = new String("InterviewBit");
// StringBuffer
StringBuffer third = new StringBuffer("InterviewBit");
// StringBuilder
StringBuilder fourth = new StringBuilder("InterviewBit");
Interface example:
public interface Walkable {
void walk();
}
36. Is this program giving a compile-time error? If Yes then state the
reason and number of errors it will give. If not then state the reason.
abstract final class InterviewBit{
2. public abstract void printMessage();
3. }
4. class ScalarAcademy extends InterviewBit{
5. public void printMessage(){
6. System.out.println("Welcome to Scalar Academy By InterviewBit");
7. }
8. }
9. class ScalarTopics extends ScalarAcademy{
10. public void printMessage(){
11. System.out.println("Welcome to Scalar Topics By Scalar Academy");
12. }
13. }
public class Main{
public static void main(String[] args) {
InterviewBit ib = new ScalarTopics();
ib.printMessage();
}
}
The above program will give a compile-time error. The compiler will throw 2
errors in this.
Comparator is the interface in java that contains the compare method. And
by overloading the compare method, we can define that on what basis we
need to compare the values.
The statement in the context is completely False. The static methods have no
relevance with the objects, and these methods are of the class level. In the
case of a child class, a static method with a method signature exactly like that
of the parent class can exist without even throwing any compilation error.
Although both HashSet and TreeSet are not synchronized and ensure that
duplicates are not present, there are certain properties that distinguish a
HashSet from a TreeSet.
Implementation: For a HashSet, the hash table is utilized for storing the
elements in an unordered manner. However, TreeSet makes use of the red-
black tree to store the elements in a sorted manner.
Complexity/ Performance: For adding, retrieving, and deleting elements,
the time amortized complexity is O(1) for a HashSet. The time complexity for
performing the same operations is a bit higher for TreeSet and is equal to
O(log n). Overall, the performance of HashSet is faster in comparison to
TreeSet.
Methods: hashCode() and equals() are the methods utilized by HashSet for
making comparisons between the objects. Conversely, compareTo() and
compare() methods are utilized by TreeSet to facilitate object comparisons.
Objects type: Heterogeneous and null objects can be stored with the help of
HashSet. In the case of a TreeSet, runtime exception occurs while inserting
heterogeneous objects or null objects.
40. Why is the character array preferred over string for storing
confidential information?
JDK- For making java programs, we need some tools that are provided by
JDK (Java Development Kit). JDK is the package that contains various tools,
Compiler, Java Runtime Environment, etc.
JRE - To execute the java program we need an environment. (Java Runtime
Environment) JRE contains a library of Java classes + JVM. What are JAVA
Classes? It contains some predefined methods that help Java programs to
use that feature, build and execute. For example - there is a system class in
java that contains the print-stream method, and with the help of this, we can
print something on the console.
JVM - (Java Virtual Machine) JVM is a part of JRE that executes the Java
program at the end. Actually, it is part of JRE, but it is software that converts
bytecode into machine-executable code to execute on hardware.
42. What are the differences between JVM, JRE and JDK in Java?
43. What are the differences between HashMap and HashTable in Java?
HashMap HashTable
HashMap is not synchronized thereby making HashTable is synchronized and hence it
it better for non-threaded applications. is suitable for threaded applications.
Allows only one null key but any number of This does not allow null in both keys or
null in the values. values.
Supports order of insertion by making use of Order of insertion is not guaranteed in
its subclass LinkedHashMap. HashTable.
46. What are the different types of Thread Priorities in Java? And what is
the default priority of a thread assigned by JVM?
47. What is the difference between the program and the process?
A program doesn't execute directly by the CPU. First, the resources are
allocated to the program and when it is ready for execution then it is a
process.
48. What is the difference between the ‘throw’ and ‘throws’ keyword in
java?
The ‘throw’ keyword is used to manually throw the exception to the calling
method.
And the ‘throws’ keyword is used in the function definition to inform the
calling method that this method throws the exception. So if you are calling,
then you have to handle the exception.
Example -
class Main {
public static int testExceptionDivide(int a, int b) throws
ArithmeticException{
if(a == 0 || b == 0)
throw new ArithmeticException();
return a/b;
}
public static void main(String args[]) {
try{
testExceptionDivide(10, 0);
}
catch(ArithmeticException e){
//Handle the exception
}
}
}
Here in the above snippet, the method testExceptionDivide throws an
exception. So if the main method is calling it then it must have handled the
exception. Otherwise, the main method can also throw the exception to JVM.
49. What are the differences between constructor and method of a class
in Java?
Constructor Method
Method is used for exposing the
Constructor is used for initializing the object state.
object's behavior.
Method should have a return
Constructor has no return type. type. Even if it does not return
anything, return type is void.
Method has to be invoked on
Constructor gets invoked implicitly.
the object explicitly.
If the constructor is not defined, then a default If a method is not defined, then
constructor is provided by the java compiler. the compiler does not provide it.
The name of the method can
The constructor name should be equal to the class
have any name or have a class
name.
name too.
A constructor cannot be marked as final because
whenever a class is inherited, the constructors are not A method can be defined as final
inherited. Hence, marking it final doesn't make sense. but it cannot be overridden in its
Java throws compilation error saying - modifier final subclasses.
not allowed here
A final variable if initialised
Final variable instantiations are possible inside a
inside a method ensures that the
constructor and the scope of this applies to the whole
variable cant be changed only
class and its objects.
within the scope of that method.
50. Identify the output of the below java program and Justify your
answer.
class Main {
public static void main(String args[]) {
Scaler s = new Scaler(5);
}
}
class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class Scaler extends InterviewBit{
Scaler(){
System.out.println(" Welcome to Scaler Academy ");
}
Scaler(int x){
this();
super();
System.out.println(" Welcome to Scaler Academy 2");
}
}
The above code will throw the compilation error. It is because the super() is
used to call the parent class constructor. But there is the condition that
super() must be the first statement in the block. Now in this case, if we
replace this() with super() then also it will throw the compilation error.
Because this() also has to be the first statement in the block. So in conclusion,
we can say that we cannot use this() and super() keywords in the same
block.
Case 1: When the object is pointed to another location: In this case, the
changes made to that object do not get reflected the original object before it
was passed to the method as the reference points to another location.
For example:
class InterviewBitTest{
int num;
InterviewBitTest(int x){
num = x;
}
InterviewBitTest(){
num = 0;
}
}
class Driver {
public static void main(String[] args)
{
//create a reference
InterviewBitTest ibTestObj = new InterviewBitTest(20);
//Pass the reference to updateObject Method
updateObject(ibTestObj);
//After the updateObject is executed, check for the value of num in
the object.
System.out.println(ibTestObj.num);
}
public static void updateObject(InterviewBitTest ibObj)
{
// Point the object to new reference
ibObj = new InterviewBitTest();
// Update the value
ibObj.num = 50;
}
}
Output:
20
Case 2: When object references are not modified: In this case, since we have
the copy of reference the main object pointing to the same memory location,
any changes in the content of the object get reflected in the original object.
For example:
class InterviewBitTest{
int num;
InterviewBitTest(int x){
num = x;
}
InterviewBitTest(){
num = 0;
}
}
class Driver{
public static void main(String[] args)
{
//create a reference
InterviewBitTest ibTestObj = new InterviewBitTest(20);
//Pass the reference to updateObject Method
updateObject(ibTestObj);
//After the updateObject is executed, check for the value of num in
the object.
System.out.println(ibTestObj.num);
}
public static void updateObject(InterviewBitTest ibObj)
{
// no changes are made to point the ibObj to new location
// Update the value of num
ibObj.num = 50;
}
}
Output:
50
‘IS-A’ relationship is another name for inheritance. When we inherit the base
class from the derived class, then it forms a relationship between the classes.
So that relationship is termed an ‘IS-A’ Relationship.
In order to achieve this, the attribute can be declared along with the usage
of transient keyword as shown below:
public class InterviewBitExample {
55. What happens if the static modifier is not included in the main
method signature in Java?
There wouldn't be any compilation error. But then the program is run, since
the JVM cant map the main method signature, the code throws
“NoSuchMethodError” error at the runtime.
56. Consider the below program, identify the output, and also state the
reason for that.
public class Main{
public static void main(String[] args) {
System.out.println(" Hello. Main Method. ");
}
public static void main(int[] args) {
System.out.println(" Hello. Main Method2. ");
}
}
The output of the above program will be Hello. Main Method. This is
because JVM will always call the main method based on the definition it
already has. Doesn't matter how many main methods we overload it will only
execute one main method based on its declaration in JVM.
58. What happens if there are multiple main methods inside one class in
Java?
The program can't compile as the compiler says that the method has been
already defined inside the class.
59. What do you understand by Object Cloning and how do you achieve
it in Java?
In case the Cloneable interface is not implemented and just the method is
overridden, it results in CloneNotSupportedException in Java.
63. Will the finally block get executed when the return statement is
written at the end of try block and catch block as shown below?
public int someMethod(int i){
try{
//some statement
return 1;
}catch(Exception e){
//some statement
return 999;
}finally{
//finally block statements
}
}
finally block will be executed irrespective of the exception or not. The only
case where finally block is not executed is when it encounters ‘System.exit()’
method anywhere in try/catch block.
64. Can you call a constructor of a class inside the another constructor?
Yes, the concept can be termed as constructor chaining and can be achieved
using this().
65. Contiguous memory locations are usually used for storing actual
values in an array but not in ArrayList. Explain.
In the case of ArrayList, data storing in the form of primitive data types (like
int, float, etc.) is not possible. The data members/objects present in the
ArrayList have references to the objects which are located at various sites in
the memory. Thus, storing of actual objects or non-primitive data types (like
Integer, Double, etc.) takes place in various memory locations.
However, the same does not apply to the arrays. Object or primitive type
values can be stored in arrays in contiguous memory locations, hence every
element does not require any reference to the next element.
66. Why does the java array index start with 0?
Example - Consider the array and assume each element takes 4-byte memory
space. Then the address will be like this -
Now if we want to access index 4. Then internally java calculates the address
using the formula-
Now if we apply the same formula here. Then we get - 116 as the starting
address of the 4th index. Which is wrong. Then we need to apply formula -
[Base Address + ((index-1) * no_of_bytes)].
67. Why is the remove method faster in the linked list than in an array?
In the linked list, we only need to adjust the references when we want to
delete the element from either end or the front of the linked list. But in the
array, indexes are used. So to manage proper indexing, we need to adjust the
values from the array So this adjustment of value is costlier than the
adjustment of references.
Example - To Delete from the front of the linked list, internally the
references adjustments happened like this.
The only thing that will change is that the head pointer will point to the
head’s next node. And delete the previous node. That is the constant time
operation.
68. How many overloaded add() and addAll() methods are available in
the List interface? Describe the need and uses.
There are a total of 4 overloaded methods for add() and addAll() methods
available in List Interface. The below table states the description of all.
69. How does the size of ArrayList grow dynamically? And also state
how it is implemented internally.
2. If we need to add the element into this. Then internally what will happen
is-
ArrayList will allocate the new ArrayList of Size (current size + half of the
current size). And add the old elements into the new. Old - [2, 3], New - [2,
3, null, null].
Then the new value will be inserted into it. [2, 3, 4, null]. And for the next
time, the extra space will be available for the value to be inserted.
3. This process continues and the time taken to perform all of these is
considered as the amortized constant time.
This is how the ArrayList grows dynamically. And when we delete any entry
from the ArrayList then the following steps are performed -
1. It searches for the element index in the array. Searching takes some time.
Typically it’s O(n) because it needs to search for the element in the entire
array.
2. After searching the element, it needs to shift the element from the right
side to fill the index.
So this is how the elements are deleted from the ArrayList internally.
Similarly, the search operations are also implemented internally as defined in
removing elements from the list (searching for elements to delete).
Multiple-inheritance is not possible in Java. Classes can only extend from one
superclass. In cases where multiple functionalities are required, for example -
to read and write information into the file, the pattern of composition is
preferred. The writer, as well as reader functionalities, can be made use of by
considering them as the private members.
Composition assists in attaining high flexibility and prevents breaking of
encapsulation.
Unit testing is possible with composition and not inheritance. When a
developer wants to test a class composing a different class, then Mock
Object can be created for signifying the composed class to facilitate testing.
This technique is not possible with the help of inheritance as the derived
class cannot be tested without the help of the superclass in inheritance.
The loosely coupled nature of composition is preferable over the tightly
coupled nature of inheritance.
71. What is the difference between ‘>>’ and ‘>>>’ operators in java?
These 2 are the bitwise right shift operators. Although both operators look
similar. But there is a minimal difference between these two right shift
operators.
‘>>’ Bitwise Right Shift Operator- This operator shifts each bit to its right
position. And this maintains the signed bit.
‘>>>’ Bitwise Right Shift Operator with trailing zero- This operator also
shifts each bit to its right. But this doesn’t maintain the signed bit. This
operator makes the Most significant bit to 0.
Consider the University as a class that has some departments in it. So the
university will be the container object. And departments in it will contain
objects. Now in this case, if the container object destroys then the contained
objects will also get destroyed automatically. So here we can say that there
is a strong association between the objects. So this Strong Association is
called Composition.
Now consider one more example. Suppose we have a class department and
there are several professors' objects there in the department. Now if the
department class is destroyed then the professor's object will become free to
bind with other objects. Because container objects (Department) only hold
the references of contained objects (Professor’s). So here is the weak
association between the objects. And this weak association is
called Aggregation.
73. How is the creation of a String using new() different from that of a
literal?
When a String is formed as a literal with the assistance of an assignment
operator, it makes its way into the String constant pool so that String
Interning can take place. This same object in the heap will be referenced by a
different String if the content is the same for both of them.
public bool checking() {
String first = "InterviewBit";
String second = "InterviewBit";
if (first == second)
return true;
else
return false;
}
The checking() function will return true as the same content is referenced by
both the variables.
Conversely, when a String formation takes place with the help of a new()
operator, interning does not take place. The object gets created in the heap
memory even if the same content object is present.
public bool checking() {
String first = new String("InterviewBit");
String second = new String("InterviewBit");
if (first == second)
return true;
else
return false;
}
The checking() function will return false as the same content is not
referenced by both the variables.
Both ‘new’ and ‘newInstance()’ operators are used to creating objects. The
difference is- that when we already know the class name for which we have
to create the object then we use a new operator. But suppose we don’t know
the class name for which we need to create the object, Or we get the class
name from the command line argument, or the database, or the file. Then in
that case we use the ‘newInstance()’ operator.
Moreover, exhaustion of the heap memory takes place if objects are created
in such a manner that they remain in the scope and consume memory. The
developer should make sure to dereference the object after its work is
accomplished. Although the garbage collector endeavors its level best to
reclaim memory as much as possible, memory limits can still be exceeded.
No synchronization:
package anonymous;
public class Counting {
private int increase_counter;
public int increase() {
increase_counter = increase_counter + 1;
return increase_counter;
}
}
If a thread Thread1 views the count as 10, it will be increased by 1 to 11.
Simultaneously, if another thread Thread2 views the count as 10, it will be
increased by 1 to 11. Thus, inconsistency in count values takes place because
the expected final value is 12 but the actual final value we get will be 11.
With synchronization:
package anonymous;
public class Counting {
private int increase_counter;
public synchronized int increase() {
increase_counter = increase_counter + 1;
return increase_counter;
}
}
If a thread Thread1 views the count as 10, it will be increased by 1 to 11, then
the thread Thread2 will view the count as 11, it will be increased by 1 to 12.
Thus, consistency in count values takes place.
78. What will be the output of the below java program and define the
steps of Execution of the java program with the help of the below code?
class InterviewBit{
int i;
static int j;
{
System.out.println(" Instance Block 1. Value of i = "+i);
}
static{
System.out.println(" Static Block 1. Value of j = "+j);
method_2();
}
{
i = 5;
}
static{
j = 10;
}
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
public static void main(String[] args){
InterviewBit ib = new InterviewBit();
}
public void method_1(){
System.out.println(" Instance method. ");
}
static{
System.out.println(" Static Block 2. Value of j = "+j);
}
{
System.out.println(" Instance Block 2. Value of i = "+i);
method_1();
}
public static void method_2(){
System.out.println(" Static method. ");
}
}
This is a java tricky interview question frequently asked in java interviews for
the experienced. The output will be like this because, when the java program
is compiled and gets executed, then there are various steps followed for
execution. And the steps are -
Now from the above code, the execution will happen like this -
static int j.
static block.
main method.
static method_2.
During identification, the JVM will assign the default value in the static int j
variable. Then it is currently in the state of reading and indirectly writing.
Because the original value is not assigned.
2. In the next step, it will execute the static block and assign the value in
static variables.
First static block it will print and because execution from top to bottom and
original value in j is not assigned. So it will print the default value of 0.
After executing static block 1. It will execute the static method_1 because it is
called from the static block 1.
Then it will assign the original value of 5 in the j variable. And executes the
remaining static block.
3. Now it will execute the main method. In which it will create an object for
the class InterviewBit. And then the execution of instances will happen.
int i.
Instance block 1.
Instance method_1.
Like a static variable, the instance variable also has been initialized with the
default value 0 and will be in the state of reading and writing indirectly.
5. It will execute the instance methods and assign the original value to the
instance variable.
Prints the Instance block 1. And the current value of i is not assigned till now,
so it will print 0.
Assign the original value to i. Then print instance block 2. And after that
instance method will be called and printed because it is being called in the
instance block.
6. And at the last step, the constructor will be invoked and the lines will be
executed in the constructor.
New – When the instance of the thread is created and the start() method has
not been invoked, the thread is considered to be alive and hence in the NEW
state.
Runnable – Once the start() method is invoked, before the run() method is
called by JVM, the thread is said to be in RUNNABLE (ready to run) state. This
state can also be entered from the Waiting or Sleeping state of the thread.
Running – When the run() method has been invoked and the thread starts
its execution, the thread is said to be in a RUNNING state.
Non-Runnable (Blocked/Waiting) – When the thread is not able to run
despite the fact of its aliveness, the thread is said to be in a NON-RUNNABLE
state. Ideally, after some time of its aliveness, the thread should go to a
runnable state.
o A thread is said to be in a Blocked state if it wants to enter synchronized
code but it is unable to as another thread is operating in that synchronized
block on the same object. The first thread has to wait until the other thread
exits the synchronized block.
o A thread is said to be in a Waiting state if it is waiting for the signal to
execute from another thread, i.e it waits for work until the signal is received.
Terminated – Once the run() method execution is completed, the thread is
said to enter the TERMINATED step and is considered to not be alive.
The following flowchart clearly explains the lifecycle of the thread in Java.
The main advantage of having an ordered array is the reduced search time
complexity of O(log n) whereas the time complexity in an unordered array
is O(n).
The main drawback of the ordered array is its increased insertion time which
is O(n) due to the fact that its element has to reordered to maintain the order
of array during every insertion whereas the time complexity in the unordered
array is only O(1).
Considering the above 2 key points and depending on what kind of scenario
a developer requires, the appropriate data structure can be used for
implementation.
82. Is it possible to import the same class or package twice in Java and
what happens to it during runtime?
This is a big NO. We need to understand that the importing of the sub-
packages of a package needs to be done explicitly. Importing the parent
package only results in the import of the classes within it and not the
contents of its child/sub-packages.
Marker interfaces, also known as tagging interfaces are those interfaces that
have no methods and constants defined in them. They are there for helping
the compiler and JVM to get run time-related information regarding the
objects.
doSomething(stringSets);
}
In the above example, we see that the stringSets were initialized by using
double braces.
The first brace does the task of creating an anonymous inner class that has
the capability of accessing the parent class’s behavior. In our example, we are
creating the subclass of HashSet so that it can use the add() method of
HashSet.
The second braces do the task of initializing the instances.
Care should be taken while initializing through this method as the method
involves the creation of anonymous inner classes which can cause problems
during the garbage collection or serialization processes and may also result
in memory leaks.
87. Why is it said that the length() method of String class doesn't return
accurate results?
The length method returns the number of Unicode units of the String. Let's
understand what Unicode units are and what is the confusion below.
We know that Java uses UTF-16 for String representation. With this Unicode,
we need to understand the below two Unicode related terms:
o Code Point: This represents an integer denoting a character in the code
space.
o Code Unit: This is a bit sequence used for encoding the code points. In order
to do this, one or more units might be required for representing a code
point.
Under the UTF-16 scheme, the code points were divided logically into 17
planes and the first plane was called the Basic Multilingual Plane (BMP). The
BMP has classic characters - U+0000 to U+FFFF. The rest of the characters-
U+10000 to U+10FFFF were termed as the supplementary characters as they
were contained in the remaining planes.
o The code points from the first plane are encoded using one 16-bit code unit
o The code points from the remaining planes are encoded using two code
units.
“bit” would have been the result printed if the letters were used in double-
quotes (or the string literals). But the question has the character literals
(single quotes) being used which is why concatenation wouldn't occur. The
corresponding ASCII values of each character would be added and the result
of that sum would be printed.
The ASCII values of ‘b’, ‘i’, ‘t’ are:
‘b’ = 98
‘i’ = 105
‘t’ = 116
98 + 105 + 116 = 319
89. What are the possible ways of making object eligible for garbage
collection (GC) in Java?
First Approach: Set the object references to null once the object creation
purpose is served.
public class IBGarbageCollect {
public static void main (String [] args){
String s1 = "Some String";
// s1 referencing String object - not yet eligible for GC
s1 = null; // now s1 is eligible for GC
}
}
91. What is the best way to inject dependency? Also, state the reason.
92. How we can set the spring bean scope. And what supported scopes
does it have?
Singleton
Prototype
Request
Session
Global-session
Java Design patterns are categorized into the following different types. And
those are also further categorized as
Structural patterns:
Adapter
Bridge
Filter
Composite
Decorator
Facade
Flyweight
Proxy
Behavioral patterns:
Interpreter
Template method/ pattern
Chain of responsibility
Command pattern
Iterator pattern
Strategy pattern
Visitor pattern
J2EE patterns:
MVC Pattern
Data Access Object pattern
Front controller pattern
Intercepting filter pattern
Transfer object pattern
Creational patterns:
Factory method/Template
Abstract Factory
Builder
Prototype
Singleton
95. Assume a thread has a lock on it, calling the sleep() method on that
thread will release the lock?
A thread that has a lock won't be released even after it calls sleep(). Despite
the thread sleeping for a specified period of time, the lock will not be
released.
return word.charAt(word.length()- 1) +
getReverseWord(word.substring(0, word.length() - 1));
}
}
In the above code, we are printing the base 2 Fibonacci values 0 and 1. And
then based on the length of Fibonacci to be printed, we are using the helper
function to print that.
98. Write a Java program to check if the two strings are anagrams.
The main idea is to validate the length of strings and then if found equal,
convert the string to char array and then sort the arrays and check if both are
equal.
import java.util.Arrays;
import java.util.Scanner;
public class InterviewBit {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//Input from two strings
System.out.print("First String: ");
String string1 = s.nextLine();
System.out.print("Second String: ");
String string2 = s.nextLine();
// check for the length
if(string1.length() == string2.length()) {
// convert strings to char array
char[] characterArray1 = string1.toCharArray();
char[] characterArray2 = string2.toCharArray();
// sort the arrays
Arrays.sort(characterArray1);
Arrays.sort(characterArray2);
// check for equality, if found equal then anagram, else not an anagram
boolean isAnagram = Arrays.equals(characterArray1, characterArray2);
System.out.println("Anagram: "+ isAnagram);
}
}
Idea is to find the sum of n natural numbers using the formula and then
finding the sum of numbers in the given array. Subtracting these two sums
results in the number that is the actual missing number. This results in O(n)
time complexity and O(1) space complexity.
public class IBMissingNumberProblem {
int[] array={4,3,8,7,5,2,6};
int missingNumber = findMissingNum(array);
System.out.println("Missing Number is "+ missingNumber);
}
public static int findMissingNum(int[] array) {
int n=array.length+1;
int sumOfFirstNNums=n*(n+1)/2;
int actualSumOfArr=0;
for (int i = 0; i < array.length; i++) {
actualSumOfArr+=array[i];
}
return sumOfFirstNNums-actualSumOfArr;
}
}
//Pointers.
int i = 0, j = str.length()-1;
In the above code, we are storing the last character from the string to the
first and the first value to the last in the output character array. And doing
the same thing in the loop for the remaining 2nd to n-1 characters. This is
how the string will be reversed.
104. Write a Java program to rotate arrays 90 degree clockwise by
taking matrices from user input.
mport java.util.Scanner;
public class InterviewBit
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int no;
System.out.print("Enter size of Array : ");
no = sc.nextInt();
int[][] a = new int[no][no];
System.out.print("Enter "+ no*no+" Element Array : ");
System.out.println("\n");
//Rotation
//Transpose
for(int i = 0; i < no; i++){
for(int j = i; j < no; j++){
int temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
In the above code, for rotating the matrix to 90 degrees we are first
transposing the matrix so the row becomes the column. And after that, we
are reversing each row in the matrix. So this is how the matrix got rotated.
105. Write a java program to check if any number given as input is the
sum of 2 prime numbers.
Example :
Input - 18
Output -
18 = 13 + 5
18 = 11 + 7
public class InterviewBit
{
// Method to Check Prime Number
private static int check_prime(int num){
int flag = 0;
for(int i = 2; i<=num/2; i++){
if(num%i == 0){
flag = 1;
return 1;
}
}
if(flag == 0)
return 0;
return 1;
}
// Method to get print the prime sum
private static void find(int num){
for(int i = 2; i <= num/2; i++){
if(check_prime(i) == 0){
if(check_prime(num-i) == 0)
System.out.println(num + " = "+ (num-i) + " "+ i);
}
}
}
public static void main(String[] args) {
find(18);
}
}
In the above code, for any number n, we find all the 2 pairs of numbers that
are added together resulting in n. And each checking number if it is prime. If
it is prime then we are printing that.
106. Write a Java program for solving the Tower of Hanoi Problem.
public class InterviewBit
{
//Recursive Method for Solving the Tower of hanoi.
private static void TOH(char source, char auxiliary, char destination,
int numOfDisk){
if (numOfDisk > 0){
TOH(source, destination, auxiliary, numOfDisk-1);
System.out.println("Move 1 disk from "+source+" to
"+destination+" using "+auxiliary+".");
TOH(auxiliary, source, destination, numOfDisk-1);
}
}
public static void main(String[] args) {
TOH('A','B','C', 3);
}
}
In the above code we are first moving the n-1 disk from Tower A to Tower B,
then moving that nth disk from Tower A to Tower C, and finally, the
remaining n-1 disk from Tower B to Tower C. And we are doing this
recursively for the n-1 disk.
//Calculating Mid.
int mid = (low + high)/2;
//Base Case.
if(low > high)
return false;