定義了一個(gè)Set后,我想把它初始化一下.
方法一. 利用了add函數(shù)侦讨, 如下:
public static void main(String[] args) {
Set<String> testSet = new HashSet<String>();
testSet.add("Monday");
testSet.add("Sunday");
System.out.println(testSet);
}
但是總覺(jué)得這樣是不是有點(diǎn)麻煩易结,其實(shí)我也就使用一次请琳,還新建了一個(gè)對(duì)象,于是可以用下面的方法二
方法二.
System.out.println(new HashSet<String>() {{
add("morning");
add("afternoon");
}});
這種初始化的方法殊橙,比第一種要簡(jiǎn)單一些辐宾,利用的有兩個(gè)Java知識(shí)點(diǎn),一個(gè)是匿名內(nèi)部類膨蛮,一個(gè)是實(shí)例初始化塊叠纹。
所謂匿名內(nèi)部類也就是沒(méi)有名字的內(nèi)部類,一般只使用一次敞葛,并且必須要繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口誉察。而匿名內(nèi)部類的實(shí)現(xiàn)方式也就是當(dāng)新創(chuàng)建一個(gè)父類對(duì)象時(shí),后邊加一個(gè)大括號(hào)惹谐,即:
new HashMap(){};
當(dāng)定義一個(gè)類的時(shí)候持偏,一般會(huì)定義構(gòu)造函數(shù),有時(shí)候還會(huì)定義靜態(tài)函數(shù)和實(shí)例初始化塊氨肌,比如:
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");
}
}
新建一個(gè)對(duì)象鸿秆,運(yùn)行一下,會(huì)發(fā)現(xiàn)執(zhí)行順序?yàn)?br>
i am a static method
i am a object ini block
i am a constructor
那么既然之前我們定義了一個(gè)匿名內(nèi)部類怎囚,那么它和正常的類一樣卿叽,也會(huì)執(zhí)行響應(yīng)的初始化操作(匿名內(nèi)部類沒(méi)有構(gòu)造函數(shù)),這也就是我們初始化Set中的第二個(gè)大括號(hào),這個(gè)大括號(hào)定義了實(shí)例初始化塊考婴,所以在創(chuàng)建對(duì)象的時(shí)候就會(huì)被執(zhí)行贩虾。
System.out.println(new HashSet<String>() { ---這個(gè)括號(hào)用來(lái)創(chuàng)建內(nèi)部匿名類
{ -----這個(gè)括號(hào)表示是內(nèi)部匿名類的實(shí)例初始化塊
add("morning");
add("afternoon");
}
});
補(bǔ)充:對(duì)于這樣的匿名類,是無(wú)法獲取它的對(duì)象的沥阱。
方法三:
如果是利用數(shù)組初始化缎罢,還可以這樣:
String s = "a,b,c,d,e,f";
Set<String >actionSet = new HashSet<>(Arrays.asList(s.split(",")));