蚂蚁花呗:阿里巴巴面试:Java 集合知识点(附图文解析)( 九 )


如何避免fail-fast ?

  • 在单线程的遍历过程中 , 如果要进行remove操作 , 可以调用迭代器 ListIterator 的 remove 方法而不是集合类的 remove方法 。 看看 ArrayList中迭代器的 remove方法的源码 , 该方法不能指定元素删除 , 只能remove当前遍历元素 。
  • 使用并发包(java.util.concurrent)中的类来代替 ArrayList 和 hashMap
    • CopyOnWriterArrayList 代替 ArrayList
    • ConcurrentHashMap 代替 HashMap
Iterator 和 Enumeration 区别在Java集合中 , 我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合 。
  • 函数接口不同 , Enumeration只有2个函数接口 。 通过Enumeration , 我们只能读取集合的数据 , 而不能对数据进行修改 。 Iterator只有3个函数接口 。 Iterator除了能读取集合的数据之外 , 也能数据进行删除操作 。
  • Iterator支持 fail-fast机制 , 而Enumeration不支持 。 Enumeration 是JDK 1.0添加的接口 。 使用到它的函数包括Vector、Hashtable等类 , 这些类都是JDK 1.0中加入的 , Enumeration存在的目的就是为它们提供遍历接口 。 Enumeration本身并没有支持同步 , 而在Vector、Hashtable实现Enumeration时 , 添加了同步 。 而Iterator 是JDK 1.2才添加的接口 , 它也是为了HashMap、ArrayList等集合提供遍历接口 。 Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时 , 就可能会产生fail-fast事件
Comparable 和 Comparator接口有何区别?Java中对集合对象或者数组对象排序 , 有两种实现方式:
  • 对象实现Comparable 接口
    • Comparable 在 java.lang 包下 , 是一个接口 , 内部只有一个方法 compareTo()
    • Comparable 可以让实现它的类的对象进行比较 , 具体的比较规则是按照 compareTo 方法中的规则进行 。 这种顺序称为 自然顺序 。
    • 实现了 Comparable 接口的 List 或则数组可以使用 Collections.sort() 或者 Arrays.sort() 方法进行排序
  • 定义比较器 , 实现 Comparator接口
    • Comparator 在 java.util 包下 , 也是一个接口 , JDK 1.8 以前只有两个方法:comparable相当于内部比较器 。 comparator相当于外部比较器
区别:
  • Comparator 位于 java.util 包下 , 而 Comparable 位于 java.lang 包下
  • Comparable 接口的实现是在类的内部(如 String、Integer已经实现了 Comparable 接口 , 自己就可以完成比较大小操作) , Comparator 接口的实现是在类的外部(可以理解为一个是自已完成比较 , 一个是外部程序实现比较)
  • 实现 Comparable 接口要重写 compareTo 方法 在 compareTo 方法里面实现比较 。 一个已经实现Comparable 的类的对象或数据 , 可以通过 Collections.sort(list) 或者 Arrays.sort(arr)实现排序 。 通过 Collections.sort(listCollections.reverseOrder()) 对list进行倒序排列 。
  • 实现Comparator需要重写 compare 方法
HashSetHashSet是用来存储没有重复元素的集合类 , 并且它是无序的 。 HashSet 内部实现是基于 HashMap, 实现了 Set 接口 。
从 HahSet 提供的构造器可以看出 , 除了最后一个 HashSet 的构造方法外 , 其他所有内部就是去创建一个 Hashap。 没有其他的操作 。 而最后一个构造方法不是 public 的 , 所以不对外公开 。


推荐阅读