一、请说明List、Map、Set三个接口存取元素时,各有什么特点?
List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。
二、阐述ArrayList、Vector、LinkedList的存储性能和特性
- ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,
- Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差。
- LinkedList使用双向链表实现存储,所以插入速度较快。
- ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
三、请讲讲你所知道的常用集合类以及主要方法?
最常用的集合接口是 Set、List、Queue,它们都是Collection的子接口,除此之外还有Map接口。
- 对于Set集合而言,它的常用实现类包括HashSet与TreeSet。HashSet还有一个子类:LinkedHashSet,包含添加、删除、取出、遍历元素的方法。
- 对于List集合而言,它的常用实现类包括ArrayList、Vector与LinkedList。包括了大量根据索引来添加、删除、取出集合元素的方法
- 对于Queue集合而言,它有一个子接口Deque(代表双端队列),它的常用实现类包括ArrayDeque与LinkedList。由于它是双端队列,即可当成队列使用,也可当成栈使用,因此它增加栈、队列的方法,如offer、peek、push、pop等。
- 对于Map集合而言,它的常用实现类是HashMap与TreeMap。HashMap还有一个子类:LinkedHashMap。对Map而言,它所包含的无非就是根据key来添加、删除、取出value的方法。
四、请你说明HashMap和Hashtable的区别?
- HashMap允许键和值是null,而Hashtable不允许键或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
五、请简单说明一下什么是迭代器?
- Iterator提供了统一遍历操作集合元素的统一接口, Collection接口实现Iterable接口。
- 每个集合都通过实现Iterable接口中iterator()方法返回Iterator接口的实例, 然后对集合的元素进行迭代操作。
六、请简单说说Cloneable和Serializable接口?
- Cloneable接口
clone:它允许在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。
Java 中 一个类要实现clone功能 必须实现 Cloneable接口,否则在调用 clone() 时会报 CloneNotSupportedException 异常。 - Serializable接口
Serializable接口实现序列化,当需要把在内存中的对象的状态(也就是实例变量,不是方法)保存下来,并且可以在需要时再将对象恢复。 Java提供了一种保存对象状态的机制,那就是序列化,当把对象从Byte 流里的数据读出来是反序列化。
什么时候实现序列化:1)想把内存中的对象状态保存到一个文件中或者数据库中时候; 2)想把对象通过网络进行传播的时候。
七、请解释一下TreeMap?
TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。
八、什么是红黑树?
九、 Hash算法解决冲突的方法一般有以下几种常用的解决方法
1, 开放定址法:
所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 。
2、再哈希法:
再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数
计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。
3、 链地址法:
链地址法的基本思想是:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向
链表连接起来。
4, 建立公共溢出区:
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
十、锁机制存在以下问题
- 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。
- 一个线程持有锁会导致其它所有需要此锁的线程挂起。
- 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。
十一、什么是CAS?
CAS,compare and swap,CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前 值。)
十二、请你解释HashMap的容量为什么是2的n次幂?
为了让散列更加均匀。
十三、请你说明一下Map和ConcurrentHashMap的区别?
hashmap是线程不安全的,put时在多线程情况下,会形成环从而导致死循环。CoucurrentHashMap是线程安全的,采用分段锁机制,减少锁的粒度。