200个最常见的JAVA面试问题
本文内容:
- 20个最常见的JAVA面试问题(附答案)
- 13个单例模式JAVA面试问题(附答案)
- 说说JVM和垃圾收集是如何工作的(附答案)
- 说说如何避免JAVA线程死锁(附答案)
- Java中HashSet和HashMap的区别(附答案)
- Java面试中和Collection有关的10个问题(附答案)
- Java面试中和Spring相关的10个问题(附答案)
- 30个C/C++/Java面试中的常见算法问题
- Stackoverflow中回复超过20的算法问题
- 面试攻略
- 微软面试技术题(附答案)
20个最常见的JAVA面试问题(附答案)
String s = new String(“Test”);
does not put the object in String pool , we need to call String.intern() method
which is used to put them into String pool explicitly. its only when
you create String object as String literal e.g. String s =
“Test” Java automatically put that into String pool.
sufficient but here it is “Substring creates new object out of source
string by taking a portion of original string”. see my post How
SubString works in Java for detailed answer of this Java question.
equals and hashcode method in Java. Read How HashMap works in Java for
detailed explanation on how equals and hashcode method is used to put
and get object from HashMap. You can also see my post 5 tips to
correctly override equals in Java to learn more about equals.
previous Java question and candidate should know that once you
mention hashCode, people are most likely ask How its used in HashMap.
See How HashMap works in Java for detailed explanation.
he didn\’t mind telling me. my take is that stored procedure should
return error code if some operation fails but if stored procedure itself
fail than catching SQLException is only choice.
multi-threading question answers, Its getting popular day by day because
of huge demand of Java developer with good concurrency skill. Answer of
this Java interview question 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 throws an exception and if it was submitted with execute 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 submit and that terminates with an exception, the Future.get will re-throw this exception, wrapped in an ExecutionException.
@Raj suggested
Abstract Factory provides one
more level of abstraction. Consider different factories each extended
from an Abstract Factory and responsible for 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 creation of objects in that genre.
a Singleton class. Creating Singleton was tricky prior Java 4 but
once Java 5 introduced Enum its very easy. see my article How to create
thread-safe Singleton in Java for more details on writing Singleton
using enum and double checked locking which is purpose of this Java interview question.
expecting candidate to write Java singleton using double checked
locking. Remember to use volatile variable to make Singleton
thread-safe. check 10 Interview questions on Singleton Pattern in
Java for more details and questions answers
12. Can you write code for iterating over hashmap in Java 4 and Java 5 ?
13. When do you override hashcode and equals() ?
Whenever
necessary especially if you want to do equality check or want to use
your object as key in HashMap. check this for writing equals method
correctly 5 tips on equals in Java
14. What will be the problem if you don\’t override hashcode() method ?
You will not be able to recover your object from hash Map if that is used as key in HashMap.
See here How HashMap works in Java for detailed explanation.
15. Is it better to synchronize critical section of getInstance() method or whole getInstance() method ?
Answer
is critical section because if we lock whole method than every time
some one call this method will have to wait even though we are not
creating any object)
16. What is the difference when String is gets created using literal or new() operator ?
When
we create string with new() its created in heap and not added into
string pool while String created using literal are created in String
pool itself which exists in Perm area of heap.
17. Does not overriding hashcode() method has any performance implication ?
This
is a good question and open to all , as per my knowledge a poor
hashcode function will result in frequent collision in HashMap which
eventually increase time for adding an object into Hash Map.
18. What’s wrong using HashMap in multithreaded environment? When get() method go to infinite loop ?
Another good question. His answer was during concurrent access and re-sizing.
19. Give a simplest way to find out the time a method takes for execution without using any profiling tool?
this questions is suggested by @Mohit
Read
the system time just before the method is invoked and immediately after
method returns. Take the time difference, which will give you the time
taken by a method for execution.
To put it in code…
long start = System.currentTimeMillis ();
method ();
long end = System.currentTimeMillis ();
System.out.println (“Time taken for execution is ” + (end – start));
Remember
that if the time taken for execution is too small, it might show that
it is taking zero milliseconds for execution. Try it on a method which
is big enough, in the sense the one which is doing considerable amout of
processing
13个单例模式JAVA面试问题
Here
they will check whether candidate has enough experience on usage of
singleton or not. Does he is familiar of advantage/disadvantage or
alternatives available for singleton in Java or not.
to whole application and whole only one instance is viable is candidate
of becoming Singleton. One example of this is Runtime class , since on
whole java application only one runtime environment can be possible
making Runtime Singleton is right decision. Another example is a utility
classes like Popup in GUI application, if you want to show popup
with message you can have one PopUp class on whole GUI application and
anytime just get its instance, and call show() withmessage.
2) Can you write code for getInstance() method of a Singleton class in Java?
Most
of the java programmer fail here if they have mugged up the singleton
code because you can ask lots of follow-up question based upon the code
they have written. I have seen many programmer write
Singleton getInstance() method with double checked locking but they are
not really familiar with the caveat associated with double checking of
singleton prior to Java 5.
checked locking as it is more complex and chances of errors are more but
if you have deep knowledge of double checked locking, volatile
variable and lazy loading than this is your chance to shine. I have
shared code examples of writing singleton classes using enum, using
static factory and with double checked locking in my recent post Why
Enum Singletons are better in Java, please see there.
This
is really nice question and I mostly asked to just
quickly check whether candidate is aware of performance trade off of
unnecessary locking or not. Since locking only make sense when we need
to create instance and rest of the time its just read only access so
locking of critical section is always better option. read more about
synchronization on How Synchronization works in Java
Answer: This
is again related to double checked locking pattern, well
synchronization is costly and when you apply this on whole method than
call to getInstance() will be synchronized and contented. Since
synchronization is only needed during initialization on singleton
instance, to prevent creating another instance of Singleton, It’s
better to only synchronize critical section and not whole method.
Singleton pattern is also closely related to factory design
pattern where getInstance() serves as static factory method.
4) What is lazy and early loading of Singleton and how will you implement it?
This
is another great Singleton interview question in terms of understanding
of concept of loading and cost associated with class loading in Java.
Many of which I have interviewed not really familiar with this but its
good to know concept.
Singleton class with static final instance initialized during class
loading. Former is called lazy loading because Singleton instance is
created only when client calls getInstance() method while later is
called early loading because Singleton instance is created when class is
loaded into memory.
5) Example of Singleton in standard Java Development Kit?
This is open question to all, please share which classes are Singleton in JDK. Answer to this question is java.lang.Runtime
Answer: There are many classes in Java Development Kit which is written using singleton pattern, here are few of them:
- Java.lang.Runtime with getRuntime() method
- Java.awt.Toolkit with getDefaultToolkit()
- Java.awt.Desktop with getDesktop()
6) What is double checked locking in Singleton?
One
of the most hyped question on Singleton pattern and really
demands complete understanding to get it right because of Java
Memory model caveat prior to Java 5. If a guy comes up with a solution
of using volatile keyword with
Singleton instance and explains it then it really shows it has in depth
knowledge of Java memory model and he is constantly updating his Java
knowledge.
prevent creating another instance of Singleton when call to
getInstance() method is made in multi-threading environment. In Double
checked locking pattern as shown in below example, singleton instance is
checked two times before initialization.
if(_INSTANCE == null){
synchronized(Singleton.class){
//double checked locking – because second check of Singleton instance with lock
if(_INSTANCE == null){
_INSTANCE = new Singleton();
}
}
}
return _INSTANCE;
}
requirement for lazy initialization otherwise use Enum to implement
singleton or simple static final variable.
7) How do you prevent for creating another instance of Singleton using clone() method?
This type of questions generally comes some time by asking how to break singleton or when Singleton is not Singleton in Java.
Answer: Preferred
way is not to implement Clonnable interface as why should one wants to
create clone() of Singleton and if you do just throw Exception
from clone() method as “Can not create clone of Singleton class”.
8) How do you prevent for creating another instance of Singleton using reflection?
Open to all. In my opinion throwing exception from constructor is an option.
Answer: This
is similar to previous interview question. Since constructor of
Singleton class is supposed to be private it prevents creating instance
of Singleton from outside but Reflection can access private fields and
methods, which opens a threat of another instance. This can be avoided
by throwing Exception from constructor as “Singleton already
initialized”
Another
great question which requires knowledge of Serialization in Java and
how to use it for persisting Singleton classes. This is open to you all
but in my opinion use of readResolve() method can sort this out for you.
Answer:
You can prevent this by using readResolve() method, since during
serialization readObject() is used to create instance and it return new
instance every time but by using readResolve you can replace it with
original Singleton instance. I have shared code on how to do it in my
post Enum as Singleton in Java. This is also one of the reason I have
said that use Enum to create Singleton because serialization of enum is
taken care by JVM and it provides guaranteed of that.
10) When is Singleton not a Singleton in Java?
There
is a very good article present in Sun\’s Java site which discusses
various scenarios when a Singleton is not really remains Singleton and
multiple instance of Singleton is possible. Here is the link of that
article http://java.sun.com/developer/technicalArticles/Programming/singletons/
contribute few more questions, which I included here. Thank you guys for
your contribution.
access to a singleton gets the object through its constructors or with a
DI-container.
calling getInstance the code gets more and more tightly coupled,
monolithic, not testable and hard to change and hard to reuse because of
not configurable, hidden dependencies. Also, there would be no need for
this clumsy double checked locking if you call getInstance less often
(i.e. once).
Answer: I know at least four ways to implement Singleton pattern in Java
1) Singleton by synchronizing getInstance() method
2) Singleton with public static final field initialized during class loading.
3) Singleton generated by static nested class, also referred as Singleton holder pattern.
4) From Java 5 on-wards using Enums
13) How to write thread-safe Singleton in Java?
code which creates one and only one instance of Singleton if called by
multiple thread at same time. There are many ways to achieve this like
by using double checked locking technique as shown above and by
using Enum or Singleton initialized by class loader.
15) When to choose Singleton over Static Class?
16) Can you replace Singleton with Static Class in Java?
17) Difference between Singleton and Static Class in java?
18) Advantage of Singleton over Static Class?
I have covered answers of couple of these questions in my post, Singleton vs Static Class in Java – Pros and Cons.
说说JVM和垃圾收集是如何工作的
1) objects are created on heap in Java
irrespective of there scope e.g. local or member variable. while its
worth noting that class variables or static members are created in
method area of Java memory space and both heap and method area is shared
between different thread.
2) Garbage collection is a mechanism provided by Java Virtual Machine to reclaim heap space from objects which are eligible for Garbage collection.
3) Garbage collection relieves java programmer from memory management which is essential part of C++ programming and gives more time to focus on business logic.
4) Garbage Collection in Java is carried by a daemon thread called Garbage Collector.
5) Before removing an object from memory Garbage collection thread invokes finalize () method of that object and gives an opportunity to perform any sort of cleanup required.
6) You as Java programmer can not force Garbage collection in Java; it will only trigger if JVM thinks it needs a garbage collection based on Java heap size.
7) There are methods like System.gc () and Runtime.gc () which is used to send request of Garbage collection to JVM but it’s not guaranteed that garbage collection will happen.
8) If there is no memory space for creating new object in Heap Java Virtual Machine throws OutOfMemoryError or java.lang.OutOfMemoryError heap space
9) J2SE 5(Java 2 Standard Edition) adds a new feature called Ergonomics goal of ergonomics is to provide good performance from the JVM with minimum of command line tuning.
When an Object becomes Eligible for Garbage Collection
An Object becomes eligible for Garbage collection or GC if its not reachable from any live threads or any static refrences in other words you can say that an object becomes eligible for garbage collection if its all references are null. Cyclic dependencies are
not counted as reference so if Object A has reference of object B and
object B has reference of Object A and they don\’t have any other live
reference then both Objects A and B will be eligible for Garbage collection.
Generally an object becomes eligible for garbage collection in Java on following cases:
1) All references of that object explicitly set to null e.g. object = null
2) Object is created inside a block and reference goes out scope once control exit that block.
3)
Parent object set to null, if an object holds reference of another
object and when you set container object\’s reference null, child or
contained object automatically becomes eligible for garbage collection.
4) If an object has only live references via WeakHashMap it will be eligible for garbage collection. To learn more about HashMap see here How HashMap works in Java.
Heap Generations for Garbage Collection in Java
Java objects are created in Heap and Heap is divided into three parts or generations for sake of garbage collection in Java, these are called as Young generation, Tenured or Old Generation and Perm Area of heap.
New Generation is further divided into three parts known as Eden space, Survivor 1 and Survivor 2 space. When an object first created in heap its gets created in new generation inside Eden space and after subsequent Minor Garbage collection if object survives its gets moved to survivor 1 and then Survivor 2 before Major Garbage collection moved that object to Old or tenured generation.
Permanent generation of Heap or Perm Area of Heap is somewhat special and it is used to store Meta data related to classes and method in JVM, it also hosts String pool provided by JVM as discussed in my string tutorial why String is immutable in Java. There are many opinions around whether garbage collection in Java happens in perm area of java heap or not,
as per my knowledge this is something which is JVM dependent and
happens at least in Sun\’s implementation of JVM. You can also try this
by just creating millions of String and watching for Garbage collection or OutOfMemoryError.
Types of Garbage Collector in Java
Java Runtime (J2SE 5) provides various types of Garbage collection in Java which you can choose based upon your application\’s performance requirement. Java 5 adds three additional garbage collectors except serial garbage collector. Each is generational garbage collector which has been implemented to increase throughput of the application or to reduce garbage collection pause times.
1) Throughput Garbage Collector: This garbage collector in Java uses a parallel version of the young generation collector. It is used if the -XX:+UseParallelGC option is passed to the JVM via command line options . The tenured generation collector is same as the serial collector.
2) Concurrent low pause Collector: This Collector is used if the -Xingc or -XX:+UseConcMarkSweepGC is passed on the command line. This is also referred as Concurrent Mark Sweep Garbage collector.
The concurrent collector is used to collect the tenured generation and
does most of the collection concurrently with the execution of the
application. The application is paused for short periods during the
collection. A parallel version of the young generationcopying collector is
sued with the concurrent collector. Concurrent Mark Sweep Garbage
collector is most widely used garbage collector in java and it uses
algorithm to first mark object which needs to collected when garbage
collection triggers.
3) The Incremental (Sometimes called train) low pause collector: This collector is used only if –XX:+UseTrainGC is
passed on the command line. This garbage collector has not changed
since the java 1.4.2 and is currently not under active development. It
will not be supported in future releases so avoid using this and please
see 1.4.2 GC Tuning document for information on this collector.
Important point to not is that -XX:+UseParallelGC should not be used with -XX:+UseConcMarkSweepGC.
The argument passing in the J2SE platform starting with version 1.4.2
should only allow legal combination of command line options for garbage
collector but earlier releases may not find or detect all illegal
combination and the results for illegal combination are unpredictable.
It’s not recommended to use this garbage collector in java.
JVM Parameters for garbage collection in Java
Garbage collection tuning is a long exercise and requires lot of profiling of application and patience to get it right. While working with High volume low latency Electronic trading system I
have worked with some of the project where we need to increase
the performance of Java application by profiling and finding what
causing full GC and I found that Garbage collection tuning largely
depends on application profile, what kind of object application has and
what are there average lifetime etc. for example if an application has
too many short lived object then making Eden space wide enough or larger
will reduces number of minor collections. you can also control size of
both young and Tenured generation using JVM parameters for
example setting -XX:NewRatio=3 means that the ratio among the young and
tenured generation is 1:3 , you got to be careful on sizing these
generation. As making young generation larger will reduce size of tenured generation which will force Major collection to
occur more frequently which pauses application thread during that
duration results in degraded or reduced throughput. The parameters NewSize and MaxNewSize are used to specify the young generation size from below and above. Setting these equal to one another fixes the young generation.
In my opinion before doing garbage collection tuning detailed
understanding ofgarbage collection in java is must and I would recommend
reading Garbage collection document provided by Sun Microsystems for
detail knowledge of garbage collection in Java. Also to get a full list of JVM parameters for a particular Java Virtual machine please refer official documents on garbage
collection in Java. I found this link quite helpful though
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Full GC and Concurrent Garbage Collection in Java
Concurrent garbage collector in java uses a single garbage collector thread that runs concurrently with the application threads with
the goal of completing the collection of the tenured generation before
it becomes full. In normal operation, the concurrent garbage collector
is able to do most of its work with the application threads still
running, so only brief pauses are seen by the application threads. As a
fall back, if the concurrent garbage collector is
unable to finish before the tenured generation fill up, the application
is paused and the collection is completed with all the application
threads stopped. Such Collections with the application stopped are
referred as full garbage collections or full GC and are a sign that some adjustments need to be made to the concurrent collection parameters. Always try to avoid or minimize full garbage collection or Full GC because it affects performance of Java application.
When you work in finance domain for electronic trading platform and
with high volume low latency systems performance of java application
becomes extremely critical an you definitely like to avoid full GC
during trading period.
Summary on Garbage collection in Java
1) Java Heap is divided into three generation for sake of garbage collection. These are young generation, tenured or old generation and Perm area.
2) New objects are created into young generation and subsequently moved to old generation.
3) String pool is created in Perm area of Heap, garbage collection can occur in perm space but depends upon JVM to JVM.
4) Minor garbage collection is used to move object from Eden space to Survivor 1 and Survivor 2 space and Major collection is used to move object from young to tenured generation.
5) Whenever Major garbage collection occurs application threads stops during that period which will reduce application’s performance and throughput.
6) There are few performance improvement has been applied in garbage collection in java 6 and we usually use JRE 1.6.20 for running our application.
7) JVM command line options –Xmx and -Xms is used to setup starting and max size for Java Heap. Ideal ratio of this parameter is either 1:1 or 1:1.5 based upon my experience for example you can have either both –Xmx and –Xms as 1GB or –Xms 1.2 GB and 1.8 GB.
8) There is no manual way of doing garbage collection in Java
说说如何避免JAVA线程死锁(附答案)
questions starts with “What is deadlock ?“
answer is
simple , when two or more threads waiting for each other to release
lock and get stuck for infinite time , situation is called deadlock . it
will only happen in case of multitasking.
How do you detect deadlock in Java ?
though this could have many answers , my version is first I would look the code if
I see nested synchronized block or calling one synchronized method from
other or trying to get lock on different object then there is good
chance of deadlock if developer is not very careful.
other way is to find it when you actually get locked while running the application , try to take thread dump , in Linux you can do this by command “kill -3” , this will print status of all the thread in application log file and you can see which thread is locked on which object.
other way is to use jconsole , jconsole will show you exactly which threads are get locked and on which object.
once you answer this , they may ask you to write code which will result in deadlock ?
here is one of my version
public void method1(){
synchronized(String.class){
System.out.println(“Aquired lock on String.class object”);
synchronized (Integer.class) {
System.out.println(“Aquired lock on Integer.class object”);
}
}
}
public void method2(){
synchronized(Integer.class){
System.out.println(“Aquired lock on Integer.class object”);
synchronized (String.class) {
System.out.println(“Aquired lock on String.class object”);
}
}
}
If
method1() and method2() both will be called by two or many threads ,
there is a good chance of deadlock because if thead 1 aquires lock on
Sting object while executing method1() and thread 2 acquires lock on
Integer object while executing method2() both will be waiting for each
other to release lock on Integer and String to proceed further which
will never happen.
now interviewer comes to final part , one of the most important in my view , How to fix deadlock ? or How to avoid deadlock in Java ?
if
you have looked above code carefully you may have figured out that real
reason for deadlock is not multiple threads but the way they access
lock , if you provide an ordered access then problem will be resolved ,
here is
the fixed version.
public void method1(){
synchronized(Integer.class){
System.out.println("Aquired lock on Integer.class object");
synchronized (String.class) {
System.out.println("Aquired lock on String.class object");
}
}
}
public void method2(){
synchronized(Integer.class){
System.out.println("Aquired lock on Integer.class object");
synchronized (String.class) {
System.out.println("Aquired lock on String.class object");
}
}
}
Now there would not be any deadlock because both method is accessing lock on Integer and String object in same order . so if thread A acquires lock on Integer object , thread B will not proceed until thread A releases Integer lock , same way thread A will not be blocked even if thread B holds String lock because now thread B will not expect thread A to release Integer lock to proceed further
Java中HashSet和HashMap的区别
Java面试中和Collection有关的10个问题(附答案)
10个Java面试中和Spring相关的问题(附答案)
Some
of the reader requested to
provide Spring Security interview questions and answer, So i though to
update this article with few of Spring security question I came across.
Here are those:
How do you setup LDAP Authentication using Spring Security?
This
is a very popular Spring Security interview question as Spring provides
out of the box support to connect Windows Active directory for LDAP
authentication and with few configuration in Spring config file you can
have this feature enable. See How to perform LDAP authentication in Java
using Spring Security for detailed code explanation and sample.
How do you control concurrent Active session using Spring Security?
Another Spring interview question
which is based upon Out of box feature provided by Spring framework.
You can easily control How many active session a user can have with a
Java application by using Spring Security. See this spring security
example of how to control concurrent session in Java and Spring for
exact details.
now we have inverted the control of creating the object from our own
using new operator to container or framework. Now it’s the
responsibility of container to create object as required. We maintain
one xml file where we configure our components, services, all the
classes and their property. We just need to mention which service is
needed by which component and container will create the object for us.
This concept is known as dependency injection because all object dependency (resources) is injected into it by framework.
<property name=”newBid”/>
setter for newBid and container will instantiate newBid and set the
value automatically when it is used. This whole process is also called
wiring in Spring and by using annotation it can be done automatically
by Spring, refereed as auto-wiring of bean in Spring.
Ans: Spring framework is based on IOC so we call it as IOC container
also So Spring beans reside inside the IOC container. Spring beans are
nothing but Plain old java object (POJO).
property is defined inside the bean definition then it will also be set.
4. If the bean implements the BeanFactoryAware interface, the factory calls setBeanFactory(), passing an instance of itself.
5.
If there are any BeanPostProcessors associated with the bean, their
post- ProcessBeforeInitialization() methods will be called before the
properties for the Bean are set.
7.
If the Bean class implements the DisposableBean interface, then the
method destroy() will be called when the Application no longer needs the
bean reference.
\’destroy-method\’ attribute, then the corresponding method definition in
the Bean class will be called.
principles.it is used to make a clear separation between application
configuration and dependency from actual code.
XmlBeanFactory factory = new XmlBeanFactory(resorce);
often asks in entry level interview. ApplicationContext is preferred way
of using spring because of functionality provided by it and interviewer
wanted to check whether you are familiar with it or not.
ApplicationContext.
|
BeanFactory
|
Here we can have more than one config files possible
|
In this only one config file or .xml file
|
Application contexts can publish events to beans that are registered as listeners
|
Doesn’t support.
|
Support internationalization (I18N) messages
|
It’s not
|
Support application life-cycle events, and validation.
|
Doesn’t support.
|
Support many enterprise services such JNDI access, EJB integration, remoting
|
Doesn’t support.
|
Question 5: What are different modules in spring?
Prototype: means a single bean definition to any number of object instances.
There is an attribute in bean tag named ‘singleton’ if specified true
then bean becomes singleton and if set to false then the bean becomes a
prototype bean. By default it is set to true. So, all the beans in
spring framework are by default singleton beans.
<property name=”newBid”/>
</bean>
a complex concept and not every developer familiar with it. Transaction
management is critical in any applications that will interact with the
database. The application has to ensure that the data is consistent and
the integrity of the data is maintained. Two type of transaction
management is supported by spring
1. Programmatic transaction management
encapsulates behaviors affecting multiple classes into reusable modules.
AOP is a programming technique that allows developer to modularize
crosscutting concerns, that cuts across the typical divisions of
responsibility, such as logging and transaction management. Spring AOP, aspects are implemented using regular classes or regular classes annotated with the @Aspect annotation
an application at join points. Different types of advice include
“around,” “before” and “after” advice
AOP one. Similar to Object oriented programming, AOP is another
popular programming concept which complements OOPS. Join point is an
opportunity within code for which we can apply an aspect. In Spring AOP,
a join point always represents a method execution.