Java SE 进阶复习(一)集合框架

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Unicorn_JF/article/details/100024599

1、Java容器都有哪些?

基本集合框架

2、Collection 和 Collections 有什么区别?

  1. java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  2. Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

3、List、Set、Map 之间的区别是什么?

List

  1. 存储单列数据的集合。其中Vector是线程安全的。
  2. 可以允许重复的对象。
  3. 可以插入多个null元素。
  4. 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
  5. 常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
  6. 可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

Set

  1. 存储单列数据的集合。
  2. 不允许重复对象。
  3. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
  4. 只允许一个 null 元素。
  5. Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

HashSet按照hashcode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储。

Map

  1. 不是collection的子接口或者实现类。Map是一个接口。
  2. Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象,但键对象必须是唯一的。存储没有顺序的。
  3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
  4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
  5. Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)其中Hashtable是线程安全的。

4、HashMap 和 Hashtable 有什么区别?

  1. hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
  2. hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
  3. hashMap允许空键值,而hashTable不允许。
  4. hashTable继承自Dictionary类;HashMap继承自AbstractMap。且都实现了Map接口。
  5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

5、如何决定使用 HashMap 还是 TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

6、HashMap 的实现原理

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

7、HashSet 的实现原理

  1. HashSet底层由HashMap实现。
  2. HashSet的值存放于HashMap的key上。
  3. HashMap的value统一为PRESENT。

8、ArrayList 和 LinkedList 的区别是什么

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

9、如何实现数组和 List 之间的转换

  1. List转换成为数组: 调用ArrayList的toArray方法。
  2. 数组转换成为List: 调用Arrays的asList方法。

10、ArrayList 和 Vector 的区别是什么?

  1. 都是使用数组方式存储数据。
  2. 这两个类都实现了List接口,都是有序集合,数据是允许重复的,
  3. Vector是安全的,方法之间是线程同步的,而ArrayList不是。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
  4. ArrayList比Vector快,它因为有同步,不会过载。
  5. ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

11、Array 和 ArrayList 有何区别

  1. Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
  2. Array是指定大小的,而ArrayList大小是固定的。
  3. Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

12、在 Queue 中 poll()和 remove()有什么区别

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

13、哪些集合类是线程安全的

  1. vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
  2. statck:堆栈类,先进后出。
  3. hashtable:就比hashmap多了个线程安全。
  4. enumeration:枚举,相当于迭代器。

14、怎么确保一个集合不能被修改?

采用Collections包下的unmodifiableMap方法,通过这个方法返回的map,是不可以修改的

15、迭代器 Iterator 是什么

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

16、Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

  1. 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
  2. 使用next()获得序列中的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

17、Iterator 和 ListIterator 有什么区别

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

18、Enumeration和Iterator接口的区别

  1. Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。
  2. 与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。
  3. 迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。

猜你喜欢

转载自blog.csdn.net/Unicorn_JF/article/details/100024599