在java学习中遇到的一些经典问题和解答(3)

1.Iterator和ListIterator的却别是什么?

Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List。
lteraor对集合只能是前向遍历,ListIterator即可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等

2.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

快速失败:当你在迭代下一个集合的时候,如果有另一个线程正在修改你正在访问的那个集合时,就会抛出一个ConcurrentModification异常。
安全失败:你在迭代的时候会去底层集合做一个拷贝,所以你在修改上层集合的时候是不会受影响的,不会抛出ConcurrentModification异常

在java.util包下的都是快速失败,在java.util.concurrent包下全是安全失败的

3.Java中的HashMap的工作原理是什么?

HashMap的底层是用hash数组和单向链表实现的,当调用put方法是,首先计算key的hashcode,定位到合适的数组索引,然后在该索引上的单向链表进行循环遍历用equals比较key是否存在,若存在则用新的value值进行覆盖原值,要是没有就向后追加。

4.hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有这两个方法,两个不同的键可能会有相同的hash值,可能被集合认为是相等的。同时,这两个方法也用来发现重复元素。

5.HashMap和HashTable有什么区别?

1.HashMap允许键和值为null,HashtTable不允许。
2.HashMap不同步,HashTable是同步的。所以HashMap适合单线程,HashTable更适合多线程环境。
3.HashMap是非线程安全的,HashTable是线程安全的。
4.也因为线程安全问题,HashMap比HashTable的效率要高

6.数组(Array)和列表(ArrayList)有什么区别?什么时候使用Array而不是ArrayList?

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

7.ArrayList和LikedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

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

8.Comparable和Comparator的借口是干什么的?列出它们的区别。

Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

  1. Comparator位于包java.util下,而Comparable位于包 java.lang下
  2. Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序, 这里的自然顺序就是实现Comparable接口设定的排序方式。 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。
  3. Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序, 这里的自然顺序就是实现Comparable接口设定的排序方式。 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。

9.什么是Java优先级队列(Priority Queue)?

Priority Queue是一个基于优先级堆的无届队列,它的元素是按照自然顺序排序的。在创建的时候,我们可以给它一个负责给元素排序的比较器。
Priority Queue不允许null值,因为他们没有自然排序,或者说他们没有任何的安全关联的比较器。
最后,Priority Queue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

10.你了解大O符号(big-O notation)么?你能给出不同的数据结构例子吗?

大O符号表示一个程序运行时所需要的渐进时间复杂度上界。
其函数表示是: 对于函数f(n),g(n),如果存在一个常数c,使得f(n)<=c*g(n),则f(n)=O(g(n)); 大O描述当数据结构中的元素增加时,算法的规模和性能在最坏情景下有多好。
大O还可以描述其它行为,比如内存消耗。因为集合类实际上是数据结构,因此我们一般使用大O符号基于时间,内存,性能选择最好的实现。
大O符号可以对大量数据性能给予一个很好的说明。

猜你喜欢

转载自blog.csdn.net/huangpeng_HP/article/details/86560966
今日推荐