Java教程

Java Collection集合面试题2

上页

  1. 使用iterate遍历列表List的不同方法是什么?
    List<String> strList = new ArrayList<>();
    //using for-each loop
          for(String obj : strList){
              System.out.println(obj);
          }
          //using iterator
          Iterator<String> it = strList.iterator();
          while(it.hasNext()){
              String obj = it.next();
              System.out.println(obj);
          }

  2. 你怎么理解迭代器的快速失败fail-fast 的特点?
    迭代器的快速失败fail-fast 属性会检查对集合的结构进行任何的修改,每次我们尝试获得下一个元素。如果发现有任何修改,它抛出ConcurrentModificationException。所有迭代器的实现都是快速失败的设计,除了像ConcurrentHashMap和CopyOnWriteArrayList。

  3. 快速失败 fail-fast和故障安全fail-safe之间的不同是什么?
    迭代器故障安全性fail-safe以克隆方式工作,因此它不会影响集合中的任何修改。所有java.util包中的集合类是快速失败的fail-fast,而java.util.concurrent中的类都是故障安全fail-safe。快速失败迭代器抛出ConcurrentModificationException,而失败安全fail-safe的迭代器从不抛出ConcurrentModificationException。

  4. 迭代集合时如何避免ConcurrentModificationException?
    使用并发集合类来避免ConcurrentModificationException, 如使用CopyOnWriteArrayList 替代 ArrayList.

  5. 为什么没有Iterator接口的具体实现?
    每个集合返回一个迭代器用来遍历自己。 这使得集合类能够选择是否迭代器是快速失败 fail-fast或故障安全fail-safe。例如ArrayList的迭代器是快速失败的,而CopyOnWriteArrayList的迭代器是故障安全。

  6. UnsupportedOperationException的是什么?
    UnsupportedOperationException异常,用于指示该操作不被支持。它广泛用于在JDK类,,对于所有添加和删除操,集合框架java.util.Collections.UnmodifiableCollection抛出这个异常。

  7. HashMap如何工作?
    HashMap以哈希算法方式工作,在put和get方法被调用时,使用hashCode()和equals()来配合:当我们使用put方法,HashMap使用key的hashCode()散列在键 - 值存储对中找出索引。k-v条目Entry存储在LinkedList,因此如果有已经存在的Entry,它就使用equals()方法来检查其相应的键key是否已经存在,如果是的,它覆盖原值,否则它创建一个新Enrty条目和存储这个键-值;当我们通过键key调用get方法,再次使用的hashCode()找到数组中的索引,然后使用equals()方法来找到正确的条目,并返回它的值。

    HashMap的容量涉及加载因子,阈值调整大小。 HashMap的初始默认容量为32和负载系数为0.75。阈值是容量乘以负载因子,每当我们尝试添加一个条目,Map的大小如果大于阈值时,HashMap扩大Map内容到一个新的更大阵列容量。容量总是2的幂,所以,如果你知道你需要存储大量的键 - 值对,例如,在数据库中的数据缓存,初始化HashMap中正确的容量和负载因子是个好主意。

  8. hashCode()和equals()的关系是什么?

    如果o1.equals(O2),o1.hashCode()== o2.hashCode()应该永远是真的
    如果o1.hashCode()== o2.hashCode, 它并不意味着o1.equals(O2)将是真的

  9. 能使用任何类作为Map的key吗?
    可以,但是遵循:
    如果类重写equals()方法,还应该覆盖重写hashCode()方法。
    如果一个类的字段没有在equals()方法使用,你不应该使用它的hashCode()方法
    用作键Key的类最好是不可变 的,hashCode()值可以缓存以提高运行速度。

  10. Map 提供的Collection 视图之间有什么区别?
    Set keySet():返回此Map中包含的键的Set视图。
    Collection values():返回此Map中包含的值的Collection视图
    Set<Map.Entry<K, V>> entrySet():返回在此Map中包含的映射关系的Set视图

下页

Java多线程面试题

Spring面试题