定義了一個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(",")));