1. Java 中集合类的初始化的方法与小技巧
1.1数组的初始化
如下所示,字符数组可以通过以下方式进行初始化。
String[] names = new String[] {“john”,”eric”};
1.2 List 的初始化可以使用Arrays.asList 将数组转换对应的List
List<String> list =Arrays.asList("hu","zun","li");
List<Integer> list2 = Arrays.asList(1,2,4);
1.3 Set的初始化
(1)最普通的方式
Arrays 中没有可以将数组转换为Set的方法。
但Set 的实现类地构造器中可以将实现Collection接口(如List)的实例转换为Set 实例。
所以,可以如下所示,使用数组对Set 进行初始化
Set<String> set1 = newHashSet<String>(Arrays.asList(newString[]{"hu","zunli","li"}));
(2)也可以使用普通的方法
Set<Integer> list = new HashSet<Integer>();
{
list.add(1);//首页原型id
list.add(2);//宝贝详情页原型id
list.add(3);//宝贝列表页原型id
list.add(101);//文章列表页原型id
list.add(102);//文章详情页原型id
list.add(103);//帮助中心文章列表页原型id
list.add(104);//帮助中心文章详情页原型id
}
实际上就是先使用new 创建对象,然后正常使用add 方法插入记录,但用{} 括起来称谓一个语句块,看起来就比较舒服。
(3) 还是基于Java中原始的API,但使用匿名类。
如下图所示
@Test
public void testListInitUsingNestedClass() {
List<String> list = new ArrayList<String>() {
{
add("hu");
add("zunli");
}
};
}
上面实际上就是用匿名类加实例化块来实现的简洁写法。
2. 集合框架类对象初始化(插入值)以后,希望该对象中的值不允许再修改。以上方法是对数组,List, Set,Map 进行初始化。这样初始化的集合类实例是可以修改的。在一个项目中,有时候需要建立一些类似常量的集合框架类实例,即初始化数据以后,这个集合框架类实例不希望再被修改。
2.1 使用传统的Java中的API实现(即使用Collections.unmodifiableXXX();)如一个不可变的Set
Set<String> set = new HashSet<String>(Arrays.asList(new String[]{"RED", "GREEN"}));Set<String> unmodifiableSet =Collections.unmodifiableSet(set);
如果使用以上代码获得unmodifiableSet,虽然该实例本身是不可再添加或者删除数据。但set 这个实例本身还是可以操作的。
如下图的单元测试所示:
如果使用Collections.unmodifiableSet(xxx)这样的传统方法处理,应该使用匿名类。
如以下代码
2.2使用Google提供的collection框架类的简洁实现
(1) Set
以上代码,过于繁琐。Google提供的Collection包guava 提供的类有更简洁的实现。
ImmutableSet<String> immutableSet =ImmutableSet.of("RED", "GREEN");
如果不需要初始化,而是需要把某个外界传入的集合框架类的实例,可以这样做。
Set<String> set = newHashSet<String>(Arrays.asList("hu", "zun","li"));
set.add("silver");
assertThat(set.contains("silver"), is(true));
Set<String> immutableSet = ImmutableSet.copyOf(set);
注意,以上对set 实例转换得到另一个immutableSet,immutableSet在使用不可被修改,但set本身还是可以修改的。
除了使用ImmutableSet.of(T...object),ImmutableSet.copyOf(Collection collection)以外,
还可以使用Builder 模式来构造一个集合,
Builder<String> builder = ImmutableSet.builder();
ImmutableSet<String> immutableSet = builder.add("RED").addAll(set).build();
以上代码可以进行链式编程:
ImmutableSet<String> immutableSet = ImmutableSet.builder().add(“red”).addAll(set).build();