深刻理解集合

集合相关有很多知识点,下面先看张图,再深刻理解一下。

1.Collection接口指定一组对象这些对象就是它的元素。

维护这些元素时,才用到具体实现。

当于具体实现打交道时,Cloneable和Serializable

2.Map不是集合,它里面有很多key,value键值对,key是唯一的不可重复,一个key最多只能对应一个value

map中放的不是一组对象,所以不能继承Collection接口。

3.迭代器

Iterator(迭代器)接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration(列举)。迭代器允许调用者在迭代过程中移除元素。

4.Enumeration和Iterator接口的区别?

a.Enumeration的速度是Iterator的两倍,也使用更少的内存。

b.与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

c.迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。

但是,不能添加,它要保证迭代的顺序

5.Iterater和ListIterator之间有什么区别?

a.Iterator来遍历Set和List集合,而它的子类ListIterator只能遍历List

b.Iterator只可以向前遍历,而LIstIterator可以双向遍历。

c.ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

6.fail-fast

迭代器中Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代器检查当前集合结构里的任何改动。如果发现任何改动抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。

所以,在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList。

7. UnsupportedOperationException

是用于表明操作不支持的异常。在JDK类中已被大量运用,在集合框架java.util.Collections.UnmodifiableCollection将会在所有add和remove操作中抛出这个异常。

8.HashMap

HashMap默认初始容量值为32,负荷系数0.75,阀值=初始容量值*0.75

例如,我们加一个a,如果map的大小比阀值大的时候,HashMap会对map的内容进行重新哈希,且使用更大的容量。要是你早知道自己需要存储大量的key-value对,在初始容量设置大一点。

!!!容量总是2的幂。

工作原理:HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。

9.Map接口提供三个集合视图虽然不懂先记着):

keySet是键的集合  entrySet是键值对的集合

 因为map没有迭代器,collection(list和set)才有迭代器。遍历map时候就需要通过map集合.entrySet()转换为Set集合进行遍历,或者通过map集合.keySet()获取到所有的键,然后通过键得到值

(1)Set keyset():返回map中包含的所有key的一个Set视图。集合是受map支持的,map的变化会在集合中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

(2)Collection values():返回一个map中包含的所有value的一个Collection视图。这个collection受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个collection时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

(3)Set<Map.Entry<K,V>> entrySet():返回一个map钟包含的所有映射的一个集合视图。这个集合受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作,以及对迭代器返回的entry进行setValue外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

10.HashMap和HashTable有何不同?

(1)HashMap允许key和value为null,而HashTable不允许。

(2)HashTable是线程同步,HashMap非线程同步。

(3)hashtable使用enumeration,hashmap使用iterator

(4)HashTable默认大小11,增长方式old*2+1

     HashMap默认大小16,增长方式2的指数倍

所以HashMap适合单线程环境,HashTable适合多线程环境。

(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。(这一句记不住)

(5)HashTable 表锁,加锁时给所有加锁,是线程安全的,

CocurrentHashMap 行锁 线程安全

11.ArrayList和LinkedList的区别?

a.ArrayList数组 查询快 可以为null

LinkedList链表 插入快

b.LinkedList比ArrayList消耗更多的内存

12.

ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。

13.

Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。

14.队列和栈的区别

队列先进先出

栈先进后出

15.Comparable和Comparator

Comparable自然排序(1234....或ABCD,,,这种)

Comparator基于某个要求排序

16.排序

如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,我们可以使用Collection.sort()方法。

17.当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?

在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。

18.Vector、ArrayList和List的异同 

线性表,链表,哈希表是常用的数据结构

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,通过迭代器遍历

Collection接口派生的两个接口是List和Set。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 

猜你喜欢

转载自blog.csdn.net/tangweiee/article/details/82593224