Java集合工具类

1 List

1.1 空集合

《Effectice Java》第43条:返回零长度的数组或者集合,而不是null。

Java集合工具类_第1张图片

错误观点:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。

黄书作者说了,在这个级别上担心性能问题是不明智的,而且调用者容易遭遇到NPE。

 

接下来我们看看有哪几种方式能创建出来一个空的集合。

(1)Collections.emptyList()

jdk自带的方法:

Java集合工具类_第2张图片

需要注意下这个方法返回的空集合是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);
    }
}

Java集合工具类_第3张图片

(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.2 新建集合

(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));
    }
}

Java集合工具类_第4张图片

(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));
    }
}

Java集合工具类_第5张图片

返回的列表也不能添加元素:

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");报错咯:

Java集合工具类_第6张图片

看了下源码,返回的不是jdk原生的ArrayList

Java集合工具类_第7张图片

发现是Arrays类的静态内部类,还是private的:

Java集合工具类_第8张图片

Mybatis里面用这种list的”list.size”可能会抛异常,

参考:

https://www.jianshu.com/p/affdfbc603a8

(3)Collections.singletonList()

当只有一个元素时就可以用这种

List list = Collections.singletonList("a");

(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出来的列表可以添加元素:

Java集合工具类_第9张图片

2.List切片

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个元素

Java集合工具类_第10张图片

3.apache工具类

工程中有些常用的工具类,倒不是说多高明,主要是用起来防止疏忽,比如有时候对字符串判空可能会直接用var.equals(“”),var如果是null就可能会遇到NPE。

StringUtils、CollectionUtils、MapUtils

3.1 StringUtils

常用方法:

StringUtils.isEmpty();

StringUtils.isNotEmpty();

StringUtils.isBlank("a");

StringUtils.isNotBlank("a");

我们工程里一般用isBlank(),因为全为空字符的字符串通常没有意义。

Java集合工具类_第11张图片

3.2 CollectionUtils

List list = new ArrayList<>();

CollectionUtils.isEmpty(list);

3.3 MapUtils

MapUtils.isEmpty()

可以看到这些工具类非常简单,初看没什么意义,其实工程大起来以后还是有点用的,起码判空的时候不会遇到空指针异常了。

 

 

你可能感兴趣的:(Java基础)