用Java创建预填充集

时间:2012-02-27 18:36:02

标签: java initialization set declaration

在Java中,如何创建在构造时填充的最终Set?我想做类似以下的事情:

static final Set<Integer> NECESSARY_PERMISSIONS 
    = new HashSet<Integer>([1,2,3,6]);

但我不知道Java中的正确语法。

6 个答案:

答案 0 :(得分:54)

试试这个成语:

import java.util.Arrays;

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))

答案 1 :(得分:19)

您可以考虑使用Guava的ImmutableSet

static final Set<Integer> NECESSARY_PERMISSIONS = ImmutableSet.<Integer>builder()
        .add(1)
        .add(2)
        .add(3)
        .add(6)
        .build();
static final Set<String> FOO = ImmutableSet.of("foo", "bar", "baz");

除此之外,这比HashSet明显更快(并且空间效率提高约3倍)。

答案 2 :(得分:8)

使用标准Java类的最简单方法是

static final Set<Integer> NECESSARY_PERMISSIONS = 
    Collections.unmodifiableSet(new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)));

但您也可以使用静态初始化程序,或委托私有静态方法:

static final Set<Integer> NECESSARY_PERMISSIONS = createNecessaryPermissions();

注意unmodifiableSet包装器,它保证你的常量集确实是常量。

答案 3 :(得分:6)

使用Google Guava库,您可以使用ImmutableSet,它完全针对此情况设计(常量值):

static final ImmutableSet<Integer> NECESSARY_PERMISSIONS =
        ImmutableSet.of(1,2,3,6);

老派方式(没有任何图书馆):

static final Set<Integer> NECESSARY_PERMISSIONS =
        new HashSet<Integer>(Arrays.asList(1,2,3,6));

修改

在Java 9 + 中,您可以使用Immutable Set Static Factory Methods

static final Set<Integer> NECESSARY_PERMISSIONS =
        Set.of(1,2,3,6);

答案 4 :(得分:6)

您可以通过以下方式执行此操作:IMO比本主题中的其他示例更好,更简洁:

public static <T> Set<T> set(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
}

静态导入后你可以这样写:

public static final Set<Integer> INTS = set(1, 2, 3);

答案 5 :(得分:2)

Set<String> s = new HashSet<String>() {{  
  add("1"); add("2"); add("5");  
}};