自我介绍这里一笔带过,给对面介绍自己内在 + 外在 + 校园经历 + 校园项目 + 意向岗位
Object
你知道哪些方法?我就回答了自己常用的 wait
、notify
、notifyAll
这三个方法,其他自己不怎么使用,就跟技术官说抱歉,其他不怎么使用,就回答不上来,面试官也不停留在这个问题上,直接带到下一个话题。
所以这里总结下,Object
其实还有一个 clone()
方法,这个回答不上了其实真不应该,当前想不起来,还有一个获取类信息getClass()
,可以做映射的东西。
嗯,有两种,一种是 数组,一种是链表,即ArrayList
和LinkedList
一般的话,如果读操作大于增删改的话,使用数组效率要比链表的好,而如果要频繁修改操作,那么使用链表更好一点
所谓层层递进,就在这里了
呃,因为数组如果你要增加一个元素的话,比如举例,你有十个元素,那么你要在0号下标增加一个元素,那么你得把后面10个元素整体向后挪到一位,这里我还用手势比划了一下,面试官点头,然后示意我继续,我就说链表的话,只需要修改一下指针就可以了,不用对整体移动,其实这里应该回调内存的连续跟分散会更好一点,因为数组是开辟的连续内存空间,而链表不需要,它是零散的,所以链表读要使用指针,自然而然数组读效率更高。
Spring
可以方便地给我们管理创建、获取和kill
对象,不需要我们去额外做这一份工作。
IOC
吗?IOC
是控制反转的意思,在Spring
容器中,创建对象的工作不再由我们来负责,而是交由 Spring
容器去管理各个对象的生命周期。
由于 Spring
容器默认使用的是 Single
单例创建对象,这样各个线程对同一个对象是共享的,就可以做到多个用户请求访问是拿的是同一个实例,不用总去创建对象,导致频繁的 GC
垃圾回收。
在 Spring
容器中,有一个属性 scope
,就是一个作用域,它可以指明创建对象是采用单例还是其他方式
单例的话多个线程下是共享实例的,当时只想到 Request
,但这个不是线程级别的,没回答上来,没想到 Prototype
(原型),技术官帮我解围了,说知道我知道想说什么,就是说不出来哈哈。
Prototype
它是一个原型,在多个线程中的创建的单例是互不干扰的,也就是生命周期的处于线程。
当然还有其他,因为不怎么使用,所以就没有怎么说。
嗯?这个我了解过两个,INNODB
和Myisam
我就说了第一个默认会使用 行锁,Myisam
使用的是表锁
这个我真不知道该怎么回答,我就瞎扯了锁升级,就说 INNODB
因为默认使用行锁,但是如果因为没有索引优化或者语句优化等问题,可能会出现锁升级现象,这是 Myisam
没有的。
面试官一头雾水,但没有反驳,好,继续下个问题。
我说有有,这就来劲了,就说INODB
有事务,但Myisam
没有事务这说法,现在才明白面试官说这两个引擎的区别原来在这里。
面试官没有为难,知道问的差不多了,就开始手撕 SQL
给你一个表,这个表有三个字段,一个是学生 id
,一个是课程名 cname
,一个是课程成绩 cscore
要求:如果有三门课程,要求找出学生的总成绩大于270,并且返回学生id
和总成绩
纳尼,第一个想法就是想着连表查询,当时觉得没戏了,就很挣扎
口述:就是通过三张表自然关联,关联三门成绩,然后关联条件是学生id,where
是三门成绩之和大于270
面试官觉得有问题,这种做法不通用,要我再想想其他方法
想了两分钟,没有思绪,给我个提示:可以使用 group by
分组?那就简单了,我就直接口述了,说可以先分组,然后在每个分组里面使用聚合函数sum
,将总成绩这个条件满足270
的查询出来
当时很紧张,怕错了,面试官一脸微笑的说,是的,思路是对的,你可以用在纸上用笔写下来吗?
他知道我口述可以,但还是不相信我动手能力,瞧不起了,可能之前用那个关联的SQL 手写SQL,出现了一点问题,但在他提出问题的时候,我立马说我可以修改下sql
吗,改了再给他看了下,可能就是因为这个原因,自己不仔细写,给自己埋坑,让面试官对我有了质疑
于是这次我就好好捋了捋思绪,面试官看我迟迟未动笔,说不用紧张,慢慢想,当然我肯定不这么想,当时已经有想法了,只是怕又写错了SQL
,因为当时已经有一个月没刷 力扣 SQL
题型了,想了两分钟左右,写了出来
select sc.sid, sum(sc.score) as sum_score
from SC sc
group by sc.sid
having on sum(sc.score) > 270
就这样,面试官比较满意,就问我为什么当时没想出来,我就说当时他说给三科成绩,很容易就让人想到用联表
到这里 SQL
也没继续写了