其他
挑战 10 道超难 Java 面试题
1.为什么等待和通知是在 Object 类而不是 Thread 中声明的?
一个线程 一个监视器(任何对象)
2.为什么Java中不支持多重继承?
A foo()
/ \
/ \
foo() B C foo()
\ /
\ /
D foo()
3.为什么Java不支持运算符重载?
4.为什么 String 在 Java 中是不可变的?
String A="Test";
String B="Test";
5.为什么 char 数组比 Java 中的 String 更适合存储密码?
String strPassword =“Unknown”;
char [] charPassword = new char [] {'U','n','k','w','o','n'};
System.out.println(“字符密码:”+ strPassword);
System.out.println(“字符密码:”+ charPassword);
字符串密码:Unknown
字符密码:[C @110b053
6.如何使用双重检查锁定在 Java 中创建线程安全的单例?
为什么枚举单例在 Java 中更好
Java 枚举和单例模式
在 Java 中使用枚举的单例
/**
* 使用 Java 枚举的单例模式示例
*/
public enum EasySingleton{
INSTANCE;
}
具有双检查锁定的单例示例
/**
* 单例模式示例,双重锁定检查
*/
public class DoubleCheckedLockingSingleton{
private volatile DoubleCheckedLockingSingleton INSTANCE;
private DoubleCheckedLockingSingleton(){}
public DoubleCheckedLockingSingleton getInstance(){
if(INSTANCE == null){
synchronized(DoubleCheckedLockingSingleton.class){
//double checking Singleton instance
if(INSTANCE == null){
INSTANCE = new DoubleCheckedLockingSingleton();
}
}
}
return INSTANCE;
}
}
单例模式用静态工厂方法
/**
* 单例模式示例与静态工厂方法
*/
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
//readResolve to prevent another instance of Singleton
private Object readResolve(){
return INSTANCE;
}
7. 编写 Java 程序时, 如何在 Java 中创建死锁并修复它?
如何避免 Java 线程死锁?
面试问题总是以“什么是死锁?”开始
如何检测 Java 中的死锁?
编写一个将导致死锁的Java程序?
/**
* Java 程序通过强制循环等待来创建死锁。
*
*
*/
public class DeadLockDemo {
/*
* 此方法请求两个锁,第一个字符串,然后整数
*/
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");
}
}
}
}
如何避免Java中的死锁?
public class DeadLockFixed {
/**
* 两种方法现在都以相同的顺序请求锁,首先采用整数,然后是 String。
* 你也可以做反向,例如,第一个字符串,然后整数,
* 只要两种方法都请求锁定,两者都能解决问题
* 顺序一致。
*/
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");
}
}
}
}
8. 如果你的Serializable类包含一个不可序列化的成员,会发生什么?你是如何解决的?
Java 序列化相关的常见问题
关于Java序列化的10个面试问题
什么是 Java 序列化
如何序列化
9. 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
Producer 线程测试条件(缓冲区是是否完整)并确认必须等待(找到缓冲区已满)。 Consumer 线程在使用缓冲区中的元素后设置条件。 Consumer 线程调用 notify() 方法; 这是不会被听到的,因为 Producer 线程还没有等待。 Producer 线程调用 wait() 方法并进入等待状态。
10.你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?
/**
*
* Java program which demonstrate that we can not override static method in Java.
* Had Static method can be overridden, with Super class type and sub class object
* static method from sub class would be called in our example, which is not the case.
*/
public class CanWeOverrideStaticMethod {
public static void main(String args[]) {
Screen scrn = new ColorScreen();
//if we can override static , this should call method from Child class
scrn.show(); //IDE will show warning, static method should be called from classname
}
}
class Screen{
/*
* public static method which can not be overridden in Java
*/
public static void show(){
System.out.printf("Static method from parent class");
}
}
class ColorScreen extends Screen{
/*
* static method of same name and method signature as existed in super
* class, this is not method overriding instead this is called
* method hiding in Java
*/
public static void show(){
System.err.println("Overridden static method in Child Class in Java");
}
}
Static method from parent class
推荐阅读1. 什么时候进行分库分表 ?2. 从 Java 程序员的角度理解加密3. IDEA 中使用 Git 图文教程4. 一文梳理 Redis 基础5. 优化你的 Spring Boot6. 数据库不使用外键的 9 个理由