Java中ArrayList的初始化并赋值技巧

393 阅读1分钟

Kotlin中初始化并赋值ArrayList

  • 我们想对ArrayList初始化并赋值,可以直接这样写,语法糖为我们做不少工作。
val arr = arrayListOf("Mark", "Tom", "Colin")
  • 或者用Kotlin标准库提供的作用域函数(Scope Function)中的apply函数
val arr = arrayListOf<String>().apply {  
    add("Mark")  
    add("Tom")  
    add("Colin")  
}

Java中初始化并赋值ArrayList

  • 在Java中,对ArrayList初始化赋值并赋值,正常的写法是这么写
ArrayList<String> arr = new ArrayList<>();  
arr.add("Mark");  
arr.add("Tom");  
arr.add("Colin");
  • 看起来略写繁琐,在某些场景,比如验证想快速初始化赋值,或者验证算法题的时候,或者自动生成的代码(Arouter在哈希表中塞传递的参数就是这个初始化的),可以这么写。
// ARouter自动生成的代码
new java.util.HashMap<String, Integer>(){{put("param0", 11); put("param1", 8); }}


ArrayList<String> arr = new ArrayList<>() {{  
    add("Mark");  
    add("Tom");  
    add("Colin");  
}};
  • 有两层{},
    • 外层大括号的作用是生成了一个匿名内部类,可以对这个新类做一些修改,这里注意此时arr的类型其实是ArrayList的匿名子类了;
    • 内层大括号的含义是Java的构造代码块 {}(其执行时机早于构造函数)。通过两者结合使用减少了一些重复代码。
class ExampleClass {  
    static {
        // 静态代码块,JVM加载类的时候执行,  
        System.out.println("I am a static code block");  
    }  

    {  
        // 构造代码块,执行时机早于构造函数,每次对象创建都会调用。  
        System.out.println("I am a constructor code block");  
    }  
  
    public ExampleClass() {  
        System.out.println("I am a constructor");  
    }  
}
  • 在项目中最好别用两个大括号的方式初始化,可读性很低。