Java面试准备

Java面试题

  1. 操作数栈的题:
1
2
3
4
5
6
7
8
9
public static void main(String[] args){
int i = 1;
i = i++;
int j = i++;
ink k = i + ++i * i++;
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}

重点:字节码,i++,操作数栈,运算符优先级

=运算符是最后运算的

操作数栈压入参数的顺序是=后从左到右依次压入,而四则运算何时进行并不是依次的,而是要考虑运算符优先级。

+-*/四则运算需要将变量先压入操作数栈在取出操作数栈中的数进行运算后再将临时结果压入操作数栈中,等待取出结果。

++运算符是直接对局部变量表中的变量直接操作的,不经过操作数栈。

结果输出:

1
2
3
i = 4
j = 1
k = 11
  1. 单例模式Singleton

特点

  • 只能有一个实例
    • 构造器
  • 必须自行创建实例
    • 使用一个静态变量来保存这个唯一的实例
  • 必须自行向系统提供该实例
    • 直接暴露
    • 静态变量的get方法获取

常见形式:

  • 饿汉式:直接创建对象,不存在线程安全问题

    - 直接实例化饿汉式(简洁直观)
    
    1
    2
    3
    4
    5
    6
    7
    // 不考虑是否需要实例该单例
    // 静态变量
    public static final Singleton instance = new Singleton();
    // 构造器
    private Singleton(){

    }
    - 枚举式(最简洁)
    
    1
    2
    3
    4
    5
    // 表示该类型的对象是有限的几个
    public enum Singleton{
    INSTANCE1,
    INSTANCE2
    }
    - 静态代码块饿汉式(适合复杂实例化)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static final Singleton INSTANCE;
    static{
    INSTANCE = new Singleton();
    ...
    //需要进行一定的初始化
    //或者需要从文件中获取属性值
    }
    private Singleton(){

    }
  • 懒汉式:延迟创建对象

    - 线程不安全(适用于单线程)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private static Singleton instance;
    private Singleton(){

    }
    public static Singleton getInstance(){
    if(instance == null){
    instance = new Singleton();
    }
    return instance;
    }
    - 线程安全(适用于多线程)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private static Singleton instance;
    private Singleton(){

    }
    public static Singleton getInstance(){
    if(instance == null){
    synchronized (Singleton.class){
    if (instance == null){
    try{
    Thread.sleep(100);
    }catch(Exception e){
    e.printStackTrace();
    }

    instance = new Singleton();
    }
    }
    }
    return instance;
    }
    - 静态内部类形式(适用于多线程)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private Singleton(){

    }
    // 在内部类加载和初始化时创建的,因此是线程安全的
    private static class Inner{
    private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance(){
    return Inner.INSTANCE;
    }