Java集合精选常见面试题(14)

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 循环里进行元素的 remove/add 操作 。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁 。
通过反编译你会发现 foreach 语法糖底层其实还是依赖 Iterator。不过,remove/add 操作直接调用的是集合自己的方法,而不是 Iteratorremove/add方法
这就导致 Iterator 莫名其妙地发现自己有元素被 remove/add ,然后,它就会抛出一个 ConcurrentModificationException 来提示用户发生了并发修改异常 。这就是单线程状态下产生的 fail-fast 机制 。
fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时候,可能会抛出ConcurrentModificationException 。即使是单线程下也有可能会出现这种情况,上面已经提到过 。
Java8 开始,可以使用 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 的 。
4. 集合去重《阿里巴巴 Java 开发手册》的描述如下:
可以利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 Listcontains() 进行遍历去重或者判断包含操作 。
这里我们以 HashSetArrayList 为例说明 。【Java集合精选常见面试题】

经验总结扩展阅读