北京2018java中级开发工程师面试题汇总

1.单例有那五中方式:


/**
 * @author lei
 * 单例模式的五种写法:
 * 1、懒汉
 * 2、恶汉
 * 3、静态内部类
 * 4、枚举
 * 5、双重校验锁
 * 2011-9-6
 */
/**
 *五、 双重校验锁,在当前的内存模型中无效
 */
class LockSingleton{
    private volatile static LockSingleton singleton;
    private LockSingleton(){}

    //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
    public static LockSingleton getInstance(){
        if(singleton==null){
            synchronized(LockSingleton.class){
                if(singleton==null){
                    singleton=new LockSingleton();
                }
            }
        }
        return singleton;
    }

}
/**
 * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
 */
enum EnumSingleton{
    INSTANCE;
    public void doSomeThing(){
    }
}
/**
 * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
 */
class InternalSingleton{
    private static class SingletonHolder{
        private final static  InternalSingleton INSTANCE=new InternalSingleton();
    }   
    private InternalSingleton(){}
    public static InternalSingleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}
/**
 * 二、恶汉,缺点:没有达到lazy loading的效果
 */
class HungrySingleton{
    private static HungrySingleton singleton=new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return singleton;
    }
}
/**
 * 一、懒汉,常用的写法
 */
class LazySingleton{
    private static LazySingleton singleton;
    private LazySingleton(){
    }
    public static LazySingleton getInstance(){
        if(singleton==null){
            singleton=new LazySingleton();
        }
        return singleton;
    }   
}

2.静态代码块,构造快,构造方法,父类和子类的执行先后顺序

首先是 : 静态代码块>构造代码块>构造方法
其次是:继承时先父类,后子类。故应该是 父类静态块执行后,子类静态块执行,后父类构造代码块,后父类的构造方法,后子类的构造代码块,子类的构造方法。
具体事例为:

public class HelloB extends HelloA {  
     public HelloB(){
     }  
     {  
         System.out.println("I’m B class");  
     }  
     static{  
         System.out.println("static B");  
     }  
     public static void main(String[] args){  
         new HelloB();  
     }  
} 

class HelloA{  
     public HelloA(){  
     }  
     {  
        System.out.println("I’m A class");  
     }  
     static{  
         System.out.println("static A");  
     }  
}
当涉及到继承时,按照如下顺序执行:
1、执行父类的静态代码块 
static {
        System.out.println("static A");
    }
输出:static A

2、执行子类的静态代码块
static {
        System.out.println("static B");
    }
输出:static B
3、执行父类的构造代码块
{
        System.out.println("I’m A class");
    }
输出:I'm A class
4、执行父类的构造函数
public HelloA() {
    }
输出:无
5、执行子类的构造代码块
{
        System.out.println("I’m B class");
    }
输出:I'm B class
6、执行子类的构造函数
public HelloB() {
    }
输出:无

那么,最后的输出为:
static A
static B
I'm A class
I'm B class

3.数据库的行变列转换题(各科目的成绩例题)。
4.会话跟踪技术,九大内置对象。
5.JVM的gc回收算法有哪些?大致说下原理。gc算法

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/79747558