- java 的集合容器都有哪些?
如下给出了大致的结构
所有线性表对象的父类是Collection
有线性表类,比如ArrayList和Set等。
有键值对类,比如HashMap。
- Collection 和 Collections 有什么区别?
Collection 是一个集合接口,是所有线性表对象的父类。
Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法。
-
List、Set、Map 之间的区别是什么?
-
HashMap 和 Hashtable 有什么区别?
首先说,两者都是键值类的对象
HashTable线程安全的,而HashMap线程不安全的,大多数的场景是单线程环境,在单线程环境下,HashMap效率上比hashTable要高。
HashMap允许空键值,而hashTable不允许。
- 如何决定使用 HashMap 还是 TreeMap?
对于在Map中进行插入、删除和定位元素这类操作,可以选HashMap。但如果你要对一个有序的key集合进行遍历,需要选TreeMap。
- 说一下 HashMap 的实现原理?
HashMap是基于数据结构里的散列表,在大数据情况下,能保证get的高效性。
HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当向Hashmap对象里put元素时,会根据key的hashcode计算hash值,根据hash值得到这个元素在数组中的位置,如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
- 说一下 HashSet 的实现原理?
HashSet在底层上,是由HashMap实现的
HashSet的值放在HashMap的key上
HashMap的value统一为PRESENT
- ArrayList 和 LinkedList 的区别是什么?
ArrrayList底层实现的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。
- 如何做到数组和 List之间的转换?
List对象转换成为数组:可以调用ArrayList(或其它List)的toArray方法。
数组转换成为List:调用Arrays的asList方法。
- ArrayList 和 Vector 的区别是什么?(面试大概率会问)
Vector是线程安全的,而ArrayList不是。所以在单线程情况下,建议使用ArrayList
在扩容时,Vector是扩容100%,但ArrayList是50%,后者更节省内存
结论:大多数开发场景是单线程环境,所以建议使用ArrayList
- Array 和 ArrayList 有何区别?
Array能容纳基本数据类型和自定义对象,而ArrayList只能容纳自定义的对象,对于基本数据类型,需要转换成封装类才能存储。
Array是指定大小的,要手动扩容,而ArrayList大小虽然可以在定义时指定,但遇到容量满时会自动扩容。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
所以建议使用ArrayList
- 在 Queue 中 poll()和 remove()有什么区别?
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
- 哪些集合类是线程安全的?
Vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
Statck:堆栈类,先进后出,项目中用得并不多。
Hashtable:就比hashmap多了个线程安全,所以建议使用HashMap。
enumeration:枚举,所以现在建议用Iterator来迭代。
结论是,如果在单线程情况下,不建议使用这些线程安全对象。i