美团SaaS事业部实习一面凉经

问题:
1、LinkedList和ArrayList存储了一定数据,循环了上亿次,谁执行的速度快,为什么
2、如果两种数据类型存储了1到100的数据,每次遍历到50个数字之后就将之前遍历的拼接最后面,谁快,为什么(好像是,具体问的什么有点遗忘了)
3、创建一块新的内存一定比指针重新指向慢吗,为什么
4、synchronized和reentrantlock区别
5、synchronized原理,它是如何锁住临界资源的
6、reentrantlock原理,阻塞队列是如何锁住线程的
7、线程池参数,作用
8、核心线程数5个,阻塞队列长度7,最大线程数10,20个任务,一个任务执行1分钟。是否会触发拒绝策略?会执行多久?
9、如果我想在一分钟完成所用任务,该如何设计线程池
10、mysql事务的四大特性
11、事物的隔离性是如何实现的
12、MVCC
13、如果在读已提交的事物隔离级别下,是否会用到MVCC,为什么
14、mysql中有一个表有(A,B,C,D)字段,select A,B from 表 where C=? and D=?,如何让这段SQL执行速度达到最快?
15、如果是查C,D。查询条件是A,B呢,索引该如何设计。如果不知道这四个字段查询的数据和查询的条件该如何设计
16、redis的过期删除策略
17、定期删除时,redis是如何扫描内存的
18、利用hash表存储数据,既想通过key查询value,又想获取最大值或者最小值或者中间某个年龄(场景是key:name,vlue:年龄),使它的存储有顺序,该如何设计
19、优先级队列的数据结构,优先级队列一定是通过数组实现的吗
20、讲一讲git的命令
21、一个分支上面提交了1,2,3,如何得到1,3而跳过2
22、避免重复下单的几种解决方案
23、如果用户没有一个唯一标识或者说用户不需要登陆就能下单,该如何避免重复下单
24、前端一次性传入很大的excel该如何处理
25、在大文件进入到内存之前如何避免一次性传入过大的文件
26、算法:对称二叉树
(大概是这些,有些可能忘了)
全部评论
首先在来接syn锁之前,需要了解我们java中对象头的结构,对象头中包含objectheader,class work以及我们的markword,markword主要从初hashcode 分代年龄等信息,首先对于原始的syn锁,我们也叫他重量级锁,在对对象加锁的过程中,会调用native方法跟操作系统申请一个监视器对象,然后将二者关联起来,在关联的过程中,会讲对象头中的markword交给monitor管理,然后markword存储对应monitor的地址,方便我们后续加锁的时候寻址,syn锁是基于monitor实现的,他里面包含owner来存储thread对象,为null则表示当前没有线程获取锁,不为null则表示已经有人获取锁了,会进入到entryset中排队等待,当然如果获取锁的线程由于一些i蛀牙UN没有准备好,进入wait,会释放锁然后进入到waitset中等待,当其他持有锁的线程进行notify后会将waitset中线程放入到entryset中等待,这个set是无序集合,所以不确定哪个线程被调度后持所锁,所以syn是非公平锁,由于加锁每次都需要跟操作系统申请monitor,这个操作sh比较重的,所以jvm底层做了很多优化,比如:重量级锁的自旋,没获取到锁在重试几次,减少线程从运行变更为阻塞状态的上下文切换,还有就是轻量级锁,使用场景是不存咋锁竞争的情况,他会在当前thread staack中创建一个lock record记录,然后将lock record 和 对象头中的markword进行 cas交换,如果当前线程发生了锁重入,发现markword里面存的lockrecrd是当前线程会将所重入的lock 记录 方null,用来记录所重入的次数,释放锁则移除一个lock rerecord,后续如果发生锁竞争,还是会走cas操作尝试交换信息,结果发现已经被交换完了,说明发生了锁竞争就会走锁锁膨胀逻辑,变成重量级锁,然后本身持有轻量级锁的线程会走重量级锁的释放锁的流程.......当然如果不存在锁竞争的情况下,频繁发生自旋,每次都要cas操作,效率也比较低,底层做了优化,干脆直接把线程id刻到markword里面,这也就是偏向锁.......
8 回复 分享
发布于 2024-03-04 17:44 上海
mysql事务的四大特性 11、事物的隔离性是如何实现的 12、MVCC 13、如果在读已提交的事物隔离级别下,是否会用到MVCC,为什么 事务的四大特性ACID 原子性一致性隔离性持久性 首先原子性主要指一个事务内所有操作要么全都执行全都全都回滚,底层是通过undolog版本链来实现的,持久性主要是指在事务提交回滚的时候对数据修改是永久的,主要是通过redolog来实现的,主要是用在脏页刷盘到磁盘的时候,如果出现故障,可以使用redolog来进行数据恢复,一致性是通过redolog和undolog来共同保证的,隔离性主要是指事务的隔离性,对于并发事务来说有三种情况 读读 这种并发事务不会出现问题 读写 一个事务写 另外一个事务在写之前读和写之后读就会出现问题,比如:脏读幻读不可重复读以及事务同时写隔离性的问题,还有就是写写可能会出现数据丢失,nysql的隔离性是通过mvcc+锁来共同实现的,mvcc也叫作多版本并发事务,主要是用来实现并发事务的非阻塞读的功能的,通过这种方式可以大大提高我们并发事务读写的性能,里面有两个核心一个是快照读当前读以及我们的隐藏字段事务id回滚指针 undolog版本链,所谓当前读就是使用加锁的机制,来读取到最新的数据,因为他加锁了索引性能不是很高,比如select for update update等,第二种是快照读,会根据undolog版本链相关规则进行匹配生成一个数据的快照,从而实现并发读,在不同隔离级别下实现方式不同,比如rc隔离级别,每次select都会生成一个新的快照,如果中间有事务更改数据并叫了,第二次select就会导致不可重复读的问题,在rr隔离级别下,只有第一次读的时候会生成快照,以后就复用,就实现了可重复读的功能,对应快照具体的匹配规则就是 如果当前查询的事务id=数据影藏字段中的trxid说明是当前事务修改了数据,可以读到,如果不是则会沿着版本链继续向下进行判断,比如:事务id是否小于最小活跃事务id,说明已经提交了,事务id是否》最大活跃事务id说明快照是在事务开启前创建的,如果事务id在最小活跃事务id和最大活跃事务id之间,并且对应事务id不在存活事务id中,可以访问这个事务已经提交了可以访问,通过这个匹配规则就解决了 脏读的问题
3 回复 分享
发布于 2024-03-05 21:52 上海
3这种问题怎么回答啊,还有21这种问题也不会,有git进阶的资料推荐吗
3 回复 分享
发布于 2024-03-03 21:23 湖北
前端一次性传入很大的excel该如何处理 这个看具体的场景,如果就管上传存储,那就无所谓了,直接走oss直传,然后用分片上传机制 如果是上传的excel是导入数据场景就麻烦了,一方面,直接在业务侧,禁止用户上传excel,直接让用户自己改成csv文件,直接降低excel文件大小的一个量级,然后线程每个文件的大小上限,提供工具给用户对文件切片,保证一次上传一次数据的时间不会很长,服务端要提供一个接受文件的程序,直接通过0拷贝到本地指定位置,然后把导入记录成任务发送到mq,慢慢处理(懒得打了,企业方案(导入导出中心,直接把文件搞到本地存储,然后根据机器资源分配任务,超额任务到MQ排队)
2 回复 分享
发布于 2024-03-04 18:08 上海
如果用户没有一个唯一标识或者说用户不需要登陆就能下单,该如何避免重复下单 按钮灰度+用token机制可以,有用户恶意下单不付钱怎么办???限流 (一个人可能在一s内创建多个订单吗?) 提前提醒他,下单不付钱,会被禁止一段时间下单(风控)
2 回复 分享
发布于 2024-03-04 18:00 上海
m
2 回复 分享
发布于 2024-03-03 15:19 贵州
啥叫循环了上亿次啊?查询了上亿次?
2 回复 分享
发布于 2024-03-03 11:14 广东
第8个是几分钟????
1 回复 分享
发布于 2024-03-04 23:14 河北
redis的过期删除策略 17、定期删除时,redis是如何扫描内存的 首先当我们给redis中存储的数据设置了过期时间,并且当数据过期了,此时他并不会立刻去讲数据删除 他的删除策略有两种,一种是惰性删除,当下次我们访问这个key的时候,发现他key已经过期了就去删除他 第二种是扫描,扫描哪些key过期了就删除 第一种方案的优先就是不占用redis的cpu去扫描哪些过期了,缺点就是可能会存在大量的过期key,占用redis的内存,导致redis内存飙升甚至告警,当然这个问题我们是可以利用redis数据淘汰策略,比如allkeys-lru来进行一个兜底,保证不会出现内存不足报错的情况 第二种扫描最大的问题是怎么扫,如果我们存在的数据特别多,一次性扫描一堆的数据,会阻塞主线程,效率非常低 所以一般来说采用的是每隔一段时间,就随机咯一些key过来判断他有没有过期, 这样结合上面两种方式我们就能够男足大多数情况了
1 回复 分享
发布于 2024-03-04 17:50 上海
这是日常实习吗
1 回复 分享
发布于 2024-03-04 00:20 陕西
挺基础。
1 回复 分享
发布于 2024-03-03 21:27 广东
完了,好像好多不会
1 回复 分享
发布于 2024-03-03 20:25 北京
是暑期吗
1 回复 分享
发布于 2024-03-03 20:13 北京
感觉难度不是很大,答了多少?
1 回复 分享
发布于 2024-03-03 16:54 重庆
面了多久
1 回复 分享
发布于 2024-03-03 12:26 黑龙江
3没看懂,求指教
点赞 回复 分享
发布于 2024-03-13 10:30 湖北
需要的话友友可以看看我首页,内推码可内推米哈游很多岗位,可以咨询
点赞 回复 分享
发布于 2024-03-13 08:48 上海
M
点赞 回复 分享
发布于 2024-03-10 20:21 吉林
后面几个场景有点难啊
点赞 回复 分享
发布于 2024-03-09 11:16 广西
避免重复下单的几种解决方案 23、如果用户没有一个唯一标识或者说用户不需要登陆就能下单,该如何避免重复下单 避免重复下单,本质上是防重提交 或者 说是幂等的问题,一般来说按照漏洞模型,我们优先会将问题去前置进行一个处理,在前端,前端侧,在前端侧,某个提交订单的按钮只能够提交一次,然后禁止点击,在网络正常情况下,已经能够减少大量重复请求提交到后端,即使有重复请求,也大概率是并发提交的问题。解决幂等的方案有非常多种,比如最基础的方案:各种锁机制,乐观锁、悲观锁、分布式锁等,数据库唯一ID,防重表,状态字段等,字这些方案根据不同场景还能够延伸出非常多的小肠经,比如:按照下单的业务流程,我们可以使用幂等token来实现,从方案上来讲,其实单独使用各种锁机制根本没有办法解决幂等的问题,只能够解决防虫提交的问题,之前也出过一些线上事故,某次XXXXXX(懒得打了)手写通用幂等框架。。。。 用户恶意下单不付钱。。。。。。风控。。。。。。懒得打了
点赞 回复 分享
发布于 2024-03-04 17:57 上海

相关推荐

已oc 云智断更了好几天,也有一些话想说,继续更新一篇云智timeline 4.18 一面 半个小时后约二面 4.21二面 当晚 约hr面 4.23hr面 4.30 发offer之前美团的二面挂了,进入人才库,后面又被捞起来面试,4.30号 美团又一面,现在还没出一面结果感觉也不报什么希望,就算一面过了,还有二面,我经不起深入拷打,唉,真的,好难五一躺平了五天,吃吃玩玩睡睡~还要担心毕业,科研更是难,唉暑期可能就到此为止了,后面没有时间在这个上面了,要抓紧时间做科研,为了后面能出去实习。大厂,秋招再见!!!有一些感慨:4.1是我的第一次面试,美团,面试的时候紧张到浑身发抖,4.30还是美团,有...
daisy9542:我今晚也是美团一面,已经第六次了。我也面了其他的,没拿到 offer。但我想开了,要按照自己的节奏来,找暑期转正然后秋招大杀四方并不是唯一的出路,其实还有很多选择的,有 0 实习最后秋招拿 offer 了,也有不选择互联网去国企的外企的,考编的,创业的。现在的失败不代表以后的路都是黑暗的,只不过可能运气还没降临到头上。所以现在要做的,就是放平心态,提升自己,通过面试了解到自己的优点和不足,争取下次机会来了能好好抓住
点赞 评论 收藏
分享
好伤心,面试官结束时候评价是整体还行,等视频挂了5分钟内收到感谢信这前后反差,我只好安慰面试官尊重自己,但是谁来安慰我呀面试上来开始问八股1,说说 url到浏览器页面显示整个过程2,http 缓存3,流式输出,你知道哪些可以实现的方式?AI生成到前端你觉得采用那种方式?3,css 设置的元素要不断旋转,怎么写(不到一分钟面试官问我是否会,不会可以换一题,那我还行想到用什么,那换一题吧)keyfram 里面设transform;animation 里面应用设定的spin;代码如下:(linear 匀速转,infinite 无限循环)@keyframes spin {    from {        transform: rotate(0deg);    }    to {        transform: rotate(360deg);    }}.spinner {    animation: spin 2s linear infinite; /*持续2秒 转一圈*/}4,输出解释题:function app() {    const [count, setCount] = useState(0)    useEffect(() => {        const interval = setInterval(() => {            console.log('useEffect')            setCount(count + 1)        }, 1000)    }, [])     return (        <div>            <h1>{count}</h1>        </div>     )}会输出打印什么?h1位置 count 显示什么那当然每隔1s 打印出0,页面显示也是05,好的,你分析他原来想要实现什么效果,然后现在这段代码怎么改能实现预期效果,你有几种方式?【用useRef 、手写update函数,设定count 动态依赖项,使用setTimeout 递归(但是容易爆栈)】我当时有点懵,当然是没考虑到function app() {    const [count, setCount] = useState(0)    const countRef = useRef(count);    useEffect(() => {        setInterval(() => {            console.log('count', count);            // setCount(count + 1)            setCount(countRef.current + 1)        }, 1000)    },[])    useEffect(() => {       const update = () => {        console.log('update')        setCount(count + 1)         setTimeout(update, 1000) // 递归调用, 会导致栈溢出       }        update(); // 初始调用    })    useEffect(() => {        const interval = setInterval(() => {            console.log('useEffect')            setCount(count + 1)        }, 1000)    }, [count]) // 动态依赖,但是频繁定时器创建和销毁    return (        <div>            <h1>{count}</h1>        </div>     )}7,输出顺序是什么?function app() {        promise.resolve().then(() => {        console.log('promise')    })    useEffect(() => {        console.log('useEffect')    }, [count])    useLayoutEffect(() => {        console.log('useLayoutEffect')    }, [count])    return (        <div>            <h1>{count}</h1>        </div>     )}输出:useLayoutEffect promiseuseEffectuseLayoutEffect(dom更新后,相当浏览器刷新渲染了,立即同步执行)、promise (微任务,在同步执行完清空微任务队列)useEffect(异步执行,事件循环后执行)期间问了useLayoutEffect 和 useEffect 区别8,看下面输出什么?(弱弱心想:不能出点其他的吗?)function Foo() {    getName = function () {        alert(1);    }    return this;}Foo.getName = function () {    alert(2);}Foo.prototype.getName = function () {    alert(3);}var getName = function () {    alert(4);}function getName() { alert(5); }Foo.getName(); // 2getName(); // 4Foo().getName(); // 1getName(); // 1new Foo.getName(); // 2new Foo().getName(); // 3new new Foo().getName(); // 3看这是金典js输出,但是解释起来费劲呀,解释不断问我:变量提升到哪,函数提升到哪,可以修改一下代码看看提升到的位置,new 关键字分析一下,作为普通函数调用还是.... (问下牛友,这种题目去那找能复习到呀)9,写个sum函数实现下面输出:console.log(sum(1,2,3).sumOf()); // 6console.log(sum(1,4)(2).sumOf()); // 7console.log(sum(1)(2)(3)(4).sumOf()); // 10function sum(...args) {    let total = args.reduce((acc,cur) => acc + cur,0);    function innerSum(...newArgs) {        total += newArgs.reduce((acc,cur) => acc + cur,0);        return innerSum;    }    innerSum.sumOf = () => total;    return innerSum;}console.log(sum(1,2,3).sumOf()); // 6console.log(sum(1,4)(2).sumOf()); // 7console.log(sum(1)(2)(3)(4).sumOf()); // 10
点赞 评论 收藏
分享
评论
68
476
分享

创作者周榜

更多
牛客网
牛客企业服务