2019独角兽企业重金招聘Python工程师标准>>>
同步容器有两类:
- Vector、Stack、HashTable
- Collections类中提供的静态工厂方法创建的类
Vector 实现了List接口,和ArrayList类似,但方法都是synchronized方法,即进行了同步措施。
Stack 类似Vector使用synchronized方法同步,是继承Vector的。
HashTable实现了Map接口,类似HashMap,但是HashTable进行了同步处理,而HashMap没有。
Collections类是一个工具提供类,提供了大量的方法,如对集合或者容器进行排序查找等操作,还提供了静态工厂方法来创建同步容器类。
HashMap和HashTable区别?Hashmap key可以是任何类型吗?
- 1.HashTable的方法是同步的,方法前面都有synchronized,HashMap未同步,在多线程场景要手动同步。可以通过Map m = Collections.synchronizedMap(new HashMap())对HashMap进行同步操作。
- 2.HashTable不允许有null值,key和value都不行,HashMap都可以有null。
- 3.HashTable使用Enumeration遍历,HashMap使用iteration遍历。
- 4.HashTable中hash数组大小默认是11,增加方式是old*2+1。HashMap中hash数组大小默认是16,一定是2的倍数。
- 5.hash值使用不同,HashTable直接使用对象的hashCode,HashMap重新计算hash值。
LinkedList ArrayList区别
ArrayList基于数组,LinkedList基于链表Arraylist,查找快;LinkedList插入删除快;随机查找频繁用ArrayList,插入删除频繁用LinkedList。
ArrayList,Vector,HashMap,HashTable扩容机制
数组 | 初始容量 | 扩容 |
---|---|---|
ArrayList | 10 | old*3/2+1 |
Vector | 10 | old*2 |
HashMap | 16 | 达到阈值扩容,为原来两倍 |
HashTable | 11 | 达到阈值扩容,old*2+1 |
Concurrent包
- semaphore信号量用来表示可用资源的数目,如果请求资源超过这个数,就阻塞这一线程。
- callable接口,实现call函数,有返回值可以得到call函数的返回值判断call函数是否执行完毕。
- Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callble任务的状态和得到Callblede的返回结果。Future提供了get()方法让我们可以等待Callable结束并获取他的执行结果。
- Future Task是Future的一个基础实现,我们可以将他同Exexcutors使用处理异步任务。
Java Concurrency API中的Lock接口
- Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。
- 可以使锁更公平。
- 可以使线程在等待锁的时候响应中断,可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间。
- 可以在不同的范围,以不同的顺序获取和释放锁。