1、画出collection的框架图
集合主要包含collection和map两个接口。其中collection中的元素是一个value值,map中的元素是key:value形式的。
collection包含set、list、queue。
(1)list:list接口包含ArrayList,Vector,LinkedList。
(2)set包含HashSet,TreeSet,EnumSet。
(3)Queueu包含LinkedList,PriorityQueue
map包含HashMap,HashTable,TreeMap,WeakHashMap,IdentityHashMap,EnumMap
2、详述List、Map、Set的区别?(底层实现的数据结构不同)
(1)List:有序,可重复。
ArrayList:底层实现的数据结构是数组,查询快,增删慢。线程不安全,效率高
LinkedList:底层实现的数据结构是链表,查询慢,增删块。线程不安全,效率高
Vector:底层实现的数据结构是数组,查绚块,增删慢。线程安全,效率低。
(2)Set:无序,唯一。
HashSet:底层数据结构是哈希表(无序,唯一)。保证元素唯一性依赖于两个方法:hashCode()和equals()
LinkedHashSet:底层数据结构是链表和哈希表。(FIFO,有序,唯一)。通过链表保证有序性, 通过哈希表保证唯一性。
TreeSet:底层数据结构是红黑树。(唯一,有序)
一般。ArrayList和HashSet用的比较广泛。如果明确知道需要线程安全或者有序,就根据集合的具体特点选择使用哪一个集合。Set和List都是单列元素的集合,父接口都是Colelction,有一定的相似之处。
List表示有先后顺序的集合, 按元素先来后到的元素进行插入,当然,可以插队,使用add(int index,object e)指定元素的位置。其实并不是把对象本身存储在集合里,而是在集合中用一个索引变量指向这个对象,当集合中包含多个同样的对象时,是多个索引指向同一个对象。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
Set里面不允许有重复的元素,即不能有两个相等(注意,不是仅仅是相同equals)的对象。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
(3)Map中常用的是Hash Map,HashMap,HashTable,TreeMap。
TreeMap:有序
HashMap:无序,线程不安全,效率高
HashTable:无序,线程安全,效率低。
HashMap和hashTable的区别:
Hashtable不允许null值,HashMap允许null值(key和value都允许)
Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。
Hashtable是线程安全的,而HashMap是线程不安全的。如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字,而HashMap的源码中则没有。
Map和List、Set不同,是双列元素的集合,不允许重复的key(equals),通过put(obj key,obj value)将元素存储到map集合中。取值时通过get(Object key),或者通过map.keySet(),map.values(),map.entrySet()获得keys,values的信息。
总结:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。
3、List时如何扩容的?
lsit初始化的长度是10,当长度达到10时,再新增数据会进行扩容。每次扩容为1.5倍+1,并将之前的数据copy到新的array中去。发现不同jdk是不一样的,关于(1.5倍+1)出现在jdk1.6,其他1.7和1.8都是(1.5倍扩容)。
4、HashSet的底层实现是?
HashMap,主要利用了HashMap的键不可重复的特性。
5、Iterator的机制?
来源:https://www.cnblogs.com/daisy122/p/11025034.html