Java集合工具类

1 List

1.1 空集合

《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<String> list = Collections.emptyList();
        list.add("a");
        System.out.println(list);
    }
}

(2)new ArrayList<T>()

这个是基本方法,不多说,返回的空集合可以修改。

(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<String> list;
        Collection<String> collection = CollectionUtils.emptyCollection();
        //Collection --> List
        if (collection instanceof List) {
            list = (List<String>)collection;
        } else {
            list = new ArrayList<String>(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<String> list;
        Collection<String> collection = CollectionUtils.emptyCollection();
        collection.add("a");
        //Collection --> List
        if (collection instanceof List) {
            list = (List<String>)collection;
        } else {
            list = new ArrayList<String>(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<String> list;
        Collection<String> collection = CollectionUtils.emptyCollection();
//        collection.add("a");
        //Collection --> List
        if (collection instanceof List) {
            list = (List<String>)collection;
        } else {
            list = new ArrayList<String>(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<String> list = new ArrayList<String>(){{
            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<String> 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<String> 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<String> 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<String> list = Lists.newArrayList("a", "b", "c");
        list.add("d");
        System.out.println(JSON.toJSONString(list));
    }
}

看到new出来的列表可以添加元素:

2.List切片

Lists.partition()

guava里的类,所以要添加pom依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

先来看看怎么用:

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> mainList = new ArrayList<>();
        for (int i = 0; i < 107; i++) {
            mainList.add(i);
        }

        List<List<Integer>> subLists = Lists.partition(mainList, 10);//每片10个元素

        for (List<Integer> sub : subLists) {
            System.out.print(sub.size() + ":");
            for (Integer ele : sub) {
                System.out.print(ele + " ");
            }
            System.out.println();
        }
    }
}

看到切成11片,其中第11片只有7个元素

3.apache工具类

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

StringUtils、CollectionUtils、MapUtils

3.1 StringUtils

常用方法:

StringUtils.isEmpty();

StringUtils.isNotEmpty();

StringUtils.isBlank("a");

StringUtils.isNotBlank("a");

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

3.2 CollectionUtils

List<String> list = new ArrayList<>();

CollectionUtils.isEmpty(list);

3.3 MapUtils

MapUtils.isEmpty()

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值