java面试宝典(23)

169 阅读4分钟

学习java.java企业级实战项目

  1. java 的集合容器都有哪些?

如下给出了大致的结构  

所有线性表对象的父类是Collection

有线性表类,比如ArrayList和Set等。

有键值对类,比如HashMap。

  1. Collection 和 Collections 有什么区别?

Collection 是一个集合接口,是所有线性表对象的父类。

Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法。

  1. List、Set、Map 之间的区别是什么?

  2. HashMap 和 Hashtable 有什么区别?

    首先说,两者都是键值类的对象

HashTable线程安全的,而HashMap线程不安全的,大多数的场景是单线程环境,在单线程环境下,HashMap效率上比hashTable要高。

HashMap允许空键值,而hashTable不允许。

  1. 如何决定使用 HashMap 还是 TreeMap?

对于在Map中进行插入、删除和定位元素这类操作,可以选HashMap。但如果你要对一个有序的key集合进行遍历,需要选TreeMap。

  1. 说一下 HashMap 的实现原理?

HashMap是基于数据结构里的散列表,在大数据情况下,能保证get的高效性。

 HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。 

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当向Hashmap对象里put元素时,会根据key的hashcode计算hash值,根据hash值得到这个元素在数组中的位置,如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

  1. 说一下 HashSet 的实现原理?

HashSet在底层上,是由HashMap实现的

HashSet的值放在HashMap的key上

HashMap的value统一为PRESENT

  1. ArrayList 和 LinkedList 的区别是什么?

ArrrayList底层实现的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。

使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

  1. 如何做到数组和 List之间的转换?

List对象转换成为数组:可以调用ArrayList(或其它List)的toArray方法。

数组转换成为List:调用Arrays的asList方法。

  1. ArrayList 和 Vector 的区别是什么?(面试大概率会问)

Vector是线程安全的,而ArrayList不是。所以在单线程情况下,建议使用ArrayList 

在扩容时,Vector是扩容100%,但ArrayList是50%,后者更节省内存 

    结论:大多数开发场景是单线程环境,所以建议使用ArrayList

  1. Array 和 ArrayList 有何区别?

Array能容纳基本数据类型和自定义对象,而ArrayList只能容纳自定义的对象,对于基本数据类型,需要转换成封装类才能存储。 

Array是指定大小的,要手动扩容,而ArrayList大小虽然可以在定义时指定,但遇到容量满时会自动扩容。 

Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

    所以建议使用ArrayList

  1. 在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

  1. 哪些集合类是线程安全的?

Vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

Statck:堆栈类,先进后出,项目中用得并不多。

Hashtable:就比hashmap多了个线程安全,所以建议使用HashMap。

enumeration:枚举,所以现在建议用Iterator来迭代。

    结论是,如果在单线程情况下,不建议使用这些线程安全对象。i