Java面试题容器 第二部分
Java面试题容器 第二部分
先上几张大图说明java中容器的具体情况。
部分内容借鉴别人总结的东西,如有需要,请看这篇博客。
如果想详细了解java集合相关内容,请看这里。
1、Collection和Collections有什么区别?
- Collection是一个集合接口,所有集合都是它的子类。
- Colletions是一个包装类,包含了很多静态方法,不能被实例化,就像是一个工具类。
2、HashMap和HashTable的区别?
hashmap | hashtable | |
---|---|---|
存储 | key和value都可以为null,但是只能有一个key为null | 不可以为null |
线程安全 | 线程不安全 | 线程安全,就是加了锁的原因 |
推荐使用的情况 | 单线程下可以使用 | 不推荐使用,如果使用可以使用concurrenthashmap代替 |
3、说一下HashSet的实现原理?
首先,hashset是基于hashmap实现的。
hastset底层使用hashmap来保存所有的元素,所以hashset的实现比较简单,相关hashset的操作也是使用hashmap的相关方法的实现的。
4、说一下HashMap的实现原理?
5、如何实现数组和List直接的转换?
- 数组转 List:使用 Arrays. asList(array) 进行转换。
- List 转数组:使用 List 自带的 toArray() 方法。
6、ArrayList和Vector的区别是什么?
- 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
- 性能:ArrayList 在性能方面要优于 Vector。
- 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%
7、Array和ArrayList 的区别?
- Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
- Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
- Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
8、Queen中poll()和remove()有什么区别?
- 相同点:都是返回第一个元素,并在队列中删除返回的对象。
- 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。
9、哪些集合类是线程安全的
- hashtable
- vector
- stack
10.对一些常用集合的详细解释?
- Arraylist: Object数组 动态数组
- Vector: Object数组
- LinkedList: 双向循环链表。
- HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
- LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的* * LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
- TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)
- HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
- LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
- HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
- TreeMap: 红黑树(自平衡的排序二叉树)
11、Comparable和Comparator的区别?
- Comparable 接口,在
java.lang
包下,用于当前对象和其它对象的比较,所以它有一个#compareTo(Object obj)
方法用来排序,该方法只有一个参数。 - Comparator 接口,在
java.util
包下,用于传入的两个对象的比较,所以它有一个#compare(Object obj1, Object obj2)
方法用来排序,该方法有两个参数。
12.fail-fast与fail-safe有什么区别?
Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。
Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。
Fail-fast迭代器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。
13、最后我们做一个简单的总结?
List 我们存放的是有序、可重复的集合,你可以通过索引来得到这里的值。单列集合
Set 我们存放的是无序、不可重复的集合,这意味这你存入和取出值的顺序不一定相同。 单列集合
Map 我们存放的元素是以key-value的形式来存储的。 这是双列集合。