1. HashMap(京东面试真题)
(1)初始容量为什么是2的n次幂及为什么是2倍扩容?
HashMap计算添加元素的位置时,使用的位运算是特别高效的运算
HashMap的初始容量是2的n次幂,是因为容量是2的n次幂,可以使得添加的元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低
HashMap以2倍扩容,目的是减少hash碰撞,使元素分配均匀
(2)如何解决HashMap线程不安全的问题?
在Java中有HashTable、SynchronizedMap、ConcurrentHashMap这三种是实现线程安全的Map:
1)HashTable:是直接在操作方法上加synchronized关键字,锁住整个数组,粒度比较大
2)SynchronizedMap:是使用Collections集合工具的内部类,通过传入Map封装出一个SynchronizedMap对象,内部定义了一个对象锁,方法内通过对象锁实现
hashmap通过 Collections.synchronizedMap() 获取一个线程安全的hashmap
3)ConcurrentHashMap:使用分段锁(CAS + Synchronized相结合),降低了锁粒度,大大提高并发度
2. Java迭代器
迭代器属于设计模式之一,迭代器模式提供了一种方法来顺序访问一个聚合对象中各个元素,而不保留该对象的内部表示。
(1)Iterator对象称为迭代器,主要用于遍历Collection集合中的元素;
(2)所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器;
(3)Iterator仅用于遍历集合,Iterator本身并不存放对象。