Map 下的 NPE

Map 下的 NPE

1.Map 类集合 K/V 能不能存储 null 值的情况,如下表格:

集合类 Key Value Super 说明
Hashtable 不允许为 null 不允许为 null Dictionary 线程安全
ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 分段锁技术
TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全
HashMap 允许为 null 允许为 null AbstractMap 线程不安全

2.foreach 遍历集合删除元素

public static void main(String[] args) {
    List<String> a = new ArrayList<>();
    a.add("1");
    a.add("2");
    a.add("3");
    for (String temp : a) {
        if ("2".equals(temp)) {
            a.remove(temp);
        }
    }
    Iterator<String> it = a.iterator();
    while (it.hasNext()) {
        String temp = it.next();
        if ("2".equals(temp)) {
            it.remove();
        }
    }
}

不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式(代码第二种),如果并发操作,需要对 Iterator 对象加锁。

3.Arrays.asList() 数组转换集合

public static void main(String[] args) {
    String[] str = new String[]{"a", "b"};
    List list = Arrays.asList(str);
    list.add("c");//报错
    //        str[0] = "d";
    for (Object o : list) {
        System.out.println(o);
    }
}

踩坑姿势: Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。 asList() 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。

解决方案: 在转换之前操作咯。还需要注意一点,在你转换后,再对数组的值进行修改时,集合也会跟着变哦(注释掉的代码)。

4.toArray() 集合转换数组

public class ListToArray {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("你好");
        list.add("傻瓜");
        String[] objects = (String[]) list.toArray();
        System.out.println(objects);
    }
}

Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

​ at com.example.demo.ListToArray.main(ListToArray.java:11)

会报 ClassCastException 异常。

踩坑姿势: 直接使用 toArray() 无参方法返回值只能是 Object[]类,若强转其它类型数组将会抛异常。

解决方案: 使用 T[] toArray(T[] a); 有参数这个方法,代码如下:

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("你好");
    list.add("傻瓜");
    String[] array = new String[list.size()];
    array = list.toArray(array);
    System.out.println(array);
}
上一篇:Java-29为什么不建议在for循环中用‘+’进行字符串拼接?


下一篇:146. LRU 缓存机制