Java集合/面试题

首先一张图:了解五花八门的集合继承关系!图片说明
太烦了没关系,缩略版如下:
图片说明
总体上来看,常用的、常问的有三个接口:List有序列表、Set集合、Map键值对集合。

1.List:有序列表(元素可重复)

(1)ArrayList:数组

  • 底层结构:Object[]数组
  • 初始化:ArrayList的构造函数有三个:
    ①无参:数组初始化为默认的空数组。(添加第一个元素的时候才会初始化为容量为10的数组)
    ②参数为int(即指定大小数组):如果参数小于10,则创建容量为10的数组,否则创建指定大小的数组。
    ③参数为Collection类型:将参数转化为数组,如果数组为空则指向默认空数组,否则查看数组的类型是否是Object类型,不是的话要复制转换为Object类型。
  • 添加新元素:先移动游标,然后判断是否需要扩容,需要则先扩容,在将元素后移将新元素的位置腾出来(尾部添加省略这一步),之后在将新元素放在腾出来的指定位置。
  • 扩容:先看扩容的大小,如果扩容的大小小于10,则创建一个新数组容量为10,否则就1.5倍数组扩容。
  • 删除元素:删除指定索引的元素,将该索引后的元素前移一位,最后将游标前移;删除指定元素,首先遍历找到该元素的索引,然后通过索引删除该元素。

    (2)LinkedList:双向链表

  • 底层结构:双向链表
  • 添加新元素:
    ①头部添加:新元素的后继指针指向头指针指向的元素,头指针指向的元素的前驱指针指向新元素,头指针指向新元素。
    ②尾部添加:新元素的前驱指针指向尾指针指向的元素,尾指针指向的元素的后继指针指向新元素,尾指针指向新元素。
  • 删除元素:从头指针开始遍历,找到对应元素后将待删除元素的前驱指针指向的元素的后继指针指向待删除元素的后继指针指向的元素,待删除元素的后继指针指向的元素的前驱指针指向待删除元素的前驱指针指向的元素。

    (3)Vector:向量

    与ArrayList相比,多了通过synchronized保证线程安全。

    2.Map:键值对集合(键不可重复)

    (1)HashMap:

  • 底层结构:
    JDK1.7:数组+链表
    JDK1.8:数组+链表+红黑树
    (通过红黑树来优化查询速度,当链表上元素个数大于8转化为红黑树,小于8则转化为链表)
  • 初始化:构造函数有四个:
    数组的默认初始化大小为16,默认负载因子为0.75。
    ①无参:负载因子初始化为默认值0.75。
    ②参数为int(指定容量):调用构造函数③(int,int),负载因子为默认值0.75。
    ③参数为int,int(指定容量,指定负载因子):判断指定的容量、负载因子的合法性。
    ④参数为Map类型:先判断对于参数的大小,更新数组的元素个数大小,遍历将每个键值对放进hashmap中。
  • 添加新元素:先判断对于添加元素后的元素总个数是否需要扩容,如果需要,先扩容,之后进行散列,如果对应位置为null则直接创建新的节点放进去,如果对应位置有元素,则遍历判断,如果有相同key的覆盖,遍历结束如果没有找到相同的key则在链表尾部插入新节点。
    (1.7中使用了头插法插入节点,1.8中使用尾插法,目的是为了避免链表环化问题)。
  • 扩容:如果旧数组的大小>0则创建新数组,大小为旧数组的2倍。如果旧数组为空则创建的新数组长度为16。之后如果旧数组不为空则要把旧数组的键值全部重新hash到新数组中。
    计算新位置的时候:如果当前位置上的链表只有一个元素e,则通过e.hash & (newCap-1)计算出新位置直接放过去;
    如果当前位置上的链表不止一个元素,则可能会分成两部分:一部分仍在原位置e.hash & (oldCap-1),另一部分在hash & (newCap-1) == hash &(oldCap*2-1)即原下标+旧数组长度;(hash & oldCap) == 0的在原位置上,而不满足的是在新位置上。
  • 删除元素:先进行hash散列,如果散列的位置上链表只有一个元素则判断是否元素hash相等,key值相等,相等删除该节点;如果不止一个元素则遍历判断后在删除。
  • 查找元素:通过key查找元素时,会通过hash散列到对应的链表上,先判断链表头元素的hash、key是否相等,相等则直接返回;如果不相等则遍历链表判断后找到在返回,如果结束仍然没有找到返回null。

    (2)HashTable:

    与HashMap相比,多了通过synchronized保证线程安全。

    (3)LinkedHashMap:

    与HashMap相比,通过头指针、尾指针,并给每个Node<K,V>添加了前后指针,来记录元素的插入顺序。

    (4)TreeMap:

  • 底层结构:红黑树
    数据结构之红黑树 暂时没写....

    3.Set:集合(元素不可重复)

    (1)HashSet:基于HashMap实现的,value=null

    (2)LinkedHashSet:基于LinkedHashMap实现的,value=null

    (3)TreeSet:基于TreeMap实现的,value=null

全部评论
很强
点赞 回复 分享
发布于 2021-07-14 21:42

相关推荐

关于我大学本科四年,想了很多,但还是不知道该怎么动笔&nbsp;“大学四年,是我从懵懂少年走向职场青年的转折期。这一路跌跌撞撞,有迷茫,有遗憾,也有成长和决心。”&nbsp;大一刚进来时仍然有高中那股学习劲,经常一个人去图书馆学高等数学,但后面劲头一过便开始在宿舍开启躺平生活(现在想想那段时间真的很爽,无忧无虑)。由于大一担任班干部,所以经常要跟其他班的班干部交流,在此期间认识了隔壁班的一位女生,短发而很可爱,因为很多团建还有比赛都是我们两班一起参加的,而且我和她都是负责人,所以交集很多,后面慢慢地彼此对产生了好感,所以在大一刚开学的2个月后,我们在一起了,彼此之前都是初恋。但当时我真的是太太太直男了,对感情的想...
真烦好烦真烦:骗哥们可以,别把你自己也骗到了就行。哥们被你骗了真无所谓的,打个哈哈就过了。但希望你打完这段话后擦一下眼角,别让眼泪掉在手机屏幕上了就行。你说的这些话,哥们信一下也是没什么的。还能让你有个心里安慰,但这种话说出来骗骗兄弟就差不多得了,哥们信你一下也不会少块肉,但是你别搞得自己也当真了就行。哥们被你骗一下是真无所谓的,兄弟笑笑也就过去了。真不是哥们想要破你防,你擦擦眼泪好好想想,除了兄弟谁还会信你这些话?
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务