merge()
方法会先调用 Objects.requireNonNull()
方法判断 value 是否为空 。
public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;}
解决方案使用Java8提供的Optional
类优雅地处理空指针问题
//如果值为null则赋默认值空串Map<String, String> collect = bookList.stream().collect(Collectors.toMap(Person::getName, t -> Optional.ofNullable(t.getPhoneNumber()).orElse("")
3. 集合遍历《阿里巴巴 Java 开发手册》的描述如下:
不要在 foreach 循环里进行元素的通过反编译你会发现 foreach 语法糖底层其实还是依赖remove/add
操作 。remove 元素请使用Iterator
方式,如果并发操作,需要对Iterator
对象加锁 。
Iterator
。不过,remove/add
操作直接调用的是集合自己的方法,而不是 Iterator
的 remove/add
方法这就导致
Iterator
莫名其妙地发现自己有元素被 remove/add
,然后,它就会抛出一个 ConcurrentModificationException
来提示用户发生了并发修改异常 。这就是单线程状态下产生的 fail-fast 机制 。fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时候,可能会抛出Java8 开始,可以使用ConcurrentModificationException
。即使是单线程下也有可能会出现这种情况,上面已经提到过 。
Collection#removeIf()
方法删除满足特定条件的元素,如List<Integer> list = new ArrayList<>();for (int i = 1; i <= 10; ++i) {list.add(i);}list.removeIf(filter -> filter % 2 == 0); /* 删除list中的所有偶数 */System.out.println(list); /* [1,3,5,7,9] */
除了上面介绍的直接使用 Iterator
进行遍历操作之外,你还可以:- 使用普通的 for 循环
- 使用 fail-safe 的集合类 。
java.util
包下面的所有的集合类都是 fail-fast 的,而java.util.concurrent
包下面的所有的类都是 fail-safe 的 。
可以利用这里我们以Set
元素唯一的特性,可以快速对一个集合进行去重操作,避免使用List
的contains()
进行遍历去重或者判断包含操作 。
HashSet
和 ArrayList
为例说明 。【Java集合精选常见面试题】
经验总结扩展阅读
- Java单例模式,看这一篇就够了
- 感恩节祝福寄语精选
- 微信支付v3接口的 官方 Java SDK
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
- 精选600个 冯姓女孩名字2023年属兔
- 精选600个 韩姓女孩名字2023年属兔
- 精选600个 唐姓女孩名字2023年属兔
- 精选600个 罗姓女孩名字2023年属兔
- 精选600个 马姓女孩名字2023年属兔
- 精选600个 谢姓女孩名字2023年属兔