Java 创建 List 的时候直接赋值

示例代码

public class Test {

    private static List<String> list = new ArrayList<String>() { // 第一个花括号表示匿名内部类
        { // 第二花括号表示匿名内部类的构造代码块,可以有多个。构造代码块在构造函数前执行,匿名内部类的构造代码块在调用父类同参构造函数后执行
            this.add("A");
            this.add("B");
            add("C");
            add("D");
        }

        { // 匿名内部类的构造代码块
            this.add("E");
            add("F");
        }
    };

    public static void main(String[] args) {
        System.out.println(list);
    }
}

缺点

  1. 使用匿名内部类,会有效率上的损失。当然在大多数情况下,这点效率都是可接受的。
  2. 静态内部类持有所在外部类的引用。如果需要将 List 返回给到其他地方使用,可能造成内存泄漏。

等价于

public class MyList extends ArrayList {

    {
        this.add("A");
        this.add("B");
        add("C");
        add("D");
    }

}

public class Test {

    public static void main(String[] args) {
        System.out.println(new MyList());
    }
}

Java的四种代码块

用{}括起来的称为代码块:

  • 普通代码块:类中方法的方法体。
  • 构造代码块:类中{}直接括起来的语句,每次创建对象都会被调用,先于构造函数执行。
  • 静态代码块:类中static{}括起来的语句,只执行一次,先于构造代码块块执行。
  • 同步代码块:类中synchronized(){}括起来的语句,多线程环境下互斥执行。

替代方式

public class Test2 {

    private static List<String> list = new ArrayList<String>();

    static {
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
    }

    public static void main(String[] args) {
        System.out.println(list);
    }
}

你可能感兴趣的:(Java学习笔记,java)