Java干货——Part3

Java干货——Part3






1、什么是迭代器?(Iterator)
Iterator 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的 remove( Object Obj )删除,可以通过迭代器的 remove() 方法删除。


2、Iterator 和 ListIterator 的区别是什么?
Iterator 可以用来遍历 Set 和 List 集合,但是L istIterator 只能用来遍历 List。
1)Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。
2)ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。


3、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
Iterator 的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
java.util 包下面的所有集合类都是快速失败的,而 java.util.concurrent 包下的所有类都是安全失败的。快速失败的迭代器会抛出 ConcurrentModificationException 异常,而安全失败的迭代器永远不会抛出这样的异常。


4、Java 中的 HashMap 的工作原理是什么?
Java 中的 HashMap 是以键值对(key-value)的形式存储元素的。HashMap需要一个 hash 函数,它使用的 hashCode() 和 equals() 方法来向集合或者从集合中添加和检索元素。
当调用 put() 方法的时候,HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。如果 key 已经存在了,value 会被更新成新的值。HashMap 的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。


5、hashCode() 和 equals() 方法的重要性体现在什么地方?
Java 中的 HashMap 使用 hashCode() 和 equals() 方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。
如果没有正确的实现这两个方法,两个不同的键可能会有相同的 hash 值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。


6、HashMap 和 Hashtable 有什么区别?
HashMap 和 Hashtable 都实现了 Map 接口,因此很多特性非常相似。但是有以下不同点:
1)HashMap 允许键值和值是 null,而Hashtable 不允许键或者值是 null。
2)Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线程环境,而Hashtable 适合于多线程环境。
3)HashMap 提供了可供应用迭代的键的集合,因此,HashMap 是快速失败的。另一方面,Hashtable 提供了对键的例举(Enumeration)。
4)一般认为 HashMap 是一个遗留的类。


7、数组(Array)和列表(ArrayList)有什么区别?什么时候用Array而不是ArrayList?
下面列出了Array 和 ArrayList 的不同点:
1)Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
2)Array 大小是固定的,ArrayList 的大小是动态变化的。
3)ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。


8、ArrayList 和 LinkedList 有什么区别?
1)ArrayList 和 LinkedList 都实现了 List 接口,他们有以下的不同点:
2)ArrayList 是基于索引的数据接口,它的底层是数组。它可以以 O(1) 时间复杂度对元素进行随机访问。与此对应,LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是 O(n)。
3)相对于 ArrayList,LinkedList 的插入,添加,删除操作速度更快,因为当元素被添到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
4)LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
(也可以参考 ArrayList vs. ListedList)


9、Comparable 和 Comparator 接口是干什么的?列出它们的区别。

  • Java 提供了只包含一个 compareTo() 方法的 Comparable
    接口。这个方法可以给两个对象排序。具体说,他返回负数,0,正数 来表明输入对象小于,等于,大于已经存在的对象。
  • Java 提供了包含 compare() 和 equals() 两个方法的 Comparable 接口。compare() 方法用来给两个输入参数排序,返回负数,0,正数 来表明第一个参数是小于,等于,大于第二个参数。equals() 方法需要一个对象作为参数,它用来决定输入参数是否和 comparator 相等。只有当输入参数也是一个 comparator 并且输入参数和当前 comparator 的排序结果是相同的时候,这个方法才返回 true 。









送给自己和大家:

“好学若饥,谦卑若愚。”

你可能感兴趣的:(干货)