面试之集合框架

java集合相关的优秀文章有很多,本文只是记录初级开发(1到3年)如何去回答该类问题至于3年以上或者基础非常好的同学就可以直接忽略了。

那么开始了,开始吹逼忽悠造火箭模式。

1.初步介绍集合框架,尽量说自己常用的以便后面能够应对面试官问的问题。

①集合主要有两个接口,一个是Collection接口,一个是Map接口,其中List接口和Set接口继承Collection接口,我常用的实现类有ArrayList,LinkedList,Vector,HashSet,SortedSet,HashMap,ConcurrentHashMap,TreeMap。

2.具体详细介绍,能说多细说多细,哪怕是背课文也要背下来。

①ArrayList介绍

可以先问自己几个问题,从回答问题的角度有更深的印象。

问:ArrayList为什么可以存储字符串,对象,Integer,Long等多类型数据呢?为什么元素是重复而有序的呢?为什么可以不断添加元素呢?为什么是线程不安全的呢?

答:ArrayList底层是基于数组实现的,是个Object类型的数据,所以可以存放各种类型的元素,数组添加元素是通过下标进行添加的,所以它是有序的。ArrayList存在一套扩容机制,初始容量为10,默认按照1.5倍进行扩容并且对新数组的容量进行判断是否足够。由于采用的是Array.copyOf()方法进行复制数组,所以尽可能地减少扩容的次数,好的习惯就是指定初始容量。由于实现扩容的方法并没有使用关键字进行加锁,所以ArrayList是线程不安全的。

②HashSet和TreeSet介绍

HashSet是基于HashMap实现的,这也就是他为什么能够去去重的原因。因此也是线程不安全的。

TreeSet是基于TreeMap实现的,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。因此TreeSet是一个有序且不重复的集合。

③HashMap

HashMap也叫散列表,许多缓存技术底层实现就是维护一个大的哈希表。那么哈希表是什么呢?

我们知道,数据结构的物理存储结构只有两种:顺序存储结构链式存储结构。通过数组的下标我们可以很快访问到对应的元素,而哈希表就利用了这种特性,所以哈希表的主干是数组。它提供一种映射规则能够让我们通过key快速获取到value。而这种规则就是我们说的哈希函数。说白了,你新增元素就是通过哈希函数在对应的数组找到一块位置进行存储。那么肯定存在冲突,如何解决哈希冲突呢?开放地址法(冲突了就找下一个未占用的位置),散列函数法(保证每个元素均匀地散落在每个位置上),链地址法。

HashMap采用的是链地址法,也就是数组加链表的形式。数组用来存key-value键值对,链表用于解决哈希冲突,如果定位到数组的位置不存在链表,就只要一次寻址,如果存在链表,就遍历链表去获取元素。也就是说,hashMap链表越少,性能越好。

那么问题了,HashMap是如何保证性能呢?

1.减少扩容次数,根据负载因子为0.75(因为这个数值既保证了查找的效率,也避免了开辟多余的空间)计算出我们需要指定的初始容量,也可以用谷歌的工具包newHashMapWithExpectedSize。

2.链表大于8的时候转成红黑树,提升检索效率。

③ConcurrentHashMap

一般在并发场景下使用次数很多的HashMap,保证线程安全。这里用到了锁分段技术,就是它首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段的数据也能被其他线程访问。

④TreeMap

基于红黑树实现的排序Map,线程不安全。

       关于java集合框架有很多优秀文章,其实都是基于源码分析的,比如HashMap为什么会有这么多概念,直接看底层的put方法实现。我们懂得底层原理更好,这决定你的薪水上限。不懂也没有关系,比如Google的guava工具包,已经对集合做了很多优化。拿来主义还不会嘛(狗头)?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值