首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
在迎接offer的候选人1
西安工程大学 数据分析师
关注
已关注
取消关注
@黎笛:
【八股文】Java集合
1.什么是集合 2.集合的特点 3.集合和数组的区别 4.常用集合类 5.哪些集合是线程安全的 6.ArrayList和LinkedList有什么区别 7.ArrayList的扩容机制 8.有哪几种实现ArrayList线程安全的方法 9.能说一下HashMap的数据结构吗 10.你对红黑树了解多少,为什么不用二叉树呢 11.红黑树怎么保持平衡的 12.HashMap的put流程 13.HashMap怎么查找元素的 14.HashMap的哈希/扰动函数是怎么设计的 15.为什么哈希/扰动函数能降hash碰撞 16.为什么HashMap的容量是2的倍数 17.如果初始化HashMap,传一个17的值new HashMap<>,它会怎么处理 18.你还知道哪些哈希函数的构造方法呢 19.ConcurrentHashMap 20.HashSet是如何保证元素不重复的 1.什么是集合 用于存储数据的容器 2.集合的特点 对象封装数据,对象多了也需要存储。集合用于存储对象 对象的个数确定可以使用数组,对象的个数不确定可以使用集合。集合长度可变 3.集合和数组的区别 数组是固定长度的,集合可变长度 数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型的 4.常用集合类 今天图片不知道为什么上传不进来,先欠着,之后编辑 5.哪些集合是线程安全的 Vector:只比ArrayList多了个同步机制,效率很低,已经不建议使用了 Stack:堆栈类,先进后出 hashtable:就比HashMap多了个线程安全 enumeration:枚举,相当于迭代器 6.ArrayList和LinkedList有什么区别 ArrayList底层是数组,LinkedList底层是双向链表 ArrayList利于查询,LinkedList利于增删改 ArrayList支持随机访问,也实现了RandomAccess接口(这个接口用来标识是否支持随机访问),LinkedList不支持 ArrayList占用连续的内存,LinkedList内存空间不连续,需要存储前驱和后继 7.ArrayList的扩容机制 ArrayList的容量是确定的,初始值为10,所以在插入的时候会检查是否需要扩容。需要扩容的时候就是创建一个1.5倍的新数组,然后把原数组的值拷贝过去 8.有哪几种实现ArrayList线程安全的方法 使用Vector代替ArrayList 使用Collections.synchronized包装ArrayList,然后操作包装后的list 使用CopyOnWriteArrayList代替ArrayList 在使用ArrayList时,应用程序通过同步机制去控制ArrayList的读写 9.能说一下HashMap的数据结构吗 JDK1.8,由数组+链表+红黑树组成,数组负责存放元素,通过哈希函数,将元素映射到桶数组对应索引的位置,如果发生冲突,用链表连接数组,当链表>8时并且数组>=64,转换成红黑树,红黑树<6转换成链表,这里设的不同的原因是防止多次转换。HashMap初始容量是16,加载因子为0.75,当所有数据元素>容量*加载因子,就进行扩容,数组容量<64前,不会转换红黑树,只会扩容 10.你对红黑树了解多少,为什么不用二叉树呢 红黑树本质上是一种二叉查找树,为了保持平衡,它又在二叉查找树的基础上增加了一些规则: 1)每个节点要么是红色,要么是黑色 2)根节点永远是黑色的 3)所有的叶子节点都是黑色的 4)每个红色节点的两个子节点一定是黑色的 5)从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点 红黑树平衡后,插入,删除,查找的最坏时间复杂度都是O(logn) 11.红黑树怎么保持平衡的 旋转 + 染色 12.HashMap的put流程 源码分析: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; //判断是否进行初始化 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; //槽节点为空,直接新建 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node<K,V> e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; //树结点操作 else if (p instanceof TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { //链表操作 for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } //如果key存在 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; } 13.HashMap怎么查找元素的 14.HashMap的哈希/扰动函数是怎么设计的 HashMap的哈希函数是先拿到key的hashCode,是一个32位的int类型的数值,然后让hashCode的高16位和低16位进行异或操作 15.为什么哈希/扰动函数能降hash碰撞 因为 key.hashCode() 函数调用的是 key 键值类型自带的哈希函数,返回 int 型散列值。int 值范围为 -2147483648~2147483647,加起来大概 40 亿的映射空间。 16.为什么HashMap的容量是2的倍数 第一个原因:为了方便哈希取余 第二个原因:在扩容时,利用扩容后的大小也是2的倍数,将已经产生hash碰撞的元素完美的转移到新的table 17.如果初始化HashMap,传一个17的值new HashMap<>,它会怎么处理 初始化的时候不是2的倍数时,HashMap会向上寻找离得最近的2的倍数 18.你还知道哪些哈希函数的构造方法呢 除留取余法 直接定址法 数字分析法 平均取中法 19.ConcurrentHashMap 在jdk1.8基于CAS + synchronized 实现 线程安全我们主要从 初始化,插入,查找,扩容四个角度去考虑 初始化数组或头节点时,ConcurrentHashMap并没有加锁,而是CAS的方式进行原子替换(原子操作,基于Unsafe类的原子操作API) 插入数据时会进行加锁处理,但锁定的不是整个数组,而是槽中的头节点。所以,ConcurrentHashMap中锁的粒度是槽,并发性能很好。如果一个线程对这个ConcurrentHashMap进行插入(put)时,发现数组正在扩容,那么它就会立即参与扩容操作,完成扩容后再插入数据到新数组。 扩容时会进行加锁处理,锁定的仍然是头节点。并且,支持多个线程同时对数组扩容,提高并发能力。每个线程需先以CAS操作抢任务,争抢一段连续槽位的数据转移权。抢到任务后,该线程会锁定槽内的头节点,然后将链表或树中的数据迁移到新的数组里。 查找数据时并不会加锁,所以性能很好。另外,在扩容的过程中,依然可以支持查找操作。如果某个槽还未进行迁移,则直接可以从旧数组里找到数据。如果某个槽已经迁移完毕,但是整个扩容还没结束,则扩容线程会创建一个转发节点存入旧数组,届时查找线程根据转发节点的提示,从新数组中找到目标数据。 插入也就是put操作,如果我们追溯put的源码,会发现在真正操作时有if判断,if判断有四个分支 第一个分支,是整个数组的初始化 第二个分支,是所在的槽为空,说明该元素是该槽的第一个元素,直接新建一个头结点,然后返回 第三个分支,说明该槽正在进行扩容,帮助其扩容 第四个分支,就是把元素放在槽内。槽可能是链表,可能是红黑树。第4个分支是包裹在synchronized(f)里面的,f对应的数组下标位置的头结点,意味着每个数组元素有一把锁,并发度等于数组的长度。 20.HashSet是如何保证元素不重复的 HashSet添加元素的执行流程:当把对象加入到HashSet时,HashSet会先计算hashcode值来判断对象加入的位置,同时也会和其他加入的对象的hashcode值进行比较,如果没有相符的,直接插入到相应的位置。如果发现有相同的hashcode,这时会调用对象的equals()方法检查对象是否真的相同,相同则不让加入
点赞 7
评论 4
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
01-27 16:42
点点互动_产品管理工程师(准入职员工)
点点互动内推,点点互动内推码
点点互动面经一面(1)传统自我介绍(2)我看你大学里做了项目是吧,我们来聊聊吧(撕数据库、计算机网络)数据库(3)欸,你用的是 MySQL 吧,我想知道如果我要生成用户的唯一id,有什么方法啊?(4)那我如果有一个主键值是 10,然后删除了这一行,插入下一行数据的时候,主键值是多少呀?(5)你知道 MySQL 的索引的索引数据结构吗?(6)那你知道聚簇索引和非聚簇索引吗?计算机网络(7)你项目中前后端用什么协议通信的?「 HTTP 」为什么 说 HTTP 是无状态的呢?(8)那如何防止 Cookie 劫持?(9)那我如果使用 HTTPS 协议, Cookie 就不会被第三方拿到吗?(10)那你...
点赞
评论
收藏
分享
01-27 16:01
叠纸游戏_UI美术设计(准入职员工)
叠纸游戏内推,叠纸游戏内推码
前端面试问题:1. 自我介绍2. 低代码平台Blocksuit方案,这个技术选型的逻辑3. 物料和数据源连接是用什么样的解决方案,还追了一下数据源的获取4. 团队规模,负责的具体内容,职责之类的5. 你认为前端工程化包括哪些方面?你具体做过哪些6. Git提交,你们有引入什么工具,检测方式来控制不规范提交7. 前端监控埋点方面有做过哪些吗8. 后面的职业规划9. 离职原因10. 排期和人手不够的情况,假设你作为leader,你怎么处理冲突?反问:1. 项目情况,技术栈2. 面试流程叠纸游戏2026校招启动叠纸游戏成立于2013年8月,是一家专注于内容创作的游戏公司。叠纸当前拥有暖暖系列和恋与系...
点赞
评论
收藏
分享
2025-12-12 16:24
周口师范学院 嵌入式软件开发
双非二本,嵌软开发2offer,还应该坚持吗
投了几百家心累了😓😓,就约到了两家面试,虽然全过了,但是薪资有点低,目前一个8k的南京一家芯片原厂,一个西安的9590做仪表油气行业的
初次见面我叫泰隆:
西安的感觉不错了吧,学院本很难的
点赞
评论
收藏
分享
01-26 15:16
富特科技_项目软件工程师(准入职员工)
步步高内推,步步高内推码
步步高实验学校 2026届校招启动啦【学校简介】东莞市步步高实验学校于 2023 年投入运营,占地 230 亩,是一所集幼儿园、小学、初中、高中于一体的十五年一贯制非营利性高端民办学校,学校全面实行小班化教学,学校师生比为 1:5;步步高教育专家团队由来自一流大学的国家课标专家、教育学家,来自著名学校的卓越校长,来自一线、有着丰富教学经验的著名特级教师,以及来自国家级教育媒体的教育策划专家共同组成,为步步高的课程、教学、管理奠定了坚实基础。【招聘岗位】• 幼儿园、小学部及初中部各学科类教师 & 国际教师,类别多多,等你pick!【福利待遇】• 薪资:幼儿园老师年收入16万起 、中小学教...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
J人永远闲不下来于是去提前实习
2611
2
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
2434
3
...
大厂提前实习对AI开发的新感悟
2387
4
...
拥抱AI,程序员的最后出路
2377
5
...
mentor视角下的优秀实习生
2334
6
...
真正会被取代的,是你心里面的幻觉
2004
7
...
努力挣钱的意义具象化了
1788
8
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1675
9
...
去独角兽做龙头还是去大厂做凤尾
1653
10
...
我身材再曼妙,也没有我的工资好笑!
1457
创作者周榜
更多
正在热议
更多
#
牛客吐槽大会
#
3619次浏览
73人参与
#
机械人你知道哪些单休企业
#
83205次浏览
415人参与
#
今年春招是金一银二嘛?
#
9524次浏览
123人参与
#
参加完秋招的机械人,还参加春招吗?
#
103896次浏览
686人参与
#
1月小结:你过的开心吗?
#
2174次浏览
53人参与
#
抛开难度不谈,你最想去哪家公司?
#
5299次浏览
125人参与
#
为什么有人零实习也能进大厂?
#
5846次浏览
134人参与
#
AI求职实录
#
4388次浏览
118人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
9097次浏览
209人参与
#
机械人春招想让哪家公司来捞你?
#
379418次浏览
3141人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
4213次浏览
143人参与
#
你的第一家实习公司是什么档次?
#
4736次浏览
76人参与
#
没关系,至少我的__很曼妙
#
4005次浏览
66人参与
#
赚钱的意义在这一刻具象化
#
4367次浏览
99人参与
#
你的landing期是如何度过的?
#
9252次浏览
177人参与
#
除了Java,最推荐学什么技术?
#
6518次浏览
157人参与
#
我发现了面试通关密码
#
1600418次浏览
19679人参与
#
一人一道大厂面试题
#
114213次浏览
1263人参与
#
你觉得什么岗位会被AI替代
#
37008次浏览
256人参与
#
你在职场上见过哪些“水货”同事
#
30875次浏览
168人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务