《Effectice Java》第43条:返回零长度的数组或者集合,而不是null。
错误观点:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。
黄书作者说了,在这个级别上担心性能问题是不明智的,而且调用者容易遭遇到NPE。
接下来我们看看有哪几种方式能创建出来一个空的集合。
(1)Collections.emptyList()
jdk自带的方法:
需要注意下这个方法返回的空集合是immutable(不可变)的,往里add数据会报错:
代码:
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = Collections.emptyList();
list.add("a");
System.out.println(list);
}
}
(2)new ArrayList
这个是基本方法,不多说,返回的空集合可以修改。
(3)CollectionUtils.emptyCollection()
这种方法返回的Collection要转成List,而且也是不可更改的
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list;
Collection collection = CollectionUtils.emptyCollection();
//Collection --> List
if (collection instanceof List) {
list = (List)collection;
} else {
list = new ArrayList(collection);
}
System.out.println(JSON.toJSONString(list));
}
}
更改返回的Collection会报错:
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list;
Collection collection = CollectionUtils.emptyCollection();
collection.add("a");
//Collection --> List
if (collection instanceof List) {
list = (List)collection;
} else {
list = new ArrayList(collection);
}
System.out.println(JSON.toJSONString(list));
}
}
转成的List可以更改:
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list;
Collection collection = CollectionUtils.emptyCollection();
// collection.add("a");
//Collection --> List
if (collection instanceof List) {
list = (List)collection;
} else {
list = new ArrayList(collection);
}
list.add("b");
System.out.println(JSON.toJSONString(list));
}
}
(1)双花括号写法
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList(){{
add("a");
add("b");
add("c");
}};
System.out.println(JSON.toJSONString(list));
}
}
(2)Arrays.asList()
import com.alibaba.fastjson.JSON;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = Arrays.asList("a", "b", "c");
System.out.println(JSON.toJSONString(list));
}
}
返回的列表也不能添加元素:
import com.alibaba.fastjson.JSON;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = Arrays.asList("a", "b", "c");
System.out.println(JSON.toJSONString(list));
System.out.println(list.size());
list.add("d");
System.out.println(JSON.toJSONString(list));
System.out.println(list.size());
}
list.add("d");报错咯:
看了下源码,返回的不是jdk原生的ArrayList
发现是Arrays类的静态内部类,还是private的:
Mybatis里面用这种list的”list.size”可能会抛异常,
参考:
https://www.jianshu.com/p/affdfbc603a8
(3)Collections.singletonList()
当只有一个元素时就可以用这种
List
(4)Lists.newArrayList() (guava中的方法)
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = Lists.newArrayList("a", "b", "c");
list.add("d");
System.out.println(JSON.toJSONString(list));
}
}
看到new出来的列表可以添加元素:
Lists.partition()
guava里的类,所以要添加pom依赖:
com.google.guava
guava
23.0
先来看看怎么用:
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List mainList = new ArrayList<>();
for (int i = 0; i < 107; i++) {
mainList.add(i);
}
List> subLists = Lists.partition(mainList, 10);//每片10个元素
for (List sub : subLists) {
System.out.print(sub.size() + ":");
for (Integer ele : sub) {
System.out.print(ele + " ");
}
System.out.println();
}
}
}
看到切成11片,其中第11片只有7个元素
工程中有些常用的工具类,倒不是说多高明,主要是用起来防止疏忽,比如有时候对字符串判空可能会直接用var.equals(“”),var如果是null就可能会遇到NPE。
StringUtils、CollectionUtils、MapUtils
常用方法:
StringUtils.isEmpty();
StringUtils.isNotEmpty();
StringUtils.isBlank("a");
StringUtils.isNotBlank("a");
我们工程里一般用isBlank(),因为全为空字符的字符串通常没有意义。
List
CollectionUtils.isEmpty(list);
MapUtils.isEmpty()
可以看到这些工具类非常简单,初看没什么意义,其实工程大起来以后还是有点用的,起码判空的时候不会遇到空指针异常了。