【JAVA面试题-集合篇(一)】

什么是集合?

集合就是一个放数据的容器,准确的说是放数据对象引用的容器
集合类存放的都是对象的引用,而不是对象的本身
集合类型主要有3种:set(集)、list(列表)和map(映射).

集合的特点

集合的特点主要有如下两点:
集合用于存储对象的容器,对象是用来封装数据,对象多了也需要存储集中式管理。
和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小

集合和数组的区别

数组是固定长度的,集合可变长度的。
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

使用集合框架的好处

1、容量自增长;
2、提供了高性能的数据结构和算法,是编码更轻松,提高了程序速度和质量;
3、可以方便地扩展或改写集合,提高代码复用性和可操作性。
4、通过使用JDK自带的集合类,可以降低代码维护和学习新API成本

常用的集合类有哪些

Map接口和Collection接口是所有结合框架的父接口;
1、collection接口的子接口包括:Set接口和List接口
2、Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
3、set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
4、List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

List,Set、Map三者的区别?

在这里插入图片描述
List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有ArrayList、LinkedList和Vector。
Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set接口常用实现类是HashSet、LinkedHashSet以及TreeSet。
Map:是一个键值对集合、存储键、值和之间的映射。key无序,唯一;value不要求有序,允许重复。Map没有继承Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Ma的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap

集合框架底层数据结构

Collection
List:
ArrayList:Object数组
Vector:Object数组
linkedList:双向循环链表
Set:
HashSet(无序,唯一):基于HashMap实现的,底层采用HashMap来保存元素
LikedHashSet:LikedHashSet继承于HashSet,并且其内部是通过LinkedHashMap来实现的,有点类似于我们之
前说的LikedHashMap其内部是基于HashMap实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)
Map:
HashMap:JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲
突而存在的(“拉链法”解决冲突)JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认
为8)时, 将链表转换为红黑树,以减少搜索时间。
LinkedHashMap:LinkedHashMap继承自HashMap,所以它的底层仍然是基于拉链式散列结构由数组和链表或
者红黑树组成,另外,LinkedHashMap在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持
键值对的插入顺序,同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
HashTable:数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
TreeMap:红黑树(自平衡的排序二叉树)

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

Vector:就比ArrayList多了个synchronized(线程安全),因为效率较低,现在已经不太建议使用
hashTable:就比hashMap多了个synchronized(线程安全)不建议使用
ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现,它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里面扮演锁的角色,HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里面包含了一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构;一个Segment里面包含一个HashEntry数组,每个HashEntry是一个链表结构的元素;每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

Java集合的快速失败机制 “fail-fast”?

是Java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。
例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改吗,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出ConcurrentModificationException异常,从而产生fail-fast机制。
原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量,集合再被遍历期间如果内容反生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
解决办法:
1、在遍历过程中,所有涉及到改变modCount值的地方全部加上synchronized。
2、使用CopyOnWriteArrayList来替换ArrayList

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值