Java容器模块2面试试题以及答案

@Ta 06-06 02:01发布,06-06 02:06修改 86点击
Java容器模块2面试试题以及答案
整理抄写:王耀国春飞wygcf

java容器都有哪些?

   ————
   |      |
   |          / Vector ——— Stack
   |         /
   |–––– List —— ArrayList 
   |         \            
   |          \ Linkedlist
   |              /
   |             /
   |            /
   |–––– Queue —— Priority Queue
   |
   |
   |              /— HashSet —— LinkHashSet
   |–––– Set ––
   |              \— TreeSet
   |
   |      |
   ————
   
   ————
   |      |
   |                 /– HashMap
   |———— Map ––
   |                 \– TreeMap
   |      |
   ————   
Screenshot_2021-06-05-23-12-18-84.jpg   
Collection 和 Collections 有什么区别?

java.util.Collection 是一个集合接口 (集合类的一个顶级接口)。
它提供了对集合对象进行基本操作的通用接口方法。
Collection 接口在 Java 类库中有很多具体的实现。
Collection 接口的意义是为各种具体集合提供了最大化的统一操作方式,
其直接继承接口有List与Set。

Collections则是集合类的一个工具类/帮助类,
其中提供了一系列静态方法,
用于对集合中元素进行排序、搜索以及线程安全等各种操作。

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

             「继承接口」     「常见实现类」                      「常见方法」                「元素」             「顺序」                 「线程安全」

 「List」––– Collection        AbstractList                  add()、remove()、clear()、         可重复                 有序                  Vector线程安全
                              (其中常用的子类有:              contains()、size()
                         ArrayList、LinkedList、Vector) 
 
 
 
 
 「Set」––– Collection         AbstractSet                  add()、remove()、clear、         不可重复                无序                       没有
                              (其中常用的子类有:              contains()、size()             (用 equals()判断)   (实际上由HashCode决定)
                       HashSet、LinkedHashSet、TreeSet)
                    
 
 
 
 
 「Map」      没有        HashMap、HashTable            put()、get()、remove()、         不可重复                 没有                HashTable线程安全
                                                                clear()、 containsKey()、
                                                                containsValue()、 keySet()、
                                                                values()、size()

Screenshot_2021-06-05-23-52-30-69.jpg 
HashMap 和 HashTable 有什么区别?

HashMap 去掉了 HashTable 的 contains方法,
但是又加上了 containsValue() 和 containsKey() 方法。
HashTable是同步的,HashMap是非同步的,效率上要高于HashTable。
HashMap允许空键值,HashTable不允许。

如何决定使用 HashMap 还是 TreeMap?
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。
然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。
基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

说一下 HashMap 的实现原理?
HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的数据结构:
在java编程语言中,最基本的结构就是两种,一个是数组,另一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造,HashMap也不例外。
HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体。
当我们往HashMap中put元素时,首先根据key的HashCode重新计算Hash值,根据Hash值得到这个元素在数组中的位置(下标),
如果该数组在该位置上已经存了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。
如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
需要注意 Jdk1.8 中对HashMap的实现做了优化,当链表中的节点数据超过八个以后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)。

说一下 HashSet 的实现原理?
HashSet底层由HashMap实现,
HashSet的值存放于HashMap的key上,
HashMap的value统一为PRESENT。

ArraryList 和 LinkedList 的区别是什么?
最明显的区别是 ArraryList底层的数据结构是数组 支持随机访问,
而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

如何实现数组和List之间的转换?
List转换成为数组:
调用ArrayList的toArray方法。
数组转换成为List:
调用Arrays的asList方法。

ArrayList 和 Vector 的区别是什么?
Vector是同步的,而ArrayList不是。
然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。
ArrayList比Vector快,它因为有同步,不会过载。
ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

Array 和 ArrayList 有何区别?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小后不可变的,而ArrayList大小是可变的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

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

哪些集合器是线程安全的?
Vector:比ArrayList多了一个同步化机制(线程安全),因为效率较低,现在不推荐使用。
在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
Statck:堆栈类,先进后出。
HashTable:比HashMap多了一个线程安全。
Enumeration:枚举,相当于迭代器。

迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不想要了解该序列的底层结构。
迭代器通常被称为”轻量级”对象,因为创建它的代价小。

迭代器 Iterator 怎么使用?有什么特点?

Java中的迭代器Iterator功能比较简单,并且只能单向移动:
1.Java中的Iterator()要求容器返回一个Iterator。
第一次调用Iterator的next()方法时,它返回序列的第一个元素。
注意:Iterator()方法是java.lang.iterable接口,被collection继承。
2.使用next()获得序列中的下一个元素。
3.使用hasNext()检查序列中是否还有元素。
4.使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器中最简单的实现,为List设计的Listlterator具有更多的功能,
它可以从两个方向遍历List,也可以从List中插入和删除元素。

Iterator 和 ListIterator 有什么区别?
Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以是前向也可以是后向。
ListIterator实现了Iterator接口,并包含其他的功能。
比如:增加元素、替换元素、获取前一个和后一个元素的索引,等等。

回复列表(0)
帖子没有回复
添加新回复
回复需要登录

[聊天-此处没基佬] 方爷:Hello,鸡佬林!小尾巴华为Mate40 Pro鸡佬版