关于Java Set的初始化方法

定义了一个Set后,我想把它初始化一下.

方法一. 利用了add函数, 如下:

public static void main(String[] args) {
        
        Set testSet = new HashSet();
        testSet.add("Monday");
        testSet.add("Sunday");
        System.out.println(testSet);
    }

但是总觉得这样是不是有点麻烦,其实我也就使用一次,还新建了一个对象,于是可以用下面的方法二

方法二.

System.out.println(new HashSet() {{
            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() {          ---这个括号用来创建内部匿名类

{            -----这个括号表示是内部匿名类的实例初始化块
            add("morning");
            add("afternoon");
        }

});

补充:对于这样的匿名类,是无法获取它的对象的。

方法三:

如果是利用数组初始化,还可以这样:

String s = "a,b,c,d,e,f";

SetactionSet = new HashSet<>(Arrays.asList(s.split(",")));

你可能感兴趣的:(Java)