定义了一个Set后,我想把它初始化一下.
方法一. 利用了add函数, 如下:
public static void main(String[] args) {
Set<String> testSet = new HashSet<String>();
testSet.add("Monday");
testSet.add("Sunday");
System.out.println(testSet);
}
但是总觉得这样是不是有点麻烦,其实我也就使用一次,还新建了一个对象,于是可以用下面的方法二
方法二.
System.out.println(new HashSet<String>() {{
add("morning");
add("afternoon");
}});
这种初始化的方法,比第一种要简单一些,利用的有两个Java知识点,一个是匿名内部类,一个是实例初始化块。
所谓匿名内部类也就是没有名字的内部类,一般只使用一次,并且必须要继承一个父类或者实现一个接口。而匿名内部类的实现方式也就是当新创建一个父类对象时,后边加一个大括号,即:
new HashMap(){};
当定义一个类的时候,一般会定义构造函数,有时候还会定义静态函数和实例初始化块,比如:
public class TestAnnoInnerClass {
TestAnnoInnerClass(){
System.out.println("i am a constructor");
}
static {
System.out.println("i am a static method");
}
{
System.out.println("i am a object ini block");
}
}
新建一个对象,运行一下,会发现执行顺序为
i am a static method
i am a object ini block
i am a constructor
那么既然之前我们定义了一个匿名内部类,那么它和正常的类一样,也会执行响应的初始化操作(匿名内部类没有构造函数),这也就是我们初始化Set中的第二个大括号,这个大括号定义了实例初始化块,所以在创建对象的时候就会被执行。
System.out.println(new HashSet<String>() { ---这个括号用来创建内部匿名类
{ -----这个括号表示是内部匿名类的实例初始化块
add("morning");
add("afternoon");
}
});
补充:对于这样的匿名类,是无法获取它的对象的。
方法三:
如果是利用数组初始化,还可以这样:
String s = "a,b,c,d,e,f";
Set<String >actionSet = new HashSet<>(Arrays.asList(s.split(",")));