HashMap HashTable ConcurrentHashMap

1.HashMap HashTable区别?,Hashmap key可以是任何类型吗?

  • 1.HashTable的方法是同步 的,在方法的前面都有synchronized来同步,HashMap未经同步,所以在多线程场合要手动同步 HashMap这个区别就像Vector和ArrayList一样。可以通过 Map m = Collections.synchronizedMap(new HashMap(...)); 对HashMap进行同步操作。

  • 2.HashTable不允许null值(key和value都不可以) ,HashMap允许null值(key和value都可以)。

  • 3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。

  • 4.HashTable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。以上只是表面的不同,它们的实现也有很大的不同。

  • 5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

  • 6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    

    而HashMap重新计算hash值,而且用与代替求模:

int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {

  h ^= (h >>> 20) ^ (h >>> 12);
     return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
  return h & (length-1);
}

以上只是一些比较突出的区别。

ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。通过lock()和unlock().

3.LinkedList ArrayList区别?

ArrayList基于数组,LinkedList基于链表 ArrayList查找快,LinkedList插入删除快 随机查找频繁用ArrayList,插入删除频繁用LinkedList

4.ArrayList,Vector,HashMap,Hashtable扩容机制?

  • arraylist,初始容量10,(oldCapacity * 3)\/2 + 1
  • vector,初始容量10,oldCapacity * 2
  • hashmap,初始容量16,达到阀值扩容,为原来的两倍
  • hashtable,初始容量11,达到阀值扩容,oldCapacity * 2 + 1

5.Concurrent包

  • semaphore信号量 用来表示可用资源的数量,如果请求资源数超过这一数量,则就要阻塞这一线程
  • callable接口,实现call函数,但是它有返回值我们可以得到call函数的返回值判断call函数是否执行完毕什么是Callable和Future?Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。
  • Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。
  • 什么是FutureTask?FutureTask是Future的一个基础实现,我们可以将它同Executors使用处理异步任务。通常我们不需要使用FutureTask类,单当我们打算重写Future接口的一些方法并保持原来基础的实现是,它就变得非常有用。我们可以仅仅继承于它并重写我们需要的方法。阅读Java FutureTask例子,学习如何使用它。

Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?

  • Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。
  • 可以使锁更公平
  • 可以使线程在等待锁的时候响应中断可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间
  • 可以在不同的范围,以不同的顺序获取和释放锁

results matching ""

    No results matching ""