Java面试—— Java集合

Java集合体系

Java集合是由Collection接口和Map接口派生的

一、collection集合体系

1.collection集合体系图

 2.Map集合体系

3.说一说你对set集合的了解

1)set集合是继承collection接口的,不能包含重复元素

2)set集合下有两个实现和一个接口:HashSet类和EnumSet类,以及SortedSet接口;

3.1 谈一下你对HashSet的了解

1)HashSet是Set接口的典型实现。HashSet是使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashcode()方法得到该对象的hashcode值,然后根据hashcode值决定该对象在hashset中存储的位置;

2)hashset集合判断两个元素相等,通过equals()和hashcode()方法判断;

3.1.1谈一下你对HashSet下继承类LinkedHashSet了解

1)LinkedeHashSet继承了HashSet;

2)LinkedHashSet集合也是根据元素的hashcode值来决定元素的存储位置,但和hashset不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的;当遍历LinkedeHashSet集合时,LinkedhashSet会按元素的添加顺序访问集合里的元素;

3)由于LinkedeHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问set集合里的全部元素时(遍历),将具有良好的性能,因为链表很适合进行遍历;

3.2 谈一下你对SortSet的了解

1)该接口主要用于排序操作,所有实现此接口的子类都属于排序的子类;

2)TreeSet是该接口的实现类,TreeSet可以确保元素处于排序状态;

3.2.1 谈一下你对SortSet的实现类TreeSet的了解

         TreeSet是该接口的实现类,TreeSet可以确保元素处于排序状态;

3.3 谈一下你对EnumSet的了解

1)Enum是一个专门为枚举类设计的集合类,EnumSet中的元素都必须是指定的枚举类型,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet集合中的元素也是有序的;

2)Enum是以枚举值在Enum类的定义顺序来决定集合元素的顺序;

3.4.set集合如何保证集合内元素不重复?

1)首先在添加自定义对象时,要重写hashcode和equals两个方法;

 2)set集合执行add方法添加元素时,首先会调用该对象的hashcode方法与集合内已存在的元素进行比较,如果hashcode不同则意味着两个元素完全不同;如果hashcode相同,则进而通过执行equals方法进行比较判断;(hashCode先比较,如果一样再调用equals);

4. 谈一下你对List的了解

1)List集合代表一个元素有序、可重复的集合,List集合中每个元素都有其对应的顺序索引;

2)List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素;

3)List集合默认按元素的添加顺序设置元素的索引;

4)List常见的实现类有LinkedList、ArrayList、Vector等;

4.1谈一下你对ArrayList 的了解

1)ArrayList是一个基于数组实现的List类,它封装了一个动态数组,其容量能自动增长;

2)ArrayList不是线程安全的,只能在单线程环境下使用;

3)  实现了Serializable接口,因此它支持序列化,能够通过序列化传输;

4)实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;

5)实现了Cloneable接口,能被克隆。

4.1.1 ArrayList list = new ArrayList(20)中list扩容了几次?

1)ArrayList list=new ArrayList(20); 这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。 
所以,扩充为0次;

2)ArrayList list=new ArrayList(); 这种是默认创建大小为10的数组,当存放元素超过10个时,每次扩容大小为1.5倍 ,其大小会以此为:10、15、22、33...

4.2 谈一下你对Vector的了解

1)Vector是List集合中的一个继承类,也是Collection集合体系中唯一个线程安全的集合;

2)Vector和ArrayList在用法上几乎完全相同,但在JDK1.2以后,就将Vector改为实现list接口,统一归入集合框架体系中

4.2.1谈一下你对Stack的了解

Stack是Vector提供的一个子类,对Vector集合进行了扩展,它的实现原理是以数组实现堆栈;

4.3 谈一下你对LinkedList的了解

1)  LinkedList是一个基于链表实现的List类,从源码看可以得出这是一个双向链表;

2)LinkedList继承了AbstractSequentialList,实现了实现List、Deque、Cloneable、Serializable;

3)LinkedList 实现 List 接口,能对它进行队列操作;

4)LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用

5) LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆

6) LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

5. 谈一下你对Queue的了解

1)Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部;

2)访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素;

5.1谈一下你对PriorityQueue的了解

PriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序

5.2谈一下你对Deque的了解

Deque接口代表一个"双端队列",双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可以当成队列使用、也可以当成栈使用

 

二、Map集合体系

1.Map集合体系图

 

2.谈一谈你对Map的了解

1)Map用于保存具有"映射关系"的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value;

2)Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false;

3)Map的这些实现类和子接口中key集的存储形式和Set集合完全相同(即key不能重复);

4)Map的这些实现类和子接口中value集的存储形式和List非常类似(即value可以重复、根据索引来查找);

3.谈一下你对HashMap的了解

1)HashMap是Map集合的一个实现类;

2)HashMap和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序;

3)HashMap类似HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true、  同时两个key的hashCode值也必须相等;

3.1 谈一下LinkedHashMap的了解

1)LinkedHashMap是HashMap的实现类;

2)LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分);

4. 谈一下你对Hashtable 的了解

1)Hashtable是Map集合体系中唯一个线程安全的集合;

5. 谈一下你对SortedMap的了解

1)正如Set接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类一样,Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类;

5.1 谈一下你对TreeMap的了解

1)TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点;

2)TreeMap存储key-value对(节点)时,需要根据key对节点进行排序;

3)TreeMap可以保证所有的  key-value对处于有序状态。同样,TreeMap也有两种排序方式: 自然排序、定制排序;

三、常问考点

1.请说出线程安全的集合和线程不安全的集合对象

线程安全的集合对象:Vector、HashTable、StringBuffer;

线程不安全的集合对象:ArrayList、LinkedeList、HashMap、HashSet、TreeMap、TreeSet、StringBuilder;

2. ArryList和LinkedList的区别

在处理一列数据项时,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上说它更像数组;然而LinkedList的内部实现是基于一组连接的记录,所以,它更像一个链表结构;所以它们在性能上有很大的差别。 由上可知,在ArrayList的前面或者中间插入数据的时候,必须将其后的所有数据相应的后移,这样要花费较多的时间;所以,当操作是在一列数据的后面添加数据而不是在前面或者中间,并需要随机地访问其中的元素时,使用ArrayList性能比较好。 然而访问链表中的某个元素的时候,就必须从链表的一端开始,沿着连接的方向一个一个元素的去查找,直到找到所需的元素为止,所以,当对一列数据的前面或者中间执行添加或者删除操作时,并且按照顺序访问其中的元素时,要使用LinkedList。 如果在实际的操作中,前面两种情况交替出现,可以考虑使用List这样的通用接口,而不用关心具体的实现,再具体的情况下,它的性能由具体的实现来保证。

其他考点链接地址

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值