说说常见的集合有哪些?java
答:主要分List、Set、Map、Queue四类,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap算法
Comparable和Comparator接口的区别?数组
答:其二者的目的都是让对象可比。第一种将须要比较的类可实现Comparable并重写comparaTo方法制定比较规制,如此让类自己具有可比性,无需依赖其余第三方类。第二种为须要比较的类再定义一个比较类,该类须要基础Comparator接口实现compara方法传入俩个须要对象的进行比较,该方法须要依赖第三方类。安全
集合使用泛型有什么优势?数据结构
答:泛型容许咱们为集合提供一个能够容纳的对象类型,所以,若是你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,由于你将会在编译时获得报错信息。多线程
List、Set、Map之间的区别是什么?性能
答:优化
为何Map接口不继承Collection接口?线程
答:Map提供的是键值对映射(即Key和value的映射),而collection提供的是一组数据(并非键值对映射)。若是map继承了collection接口,那么全部实现了map接口的类究竟是用map的键值对映射数据仍是用collection的一组数据呢(就咱们日常所用的hashMap、hashTable、treeMap等都是键值对,因此它继承collection彻底没意义),并且map若是继承了collection接口的话还违反了面向对象的接口分离原则。code
经常使用的线程安全的Map有哪些?
答:HashTable,ConcurrentHashMap
HashMap和Hashtable有什么区别?
答:
HashMap和TreeMap怎么选?
答:存放的数据须要排序选择TreeMap,不须要排序选择HashMap,并且能够根据HashMap空间的使用,对初始容量和负载因子进行调优。
HashMap的数据结构是什么?
答:数组+链表/红黑树,通常称为“链表散列”
HashMap在JDK 8中有哪些改变?
答:JDK8以前HashMap采用的数据结构为数组+链表,JDK8以后HashMap采用数组+链表/红黑树。增长红黑树来优化链表过长时带来的查询性能消耗;
发生Hash冲突时
JDK7:插入链表的头部,头插法
JDK8:插入链表的尾部,尾插法
HashMap是怎么解决Hash冲突的?
答:
HashMap是怎么扩容的?
答:当存储的数据量达到总容量的负载因子大小(默认0.75)时开始扩容。扩容会建立当前数组大小的两倍,再将原来的数据从新进行hash计算存储位置,因而可知HashMap扩容对性能的消耗比较严重
HashMap如何实现同步?
答:
lock.lock();
Value = map.get(key);
lock.unlock();
ConcurrentHashMap的数据结构是什么?
答:CurrentHashMap的结构是Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构同样。
ArrayList是线程安全的吗?
答:线程不安全
经常使用线程安全的List集合有哪些?
答:Vector、以及经过java.util.Collections.SynchronizedList将任何List转换为线程安全、CopyOnWriteArrayList复制写入,添加元素时先加锁而且复制一份原来的List再添加元素,最后释放锁。
循环删除List集合可能会发生什么异常?
答:会致使数组元素位移,形成元素误删。解决办法是倒着删除或者使用迭代器遍历时删除
ArrayList和LinkedList有什么区别?
答:数据结构不一样,ArrayList底层采用数组,查询快增长或删除慢(涉及到数据元素位移)。LinkedList底层采用链表结构,查询慢,增长删除快
ArrayList和Vector有什么区别?
答:ArrayList线程不安全效率高,Vector线程安全效率低
什么是CopyOnWriteArrayList?
答:CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中全部可变操做(add、set等等)都是经过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操做要慢一些,由于它须要实例的快照。
CopyOnWriteArrayList中写操做须要大面积复制数组,因此性能确定不好,可是读操做由于操做的对象和写操做不是同一个对象,读之间也不须要加锁,读和写之间的同步处理只是在写完后经过一个简单的"="将引用指向新的数组对象上来,这个几乎不须要时间,
什么是fail-safe?
答:当咱们对集合结构上作出改变的时候,fail-fast机制就会抛出异常。可是,对于采用fail-safe机制来讲,就不会抛出异常
这是由于,当集合的结构被改变的时候,fail-safe机制会在复制原集合的一份数据出来,而后在复制的那份数据遍历。
什么是fail-fast?
答:fail-fast的字面意思是“快速失败”。当咱们在遍历集合元素的时候,常常会使用迭代器,但在迭代器遍历元素的过程当中,若是集合的结构被改变的话,就会抛出异常,防止继续遍历。这就是所谓的快速失败机制。fail-fast,即快速失败机制,它是java集合中的一种错误检测机制,当多个线程(单个线程也是能够滴),在结构上对集合进行改变时,就有可能会产生fail-fast机制。
fail-fast和fail-safe有什么区别?
答:
fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,所以不会抛出ConcurrentModificationException
fail-safe机制有两个问题
(1)须要复制集合,产生大量的无效对象,开销大
(2)没法保证读取的数据是目前原始数据结构中的数据。
fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。
fail-fast会在如下两种状况下抛出ConcurrentModificationException
(1)单线程环境
集合被建立后,在遍历它的过程当中修改告终构。
注意 remove()方法会让expectModcount和modcount 相等,因此是不会抛出这个异常。
(2)多线程环境
当一个线程在遍历这个集合,而另外一个线程对这个集合的结构进行了修改。
HashSet的底层实现原理是什么?
答:HashSet底层依赖与HashMap进行数据存储,HashSet的元素就是HashMap中的Key,而Value则为Null
怎么确保一个集合不能被修改?
答:两种实现方式,Collections. unmodifiableCollection(Collection c) 方法建立的集合(
最终会返回一个由Collections.UnmodifiableCollection类,该类对全部的写操做都进行了重写覆盖,使其抛出UnsupportedOperationException异常),和使用Arrays.asList建立的集合(返回了一个Arrays的静态内部类ArrayList,原理与Collections.UnmodifiableCollection差很少)。