容器部分面试题
Java容器都有哪些?
collection和collections有什么区别?
collection是接口,collections是集合的工具类。
List、Set、Map之间的区别是什么?
- List:有序集合,元素可重复
- Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
- Map:键值对集合,存储键、值和之间的映射;Key无序,唯一;value 不要求有序,允许重复
HashMap和HashTable有什么区别?
- 线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
- key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
如何决定使用hashMap还是TreeMap?
- HashMap基于散列桶(数组和链表)实现;TreeMap基于红黑树实现。
- HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素时对元素进行自动排序。
- HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。
都是非线程安全。
说一下HashMap的实现原理?
- HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
- 当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里
- 当计算出的 hash 值相同时,称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value
- 当 hash 冲突的个数:小于等于 8 使用链表;大于 8 时,使用红黑树解决链表查询慢的问题
说一下HashSet的实现原理?
- HashSet 是基于 HashMap 实现的,查询速度特别快
- HashMap 是支持 key 为 null 值的,所以 HashSet 支持添加 null 值
- HashSet 存放自定义类时,自定义类需要重写 hashCode() 和 equals() 方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMap put() 方法,简单概括就是 key 进行 哈希。判断元素 hash 值是否相等、key 是否为同个对象、key 是否 equals。第 1 个条件为 true,2、3 有一个为 true,HashMap 即认为 key 相同)
- 无序、不可重复
ArrayList和LinkedList的区别?
ArrayList查询快,LinkedList增删快。
ArrayList 基于动态数组实现的非线程安全的集合;LinkedList 基于双向链表实现的非线程安全的集合。
对于随机 index 访问的 get 和 set 方法,一般 ArrayList 的速度要优于 LinkedList。因为 ArrayList 直接通过数组下标直接找到元素;LinkedList 要移动指针遍历每个元素直到找到为止。
新增和删除元素,一般 LinkedList 的速度要优于 ArrayList。因为 ArrayList 在新增和删除元素时,可能扩容和复制数组;LinkedList 实例化对象需要时间外,只需要修改节点指针即可。
如何实现数组和List之间的转换?
数组转 List ,使用 JDK 中 java.util.Arrays 工具类的 asList 方法
List 转数组,使用 List 的 toArray 方法。无参 toArray 方法返回 Object 数组,传入初始化长度的数组对象,返回该对象数组
ArrayList和Vector之间的区别?
- 底层都使用数组实现
- 功能相同,实现增删改查等操作的方法相似
- 长度可变的数组结构
不同:vector线程安全
Array和ArrayList有何区别?
定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。
ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。
Queue中poll()和remove()有什么区别?
poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
哪些集合类是线程安全的?
迭代器Iterator是什么?
- Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
- 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
Iterator怎么使用?有什么特点?
- next() 方法获得集合中的下一个元素
- hasNext() 检查集合中是否还有元素
- remove() 方法将迭代器新返回的元素删除
iterator和ListIterator有什么区别?
- ListIterator 继承 Iterator
- ListIterator 比 Iterator多方法
怎么确保一个集合不能被修改?
使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合。