java集合

Java 集合类

1.Java 的 HashMap 是如何工作的?
HashMap 是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值。HashMap 基于 hashing 原理,我们通过 put () 和 get () 方法储存和获取对象。当我们将键值对传递给 put () 方法时,它调用键对象的 hashCode () 方法来计算 hashcode ,让后找到 bucket 位置来储存值对象。当获取对象时,通过键对象的 equals () 方法找到正确的键值对,然后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每个 LinkedList 节点中储存键值对对象。

2.什么是快速失败的故障安全迭代器?
快速失败的 Java 迭代器可能会引发 ConcurrentModifcationException 在底层集合迭代过程中被修改。故障安全作为发生在实例中的一个副本迭代是不会抛出任何异常的。快速失败的故障安全范
例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器 ArrayList 和用于故障安全的迭代器 ConcurrentHashMap 。

3.Java BlockingQueue 是什么?
Java BlockingQueue 是一个并发集合 util 包的一部分。 BlockingQueue 队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素。

4 什么时候使用 ConcurrentHashMap ?

在问题 2 中我们看到 ConcurrentHashMap 被作为故障安全迭代器的一个实例,它允许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap 此时可以被使用。这非常类似Hashtable ,但 ConcurrentHashMap 不锁定整个表来提供并发,所以从这点ConcurrentHashMap 的性能似乎更好一些。所以当有大量更新时 ConcurrentHashMap 应该被使用。

5.哪一个 List 实现了最快插入?
LinkedList 和 ArrayList 是另个不同变量列表的实现。 ArrayList 的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用。 LinkedList 的优势在于在中间位置插入和删除操作,速度
是最快的。LinkedList 实现了 List 接口,允许 null 元素。此外 LinkedList 提供额外的 get ,remove , insert 方法在 LinkedList 的首部或尾部。这些操作使 LinkedList 可被用作堆栈( stack ),队列( Queue )或双向队列(Deque)。

ArrayList 实现了可变大小的数组。它允许所有元素,包括 null 。 每个 ArrayList 实例都有一个容量( Capacity ),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用 ensureCapacity 方法来增加 ArrayList 的容量以提高插入效率。

6.Iterator 和 ListIterator 的区别
●ListIterator 有 add() 方法,可以向 List 中添加对象,而 Iterator 不能。
●ListIterator 和 Iterator 都有 hasNext() 和 next() 方法,可以实现顺序向后遍历,但是 ListIterator 有 hasPrevious() 和 previous() 方法,可以实现逆向(顺序向前)遍历。 Iterator 就不可以。
●ListIterator 可以定位当前的索引位置, nextIndex() 和 previousIndex() 可以实现。 Iterator 没有此功能。
● 都可实现删除对象,但是 ListIterator 可以实现对象的修改, set() 方法可以实现。 Iierator 仅能遍历,不能修改。

7.什么是 CopyOnWriteArrayList ,它与 ArrayList 有何不同?
CopyOnWriteArrayList 是 ArrayList 的一个线程安全的变体,其中所有可变操作( add 、 set 等等)都是通过对底层数组进行一次新的复制来实现的。相比较于 ArrayList 它的写操作要慢一些,因为它需要实例的快照。

CopyOnWriteArrayList 中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后
通过一个简单的 “=” 将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生 ConcurrentModificationException ,因此
CopyOnWriteArrayList 适合使用在读操作远远大于写操作的场景里,比如缓存。

8.迭代器和枚举之间的区别
如果面试官问这个问题,那么他的意图一定是让你区分 Iterator 不同于 Enumeration 的两个方面:
●Iterator 允许移除从底层集合的元素。
●Iterator 的方法名是标准化的。

9.Hashmap 如何同步 ?
当我们需要一个同步的 HashMap 时,有两种选择:
● 使用 Collections.synchronizedMap ( … )来同步 HashMap 。
● 使用 ConcurrentHashMap 的这两个选项之间的首选是使用 ConcurrentHashMap ,这是因为我们不需要锁定整个对象,以及通过 ConcurrentHashMap 分区地图来获得锁。

10.IdentityHashMap 和 HashMap 的区别
IdentityHashMap 是 Map 接口的实现。不同于 HashMap 的,这里采用参考平等。
● 在 HashMap 中如果两个元素是相等的,则 key1.equals(key2)
● 在 IdentityHashMap 中如果两个元素是相等的,则 key1 == key2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值