Friday Night

Friday Night – LUCKY TAPES

大概是学生时代的最后一个暑假

//

现在是2021年7月16日

我的二十四岁已经过去了一半多

今年有在往前走吗

//

其实不一定每年都要往前走的

原地踏步好像也不是什么坏事

//

上半年解决了一个比较重要的事:找实习

而且去了意想不到的公司

我二月份确实是一心想去字节的 结果被拒了

最后峰回路转去了阿里

命运真是很奇妙

//

坦白说能进阿里已经很意外了

所以对薪资也没有什么太大的期待

结果今年阿里的实习日薪翻了一番

真香

//

7月很多公司也已经开始了提前批

最近忙的团团转完全没有心思去复习

箭在弦上不是很想发

//

总共就犯过三次肠胃炎

前两次在家都是抱着爸妈的腿哭

这次不在家好像也没有什么想哭的

就是拉的有点虚脱

买了药吞了坐等痊愈 💊

果然只有在家人面前才会脆弱起来

//

最近买了两个可爱的小玩意

Polaroid Go & Pentax 120SW

宝丽来 Go 是之前某个工作日下班直接跑到嘉里中心入的

宾得 120SW 是在闲鱼上收的成色较新的二手机

一下拥有两种快乐嘿嘿

  • 拍完等十分钟就拥有一张照片的快乐
  • 积攒了一卷胶片全部一起洗出来的快乐

虽然我都是在没有任何技巧的瞎拍

但是我真的好喜欢拍照哦 📷

//

还有想比比的

但是我要收拾收拾去洗澡了

回见

春招实习面筋

春招实习总共投了四家公司:阿里、美团、腾讯、字节。

字节面最早,挂在第三面。美团、腾讯、阿里顺利走完了所有流程。

阿里

蚂蚁财富,数字金融线体验技术部。

时间线

日期流程
2021/03/17 周三投简历
2021/03/23 周二晚上技术一面
2021/03/24 周三下午通知一面通过,约二面时间
2021/03/26 周五下午技术二面
2021/03/29 周一晚上HR 约面试时间
2021/03/30 周二上午HR 面试
2021/04/11 周日晚上收到意向书
2021/04/16 周五下午和 HR 约入职时间
2021/04/27 周二下午入职小管家通知体检时间

碎碎念

已投,3月23号一面。

一面问了1h20min,就离谱,太久啦,面完嘴皮子都说干了。希望有个二面,保佑🙏。

3月24号傍晚通知过了一面,约了二面时间。

3月26号下午五点二面,只面半小时,问了下面试官为什么二面这么短,回答是一面面得够久了二面就不用问太多了。晚上学长帮忙问了一下,二面通过了,等下周 hr 约面,许愿 hr 面顺利呀 🎋

另外阿里 hr 面试之前记得完成素质测评,素质测评包括10个阅读理解题,10个图表分析题,10个图形推理题,以及98个性格测试题。

吐槽一下性格测试题有些题压根没法选还非要选OTZ。

3月29号晚上十点 hr 打电话过来约面试时间,惊了为什么 hr 这么晚也还在上班。

3月30号上午 hr 面试,大概面了20min,聊了聊实习经历,学习状态,未来发展意向这些常规问题,晚上问了一下内推老哥,hr 那边过了,但是阿里蚂蚁这边流程比较长,需要等一到两周发意向书,希望一切顺利,四月可以平安上岸。 🙏

4月11号晚上11点39分收到意向书,本来打算睡觉了,睡前看一眼手机给我吓醒了,终于上岸啦。

4月16号下午和 HR 约了入职时间,谈了薪资,今年阿里给实习生好多喔,等小管家约体检,我要开始清淡饮食好好睡觉了> <。

面试题

一面

项目

能稍微详细地讲一下你之前做过的安卓的项目,你从中主要做了哪些东西,然后具体 app 的整体架构你都可以讲一下。

刚讲到你接手这个项目,发现这个代码比较乱嘛,具体是指哪些地方比较乱呢,对此有没有做一些改造或者重构呢。

正常一个 APP 它的架构应该是由哪些部分组成呢?或者说是用什么样的模式去设计它?

你刚提到你做了一些功能嘛,你在实现这些功能的时候,有没有遇到一些比较有挑战性的技术难点呢?

那除了自定义 View 的这个问题,你还有没有遇到一些其他的问题?

你新增了本地化的信息存储和管理是吧,你计划是采用什么样的方法做的,然后你的考量是什么呢?

安卓

你刚刚提到了你有事件的处理对吧,那安卓的view之间是会有重叠的,它这个 View之间的手势的事件处理和传递是怎么样的一个逻辑呢?

view 之间的传递是通过哪些方法呢,是怎么进行消费的,比如说有 view 盖在 viewgroup 上了,这个事件他是怎么去消费和处理的。

事件通过这些方法传递给 view 和 viewgroup,那它要怎么去做这个决策呢?要怎么消费呢?不消费和消费是怎么调用的?

比如说 dispatchtouchevent,是 return true 呢还是 return false 呢然后怎么去执行,如果消费的话和不消费的话会怎么样,会怎么做传递,完整的一个消息的量对吧。

你刚刚说你实现了 onDraw,onDraw 你是用什么绘制的呢,那你实现这个方法的时候有没有遇到一些性能问题,对性能这块有没有一些考虑呢。

那你存储这块儿一定是要用数据库去存储吗?那其他方案可不可以实现呢?

安卓上的 classloader 这种机制你了解吗?在安卓上他是一个什么样的机制,有哪些 classloader,都是干嘛用的?

像大型的 APP 比如淘宝支付宝,和安卓原生工程构件的比较小的 APP 有什么区别,这一块儿你有了解过吗,主要的区别。

架构上有区别吗,还是说会一样呢?

安卓上的插件化原理有了解过吗?

Java

你这边是怎么理解面向对象的?像安卓一般都是 Java 对不对,那 Java 是一个面向对象的语言,你个人是怎么理解的,面向对象有哪些特性,在日常开发中,你可以举一个小的案例来说说怎么去应用,怎么利用这些去实现一些功能。

那么面向对象的编程过程中有哪些原则呢?

你讲一讲开闭原则吧

Java 中有哪些集合类,有哪些核心的接口,他们之间是怎么样的一个关系?

那你展开讲一讲 HashMap?

你刚刚有提到哈希,那哈希的原理是什么呀?哈希能用来干嘛呢?

Java 里的对象,在内存中是个什么样的形态,内存中是以什么样的数据结构去存储的呢?

内存中的数据结构有哪些呢?比如说堆栈

堆和栈的差别在哪里呢,为什么会把实例和对象放在堆里,而把一些方法、局部变量放到栈里呢?

计算机网络

项目中也有针对通信协议这块,也做过一些功能是吧,能大概说一下正常的一次网络请求,从 client 到 server,有哪些步骤,你可以按照你自己的理解,和你可以说到的程度,去描述一下。

那么 TCP 的建立连接需要一些什么步骤?

一个通信协议,它的主要构成有哪些呢?

你刚刚提到了 get 和 post 的区别是 get 没有请求体,那么除了这个区别之外,还有其他的区别吗?

https 和 http

有哪些差别呢

操作系统

进程和线程之间的关系

开放性问题

北京首都机场,白天一小时内飞在机场上空的飞机大概有多少,你可以按照你的思维去想一下这个推导过程。

算法

你这块儿日常工作中有用过哪些吗?简单点像是排序这种都用过吗?讲一讲

那快排的时间复杂度和空间复杂度是什么样的

那它最坏的空间复杂度是多少呢,最差的情况下

实习

之前实习的话对上班时间这块儿有过压力吗

其他

平时有没有什么爱好呢

你投的是安卓嘛,你对后面的技术上、工作上、或者是业务上有没有一些想法和规划呢?

你简历上提到过你参加过18年的美国大学生数学建模大赛?

反问

你们是什么部门?

一般做一些什么业务呢?

实习生进来会参与到实际业务的开发吗?

你们部门是996吗?加班多吗?

总共有几轮面试呢

实习生一周的到岗时间卡的很死吗?

二面

实习

实习主要做了一些什么事情,端上做了一些什么事情,有没有做过一些业务功能

你能讲一个你做过这个功能吗,实习里边

项目

你觉得你在这个项目里面学到了什么呢

安卓方面你有什么样的一些小项目

实现离线和在线登录同时自动后台将数据同步,怎么实现的

那我觉得跟一个问题啊,你在同步过程中,比如说断网了怎么办,

你这个传输文件有多大呀,一般。你这个是一张一张传的话,还是说是打包之后再传。对啊,那你这个理论是怎么设计啊,里边是有线程池呢?还是这个列呢,还是怎么样做的呀比如说,你这个一家大小啊

那你就是怎么实现的,具体代码是怎么去写的

比如说你在这个上传的过程中,这个时候可能涉及到耗CPU嘛,怎么能保证你的前端的这个页面不卡顿

我看到你用自定义 View 实现了一个功能是吧,如何自定义 View 呢

我看你还有参加了一个物联网竞赛,主要做了什么呢

你有用到一个图表库对吗,那你在用它的时候,有没有去研究过一些安卓在绘图上面的原理呢

安卓

那你在做这个安卓的过程中有没有遇到过一些性能上的问题

那有没有遇到过OOM

如果安卓的话呢,如果你在主线程做完了以后,你要同步给这个线程,如何同步的

那你看过这个的源代码吗,你从中学到什么

算法

好,我问你一道算法啊,比如说一个二叉树给定了前序遍历和中序遍历,如何重建这颗二叉树?

反问

你们招聘一个实习生更看重的是他的一些什么方面的能力呢

HR 面

你先简单做个自我介绍吧

我看你之前的那个实习经历是在百度,上海还是北京呢

好的,那要么你先谈谈你在百度的这个经历吧,然后你在百度半年左右的时间,对他们整体公司的感觉,以及在公司里边实习的这个感受是怎么样的

OK,那你觉得这段实习经历,给你带来最大的帮助是什么

那你刚刚有提到,在百度这边实习,其实整体来说工作节奏不紧张,你对未来自己工作的那个状态的设想,大概是怎么样的,你希望是有一个什么样的工作状态

你平时除了那个学习之外,主要的时间都用来干嘛呢

我想更多了解一下你现在整个学习的状态是怎么样的,你觉得现在这个阶段最主要的挑战是什么呢

行,那你现在家庭的情况是怎么样的,就是老家在哪里,您未来希望在哪定居,以及有没有对象呢

那你这边有没有什么问题想和我交流一下的

美团

点评事业部

时间线

日期流程
2021/03/11 周四投简历
2021/03/16 周二下午约一面时间
2021/03/22 周一下午技术一面
2021/03/26 周五下午通知一面通过,约二面时间
2021/03/30 周二下午技术二面
2021/04/06 周二下午通知二面通过,约三面时间
2021/04/08 周四上午技术三面
2021/04/08 周四下午offer call
2021/04/09 周五下午offer mail

碎碎念

已投,3月22号电话一面。

美团是找学长内推的,面完当天晚上学长那边就收到了一面通过的消息,但是 hr 还没打电话过来约二面,估计是春招人比较多比较忙,感觉整个面试流程还是会拉挺长的,要有耐心。

3月26号通知一面通过,约了3月30号二面。

3月30号下午二面,面试官很厉害,聊得非常开心,我觉得美团的面试体验真的超好!整个二面没有专门去问基础知识点,都是围绕着项目展开的,后面直接当场翻我 Github 和博客问了些问题。

4月8号上午三面,面试官感觉是老大,问俩题就喝一口保温杯里的茶哈哈哈哈,聊得很开心,算法题不难但是要我不停优化,想不出更优解直说就行啦,面试官不为难人。反问环节问了业务,给我讲得很详细,还介绍了美团公司的架构什么的,我还反问了美团是不是 996,他说是 10/9/5,年轻人都起不来床哈哈哈哈。另外美团相比于其他公司有一个优惠政策,实习时长是会算到工龄里的,这个我觉得蛮不错滴。

美团面试很慢,一周面一轮,但是给 offer 飞快,4月8号上午三面结束,下午就 offer call,隔天就收到正式邮件啦。

面试题

一面

项目相关

想问一下哪个项目你比较熟悉一些,介绍项目背景、功能点、你解决的一些问题,你描述一下。

你在这个上面哪里花时间比较多,就是你觉得在【怎么用】上面,还是说,在【解决这个问题】上面,花的时间会比较多啊?

登录做了自动登录吗?

登录用户名密码是在后台校验的对吗?那你输入的用户名和密码,就是你有做加密处理吗?

环信视频语音的 sdk,这个视频语音具体实现的原理你知道不,说一说。

Android

你在自定义 View 的时候,那几个方法里,你觉得像 onMeasure 里这个测量方法,适合做什么,不适合做什么,你有了解吗

那你了解安卓里面,他那个事件的传递的方式吗

事件的传递和处理涉及到了哪些方法你知道吗

android 里面 fragment,fragment 的生命周期说一说

Java

你能跟我说一说 Java 里面内部静态类的作用是什么吗

你觉得为什么写一个单例模式的时候要用一个静态类呢?

你觉得像成员变量、成员方法、然后静态类,这些类在加载的时候,顺序是什么样的

数据库

你不是用到数据库吗,你这个数据库的话,如果有版本冲突的话,那你解决冲突的策略是什么

计网

那你发一个网络请求的时候,header 里大概有哪些信息,请求头部里有哪些信息

反问

面试的部门是不是点评事业部

实习生进来的话可以参与到项目的业务开发对吗

美团这边总共是几面

部门是负责一些什么业务呢

二面

笔试和上轮面试

你还记得你笔试的情况吗

你觉得你笔试的问题出在哪里

你对你的第一次面试,有没有什么比较印象深刻的问题

有没有什么你觉得回答得不好的问题

安卓

你理解的自定义 View 是什么样子的

除了你这种场景之外,还有什么样的场景会去使用到呢

我看到你简历上提到了使用 Glide 可以减少内存开销,避免出现 OOM,那我想问一下你实际上有碰到过 OOM 的问题吗

Glide 它除了会避免 OOM,还有什么比较有优势的地方

你有没有觉得它使用起来比较好用,比较方便

框架源码

其实我看到你简历上用到了不少第三方库,那么你是怎么知道要使用这些库的

那除了需求驱使的情况外,你平时会自己去了解一些第三方库吗

这些第三方库你在实际使用中会不会遇到一些问题,然后如果遇到问题是怎么解决的呢

你平时会去看一些源码吗,看的比较多的是什么源码呢

你觉得使用 okhttp 有一些什么好处呢

okhttp 最大的特点是什么,为什么要这么设计呢

你有没有自己实际去做过网络请求呢

你自己实现一个网络请求的时候,是怎么去实现的

那你自己实现一个网络请求,和使用 okhttp 去完成一个网络请求,区别在哪呢

我想了解一下,你是因为你实验室的项目需要安卓才做安卓开发,还是你自己想做呢

那你为什么会想做安卓

你刚才提到会看一些公众号,你觉得有哪些不错的公众号呢

那你有没有遇到过一些,比如网上找不到答案的问题

我看你 Github 上有很多仓库啊,都是干什么的

在学习过程中,有些特别难以理解的点你会自己写代码尝试一下吗

你是怎么搭建自己的博客的

我看你写了个 ConstraintLayout 的博客,你有尝试使用吗

反问

想了解一下就是部门里做一般是做什么业务的呢?

假设这一面能过的话呢,这边是总共是三轮技术面加一轮HR面吗?

办公地点是在哪呢

你们对实习生的要求是怎么样的呢,就是你们比较看重一个实习生的哪些东西呢

那你觉得我今天表现得还可以吗?这个可以说吗?

三面

Java

问面向对象问的很深,面向对象的优点,为什么要用面向对象,各种各样的问题,不太记得了

了解过其他的编程范式呢,比如说,除了刚刚讲到的面向对象,还有面向过程等等

Lambda 表达式用过吗,谈谈你对它的理解

我们刚才谈到一个匿名类的概念,你简单介绍一下匿名类

我们来聊一聊 JAVA 的一个特性吧,介绍一下 JAVA 类的反射机制

还有什么其他的用处吗?

你刚刚提到面向对象的封装,继承,多态这三大特性,会不会用到反射的这样的一种实现方式

那你有没有在你自己写代码的时候,需要你在运行时去生成一个类这样的需求

那我问一下就是你之前不是在做超声客户端吗,你肯定要去发那个网络请求吗,那你发出请求收到响应的时候,需要分析数据对吧,你需要结构化这个数据,转换成一个对象,那么这个对象是如何生成的,你了解吗?

算法

做一个算法题吧(题目我忘了OTZ)

反问

想了解一下就是部门的业务是负责哪一块的呢

这是已经是第三轮技术面试了是吧,如果说我这一轮通过的话是之后就直接 HR 面了吗

你们这边对实习生的一周的到岗时间会有一个要求吗?就是一定要到岗多少天嘛?

想请问这边美团这边是有双休的吗

腾讯

CSIG 腾讯云部门

时间线

日期流程
2021/03/11 周四投简历
2021/03整个三月都没被上海部门捞
2021/04/02 周五下午技术一面
2021/04/02 周五晚上电话通知一面通过
2021/04/04 周日上午短信约二面时间
2021/04/04 周日晚上技术二面
2021/04/06 周二邮件通知三面时间
2021/04/08 周四晚上技术三面
2021/04/09 周五上午HR 突袭面
2021/04/12 周一下午云证
2021/04/16 周五下午offer call
2021/04/19 周一下午offer mail

碎碎念

已投,3月23号视频一面。

工作城市选了上海以及不接受城市调剂,还是被北京 csig 的地图部门面了一下,hr 在干啥哦,面完挺开心然后问了下城市和面试官双双尴尬笑死哈哈哈。

北京的部门面了无效,于是面试官面完把我放回池子里了,还是挺有效率的。

晚上拿外卖的时候接到了 wxg 深圳的电话,问我要不要面试,因为城市的原因我拒了,吃完饭觉得还是应该面一下,问了一下 hr 能不能反悔,可惜面试官的电话是无法回拨的,所以接到电话的时候一定要想清楚是接受还是拒绝,无法反悔的哦。

腾讯上海的 hc 实在是太少了,蹲一个上海部门捞我面试把 OTZ。

3月27号发邮件捞我面试了,可是时间和字节冲突了于是选择了【时间不合适】让他重新约,就不能打个电话大家平等的约个时间吗兄弟,我真的不太喜欢单方面通知面试时间的招聘流程- -。

3月28号直接发邮件通知3月29号上午面试,3月29号面了五分钟,又是深圳 wxg,于是闲聊五分钟又回池子了,咋就没个上海部门呢- -。

兜兜转转,3月31号终于收到了上海 csig 的面试邀请哇哈哈哈哈不容易,约了4月2号下午一面。

4月2号下午一面结束,晚上我蹲在坑上接到了面试官的电话(……),问我有没有空现在进行第二轮面试,我转头看了看厕所的墙,拒绝了,于是他跟我约了清明假期面试,这是清明都不放假的吗!

4月4号清明节当前上午面试官发短信邀请我面试,于是大清明节晚上八点面了个试。

4月8号晚上6点半,等了面试官半小时,面试官有个会议耽误了,于是在电梯里听完了我的自我介绍哈哈。感觉是一个年纪比较大的面试官,问的问题感觉就是手边有个题库里随机找点题目出来问问我,囊括安卓、Java、数据库、计算机网络、操作系统,一样来了点题目,但是能基本答上他就不会往深的问啦。

面完感觉应该稳了,问到的基本上都答上来了,4月9号起床发现面试状态已经更新到了 HR 面,上午接到 HR 的突袭电话面试,大概聊了半小时,说下周出结果。

4月16号下午收到了 HR 的 offer call,4月19号下午收到了 offer mail,腾讯整个流程也走了将近一个月喔。

面试题

一面

实习

你先介绍一下你这边的情况吧

四月开始实习的话,可以实习到什么时候呢?

我看你刚刚的自我介绍,还是有过实习经历的?讲讲你在百度实习的经历吧

你刚刚提到的这个功能是有一定前置开发基础的还是完全由你开发的呢

安卓

你对安卓了解有多少?

安卓的横竖屏切换的流程你了解吗,涉及到一些什么操作呢

项目

介绍一下你在实验室做的这个项目吧

你刚提到就是有超声探头是吧?它是怎么采集到数据传递给软件的呢

讲一讲你是如何自定义 View 的

你是如何实现存储影像的呢

我看你还提到了使用 Room 数据库

既然提到了 GreenDao,他们都是给他一个对象可以存到数据库里去,他是怎么实现这个过程的?

我看你安卓项目也不少,你对安卓哪方面比较熟悉呢

操作系统

进程和线程之间有什么关系呢

进程和线程之间的通信你了解吗

那还有线程之间的通信呢

如何保证线程安全呢

Java

volatile 你详细讲讲你的理解

比如说经常用 synchronized 修饰一个方法,这个方法是静态的或者非静态的会有什么区别吗

Java 是面向对象的对吧,所有类的基类都是 Object 类,那么 Object 类都有哪些方法

hashcode 你有用过吗

它还有一些线程同步的方法,包括 notify、wait 之类的

== 和 equals 的区别

HashMap 底层是如何去实现的

get 方法是一个怎样的流程

put 这边 put 一个值的时间复杂度是怎么样的

类型擦除你了解吗

计算机网络

打开一个网页的过程

DNS 解析的过程

根域名服务器和顶级域名服务器他们主要负责干什么,有什么区别

讲一下 TCP 三次握手和四次挥手

TCP 和 UDP 的区别是什么

HTTP 的一个请求报文的格式是怎么样的你知道吗

HTTP 为什么是无状态的

登录一个论坛它是怎么做到记住我们的状态的呢?

算法

做个算法题吧,如何寻找一个数组里第 K 大的数

还有其他的方法吗

写一个快速排序吧

它的复杂度是怎样的

反问

想问一下部门的业务

有要求实习生的那个一周的到岗时间吗

结果大概是什么时候能出呢

二面

项目

你能从技术的角度来讲讲说,你项目里面最主要解决了什么样的问题,用了什么样的技术,以及你的收获

你在这个项目里面的话,是有几个人一起协作呢

在实现登录联网时,还有跟后台进行数据同步的这些功能的时候,信息安全方面是怎么考虑的呢

你刚刚提到了非对称加密对吧,那对应的话就会有对称加密,你知道两者的区别是什么吗

那对称加密和非对称加密相关的性能方面有了解过吗

项目中的这个数据,在本地是如何进行存储的呢

选择 Room 数据库的时候有考虑过其他数据库吗,有没有做过对比

你项目中使用了环信的 SDK 实现视频通话,怎么没有考虑使用腾讯的呢?

算法

问一个算法题吧,如何判断一个链表中是否有环?至少给出三种不同的解法

操作系统

操作系统你学过吗,当时课程考了多少分呢?

对于一个进程的话,它里面那个地址空间,有内核使用的和给用户使用的,这个概念你还记得吗?分别会使用多少的?

在32位的操作系统里面的话,它总共的地址空间是多大?

虚拟地址的概念还有印象吗?

计算机网络

TCP 的三次握手和四次挥手你清楚吗?

你对腾讯相关的企业业务有多少了解

你是哪里人呢

就你个人来说,你觉得你相比于其他的候选人,你主要的优势在什么地方

在春节以后,除了教科书以外,还有没有看过其他书籍呢?

你本身在求职意愿方面的话,对安卓这块是比较强烈的是吧?

你读研的原因是什么呢

三面

项目

你介绍介绍你做过的安卓项目吧

Java

你了解 Java 中的几种引用吗?

Java 是一个面向对象的语言,他有一个重要的特性是多态,那么重载和重写有什么区别呢

JVM 内存的区域,哪部分是线程公有的,哪部分是线程私有的呢?

进程之间的通信有几种方式呢

资源竞争的时候会有几种锁,你了解哪几种锁呢

安卓

你可以讲一讲事件的分发机制吗

安卓从点击图标到进入应用,安卓系统到底做了哪些工作?

安卓中的动画你有用过吗?

有没有处理过 ANR 的问题呢,你是如何解决的

计算机网络

TCP 三次握手

数据库

数据库这块接触过吗,用过什么数据库

索引是怎么实现的

能举例子说说哪些查询语句是低性能的吗

你简单评价一下自己最大的优点和缺点

对于公司的选择,你更看重什么呢

HR 面

HR 是直接一个电话突袭面试的,没有提前通知,大概聊了半小时,具体问题没有记下来,就问了问实习时间、实习地点、一周可以到岗的天数、如何选择 offer 还有一些比较常见的问题,聊聊天,没有为难人。

字节

抖音电商部门

时间线

日期流程
2020/12/22 周二下午投简历
2020/12/23 周三上午HR 约面试,由于我的可入职时间太晚(2021年4月)于是延后面试
2021/02/18 周四下午HR 约一面
2021/02/23 周二下午技术一面、技术二面
2021/02/24 周三上午技术三面
2021/02/26 周五下午微信询问 HR,三面挂啦,没有收到感谢信~

碎碎念

已投,2月23号一二面通过,2月24号三面挂。

面试官笑嘻嘻的跟你聊天不代表稳了哈兄弟们。

我三面全程聊得很开心导致我三面结束就和爸妈出去庆祝了(。。。)

然后过两天通知挂了OTZ

问了 HR 妹子,三面面试官的面评是说我对项目了解过于表面,估计是因为问到了一些底层原理没答好。

这三面问到的算法题,《剑指Offer》题目覆盖率很高,所以剑指的题目必须熟悉。

面试题

上面三家面试的记录我都是录音录下来然后直接把音频转文字来整理的,一个个去听实在是太浪费时间啦。安利一个软件「i笛云听写」,巨巨巨方便。

字节的三轮面试我都是录屏记录下来的,加起来快三个小时了,我实在是不想打开看然后再整理了OTZ这部分面试题就大概回忆一下。

一面重基础,基本上都是一些常见的计算机基础题,包括操作系统、计算机网络,没有问数据库,然后问了问我做过的项目,以及做了一个还是两个算法题。

二面相对于一面来说问得更加灵活,偏场景题,看重分析能力,基本上就是能想到啥就扯啥。

三面主要问我做过的项目,从项目发散开来问问题,由于是第一家面的公司我可能还是准备的不太充分,项目问的比较深,有些点没答好,整体自我感觉还可以,面完还跑出去吃饭庆祝,不过还是挂啦OTZ。

总结

历时刚好一个月左右,最后拿下了美团、阿里、腾讯,考虑了三家部门负责的业务以及转正问题,决定去阿里啦。回头看看就很神奇,去年最想去的是字节,总共投了四家公司,最后除了字节,剩下三家都顺利走完了全部流程,大概是和字节八字犯冲,好的那我就不去字节大小周了,以后拥抱快乐双休。

三月真的很痛苦,被字节挂了之后自信心也掉了一大截,还好都过去啦!切身体会了一番什么叫做柳暗花明又一村,嘿嘿,春招可以圆满结束了!五一节后去阿里实习努力转正啦!

笔记

校招笔记 📒

站子收集 bot

网上冲浪的时候总能看到一些不错的站子

之前老是加入书签然后就找不到了

干脆写一篇博客记录一下

设计类

Anyway.fm 最喜欢的一个网站 设计风格什么的都超棒,JJ 和 Leon 都很有意思哈哈哈

CheapBall 微博上偶然看到的同校设计师

Yanlinma.com

Ninx 这个很有意思

Httpster 2020 年的精彩网站集合 ☆

技术类

Wanandroid 这个信息整合的确实还不错,虽然丑了点哈哈哈。

个人网站

Nekocode 这个巨好玩 想看到简历还要花点功夫

JJ Ying Anyway 主播一号的个人网站

Leon Gao Anyway 主播二号的个人网站

信息订阅类

DEX周刊

Anyway News

二〇二〇小记

生活

又过完了四季

今天的上海迎来了冬日的第一个零下温度

此刻窗外呼呼呼的风声让我想起了大三坐在工作室里听妖风呼啸的日子

//

今年糊里糊涂的就过完了

年初以为在家放个一两周的假就要返校搬砖

结果最后在家一待待了大半年

掰掰手指一算将近七个月

研一的寒暑假直接全在家里过完了

神奇 2020

//

今年也在好好的 LOG MY LIFE

不过 VLOG 还剩下三个

感觉 12 月剩下的这几天没空做了哈哈哈

那就拖到明年吧

素材都在 iCloud 里积灰啦

//

这一年大概是近两年花钱最没有节制的一年

但凡手上有点钱就要去花掉

逐渐意识到不能再这样下去

明年就本命年 24 岁啦

还不学会理财就晚了

花呗于我而言真不是个好东西

让我一度以为自己手上的钱花不完

11 月过度消费导致 12 月负债累累

月底还光花呗我就彻底关闭再也不用

//

今年终于去现场听到喜欢的歌手唱歌了

总共去了两场live

一次在 MAO LiveHouse 一次在 BUDX VAS

感觉 VAS 没那么热嗷

MAO 实在是太热了不脱大衣是待不下去的

🎵 椅子乐团

看乐夏的时候其实没有太认真看

追了两期之后也没有再看 没太注意有什么乐队

后面才想起来椅子也去了乐夏嗷

喜欢上椅子是因为一首我不知道什么时候在哪听到的歌

💿夏日最美的三十张拍立得相片

现场真的非常不错

大家都超级可爱 明年再见~

🎵 裘德

裘德是我今年九月份发现的宝藏歌手

听私人FM突然听到一首瑞贝卡上了头

跑去听了一下整张专辑都很喜欢

专辑是《颁奖的时候我要缺席》

裘老板一定会火的

//

今年看了些啥电影呢

打开豆瓣瞅了瞅

看了不少嗷

过年的时候在家老抓着 dj 下楼陪我看惊悚片悬疑片

每次怂得要死但是又很想看

我永远喜欢出人意料的悬疑片!

前几天去电影院看了《Soul》

年度最爱电影没有之一

我真的太喜欢这部电影传达的思想了

豆瓣影评区看到很喜欢的一句话:

未必有所成才算活着,梦想也不是什么了不起的东西,只喜欢看天、走路、吃披萨的人生也很好。(皮克斯送给社畜社恐的一记摸头

——礼拜六的两脚兽

购物

既然今年花了很多钱

那必然是买了很多东西

今年买了一一一一大堆电子产品

我真是太喜欢买电子产品了

电子产品比化妆品的吸引力大多啦!

正好年底打开淘宝盘点一下

这一年都买了一些什么有意思的东西

Switch

这玩意简直是疫情之光

在疯狂涨价之前我和 yzh 一人买了一个

虽然红蓝经典配色但是总觉得没有灰色耐看

于是买了灰色

之后出了动森限定馋死了555 那个绿色太漂亮了

Pixel 2XL

做安卓开发来着

于是就买了个测试机

亲儿子果然是最好用的

原生安卓真的太棒啦

ikbc 机械键盘

过年发了个 200 块的京东卡

跑去京东逛了半天不知道买啥就买了个键盘

这是我的第一把机械键盘嗷

之前为什么一直没买我忘记了

看大家都说入门第一把键盘买个 ikbc 差不多了

逛了一圈知乎看人说青轴在宿舍用会被打出去

于是买了个红轴哈哈

中规中矩的一把键盘 红轴挺不错

宁芝静电容键盘

梦中情盘是 HHKB

奈何太贵了于是先买个替代品

结果还是很香的嘛

宁芝确实很不错

国产静电容之光

35g 稍微软一点

加了弹簧到 45g 超级棒

Magic Mouse2

我以为 apple pencil 一代的充电方式已经是最傻的了

直到我用了 Magic Mouse

要整个大翻身才能充电这到底是哪个憨憨想出来的

不过用久了还是磨得指尖疼

我还是最适合用点击的鼠标

DJI osmo action

本来想给自己带来方便

结果只是更麻烦了

对我而言最方便的录像工具还是手机

于是咸鱼上出了

iPad Pro

馋了好久终于买了

没有边框真的好看了一万倍

但是我的电子产品真的不适合裸奔

开开心心裸奔的第二天就砸到了楼梯上磕了个角

我好难

Apple Pencil 2

不得不说相比一代的充电方式

二代真是太友好了

其他和一代差不多 还是一样的好用

加了个轻点笔身切换工具也很不错

Filco Minila

今年最后一笔大消费

买完我就当个老实人了

大 f 的茶轴名不虚传

真的太好用啦

//

明年应该没啥要买的了

好好存钱

哦还要存钱买一个 HHKB!

学习

今年有在好好学习

TechDiary 一直在坚持记录

LeetCode 也在坚持刷题

现在写算法题真的比年初要好太多了

坚持就是胜利!

下半年还整了个面试笔记仓库

知识最重要的就是梳理清楚啦

//

实验室的活慢腾腾的干着

年底差不多也要结项了

在别人的代码基础上改东西真是太烦人了

感觉我今年做的最多的事情就是💩上糊💩

年底逐渐意识到自己或许应该尝试学会在💩里寻求养分

不然只会原地踏步

大概每一个程序员都要做一段时间屎壳郎吧

//

拖延症还是每年都逃不过

不管再怎么让自己别拖到 ddl 之前

最后都是临近 ddl 才做完

不好啊不好

什么时候真的能完全改掉这个坏习惯呢

那就继续交给 2021 的 zxq 了嘿嘿

//

意识到 push 并不是一个坏事

适当的 push 可以提高工作效率

//

自驱力很重要

主动学习的效果总是要比被动学习好得多

//

我喜欢程序员这个职业

保持学习很重要

Keep going!

运动

看了看 Keep 和 Nike Running 的记录

上半年的运动记录还是挺好的

呆在家的几个月里和爸妈跑了不少步

鹅湖公园和南正街轮着来

早上跑步是真舒服啊

跑完回家洗个澡吃个早餐再睡个回笼觉

啊 人生

//

过年吃太狠了胖了快十斤

年后去迪卡侬买了一个很漂亮的绿叶瑜伽垫

开始跟着 B 站各大 UP 主做运动

帕梅拉的视频都超级管用

帕姐无敌!

//

下半年 9 月来学校之后没怎么跑步了

打了几次羽毛球

锻炼不太够

明年开春继续动起来

作息

本年度作息最好的一个月是 12 月

基本上 12 点睡 7 点起

再之前的十一个月就不太规律了

希望今年的最后一个月给明年开个好头

完全不熬夜我觉得我八成做不到

尽量少熬啦

目标

前阵子看到了一个 ARTS 的打卡计划感觉很不错

12 月一直在忙都没什么时间搞

择日不如撞日

就 12 月的最后一周开启第一个 ARTS 打卡吧~

2021 年有一些小目标,希望可以全部达成:

  1. 顺利毕业
  2. 落户上海
  3. 拿到字节跳动 Offer
  4. 全年维持体重在 100 斤左右
  5. 一周运动 2-3 次
  6. 早睡早起超过 300 天
  7. Github 有 300+ 个小绿块
  8. LeetCode 有 300+ 个小绿块
  9. 坚持 ARTS 打卡
  10. 微信读书每周 3h 以上
  11. 做一个快乐的程序员

最后

今天终于认真写了个年终总结 好长啊

废话一如既往的多 可是我最爱写废话 嘿嘿

看了一下 19 年的年终总结居然是 20 年 4 月才写的 太随便了啦 zxq

以后的每一年 12 月底都好好地写一下总结吧

安静坐下来回顾自己过去的一整年是很有意思的事情哦

希望 2021 年梦想成真 一切都好 开开心心

祝好:)

777
2020/12/29 于宿舍一楼自习室靠门口的桌子

使用 ConstraintLayout 构建自适应布局

ConstraintLayout 可以使用扁平控件层次结构(无嵌套控件组)来创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的控件均根据同级控件与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout,并且更易于与 Android Studio 的布局编辑器配合使用。

ConstraintLayout 的所有功能均可直接通过布局编辑器的可视化工具来使用,因为布局 API 和布局编辑器是专为彼此构建的。 因此,我们完全可以使用 ConstraintLayout 通过拖放的形式(而非修改 XML)来构建布局。

1. 如何添加

如果要在项目中使用 ConstraintLayout ,需要确保两点:

在模块级别的 build.gradle 文件中声明 maven.google.com 代码库:

repositories {
    google()
}

在模块级别的 build.gradle 文件中添加 ConstraintLayout 库作为依赖项。(此处版本为 2.0.0)

dependencies {
    implementation "androidx.constraintlayout:constraintlayout:2.0.0"
}

2. 转换布局

如果想将其他布局转换为 ConstraintLayout 约束布局,可以直接在 Component Tree 窗口中,右键该布局,点击 Convert xxx to ConstraintLayout 即可。

3. 约束条件

要在 ConstraintLayout 中定义某个控件的位置,必须为该控件添加至少一个水平约束条件和一个垂直约束条件。

每个约束条件均定义了控件在竖轴或者横轴上的位置,同时均表示了当前控件与其他控件、父布局或隐形引导线之间的连接或对齐方式。因此每个控件在每个轴上都至少有一个约束条件,但通常情况下会需要更多约束条件。

当我们将控件拖放到布局编辑器中时,即使没有任何约束条件,它也会停留在放置的位置。但是当运行应用后,若一个控件没有任何约束条件,则会在位置 [0,0](即左上角)处进行绘制。

例如,在下图中,布局在编辑器中看着很完美,没什么问题,但是由于控件 C 上没有垂直约束条件,所以它会显示在屏幕的顶部。

下图对控件 C 添加了垂直约束条件,所以控件 C 会乖乖的处于控件 A 的正下方。

缺少约束条件并不会导致编译错误,但是布局编辑器会将缺少约束条件作为错误显示在工具栏中。

3.1 添加引导线约束

img

可以添加垂直或水平的引导线来约束控件,该引导线是隐形的,我们可以根据相对于布局边缘的 dp 单位或百分比在布局中定位引导线。

要创建引导线,请点击工具栏中的 Guidelines,然后点击 Add Vertical Guideline 或 Add Horizontal Guideline。

拖动虚线将其重新定位,然后点击引导线边缘的圆圈以切换测量模式。

3.2 添加屏障约束

要创建屏障,按照以下步骤操作:

  1. 点击工具栏中的 Guidelines 图标 ,然后点击 Add Vertical Barrier 或 Add Horizontal Barrier。
  2. 在 Component Tree 窗口中,选择要放入屏障内的控件,然后将其拖动到屏障组件中。
  3. 在 Component Tree 中选择屏障,打开 Attributes 窗口,然后设置 barrierDirection。

我们还可以将屏障内的控件约束到屏障。这样就可以确保屏障中的所有控件始终相互对齐,即使我们并不知道哪个控件最长或最高。同时,还可以在屏障内添加引导线,以确保屏障的位置“最小”。

与引导线类似,屏障是一条隐藏的线,我们可以用它来约束控件。屏障不会定义自己的位置。相反,屏障的位置会随着其中所含控件的位置而移动。如果希望将控件限制到一组控件而不是某个特定控件时,屏障约束就非常好用。

例如在下图中,控件 C 被约束在屏障的右侧。该屏障设置为控件 A 和控件 B 的右侧。因此,屏障根据控件 A 或控件 B 的右侧是否为最右侧来移动。

3.2 创建约束条件

  1. 将控件从 Palette 窗口拖到编辑器中。 当在 ConstraintLayout 中添加控件时,该控件会显示一个边界框,每个角上都有用于调整大小的方形按钮,每条边上都有圆形的约束按钮。
  2. 点击控件将其选中。
  3. 执行以下任一操作都可成功创建约束条件:
    • 点击约束按钮并将其拖动到可用定位点。 此定位点可以是另一控件的边缘、布局的边缘或者引导线。当拖动约束按钮时,布局编辑器会显示可行的连接定位点和蓝色叠加层。
    • 点击 Attributes 窗口的 Layout 部分中的 Create a connection 按钮。

另外,创建约束条件时需要注意几个规则:

  • 每个控件至少有两个约束条件:一个水平约束条件,一个垂直约束条件。
  • 只能在共用同一平面的约束按钮与定位点之间创建约束条件。因此,控件的垂直平面(左侧和右侧)只能约束在另一个垂直平面上;而基准线则只能约束到其他基准线上。
  • 每个约束按钮只能用于一个约束条件,但可以在同一定位点上创建多个约束条件(从不同控件引出的)。

3.3 移除约束条件

可以通过以下任意操作移除约束条件:

  1. 点击某个约束条件将其选中,然后按 Delete。
  2. 按住 Control(在 macOS 上为 Command),然后点击某个约束定位点。请注意,该约束条件变为红色即表示可以点击将其删除。
  3. 在 Attributes 窗口的 Layout 部分中,直接点击某个约束定位点将其删除即可。

4. 自动创建约束条件

我们可以将每个控件移动到希望的位置,然后点击 Infer Constraints 自动创建约束条件。

Infer Constraints 会扫描布局,以便为所有控件确定最有效的约束集。它会尽可能将控件约束在当前位置,我们可能需要进行一些调整,以确保布局能够按照预期自适应不同的屏幕尺寸和方向。

Autoconnect to parent 是可以启用的独立功能。启用后,当我们将子控件添加到父控件时,此功能会自动为每个控件创建两个或多个约束条件,但前提是可以将子控件约束到父布局。Autoconnect 不会为布局中的其他控件创建约束条件。

Autoconnect 在默认情况下处于停用状态。点击布局编辑器工具栏中的 Enable Autoconnection to Parent,即可启用该功能。

参考

使用 ConstraintLayout 构建自适应界面 – Android Developers

Hugo 安装指定版本

前些天逛博客看到 Hugo 觉得不错,然后就去官网逛了逛,看到了一个喜欢的主题 Eureka,且 Hugo 的构建时间秒杀 Hexo 也是个亮点,于是琢磨着转移一下博客,Hugo 搭建起来挺快的,但是遇到了一点版本升级与降级的小问题,记录一下。

1. 起因

我真是浪费了无数时间在折腾博客上- – 不过真好玩哈哈

电脑系统为 MacOS,直接执行了 brew install hugo 安装了 Hugo,装完之后按照 Eureka 的文档 一步步来配置,最后快乐的执行 hugo server 收到了一大串报错,现场未保留,总之是对主题中的一些文件进行了报错。

接着回头思考是哪一步出了错,发现在前提中提到了 Eureka 需要安装 v0.74.0 的 Hugo,瞅了瞅 Hugo 官方最新发布的版本是 v0.76.5,错以为自己电脑上的版本就是 v0.76.5,然后开始 Google 要如何对 Hugo 进行降级。

2. 经过

经过 Google 找到了一篇靠谱的教程来安装旧版本的 Hugo:

Homebrew 安装旧版本软件 – 狂飙

之前这个方法应该是管用的,毕竟评论区中前排的评论都在感谢作者哈哈,但是现在按照这个流程来做会出现报错:

Error: Calling Non-checksummed download of hugo formula file 
from an arbitrary URL is disabled! Use 'brew extract' 
or 'brew create' and 'brew tap-new' to create a formula file 
in a tap on GitHub instead.

这个时候,我起身去了一趟洗手间 🚻 ,回来随手在终端敲下了一句 hugo version,然后发现自己电脑上 Hugo 的版本实际上是 v0.73.0。

行。

所以我应该升级而不是降级。

3. 究极解决方案

想升级很简单,直接执行 brew upgrade hugo 就好啦,会自动给你的电脑安装 hugo 的最新稳定版本。但是问题又来了,目前通过 brew 成功安装到的 Hugo 版本为 v0.73.0,比我需要的 v0.74.0更低,所以我执行该条指令并没有任何帮助。

最后,我需要解决的问题应该是——如何安装指定版本的 Hugo。很简单,根据 How to install a specific version of gohugo 这个问题中的第二个评论找到了解决方案:

  1. 去 Hugo-Github 的 Releases 页面找到你需要的指定版本
  2. 根据电脑系统定位到对应的压缩包进行下载(我的电脑系统为 MacOS 所以选择的是 hugo_0.74.0_macOS-64bit.tar.gz
  3. 解压该压缩包,用其中名为 hugo 的可执行文件去替换当前电脑中已有的 hugo 可执行文件,MacOS 下 hugo 所在的路径为 /usr/local/bin

替换后就成功装上想要的版本啦~

4. 注意

另外有个要注意的小问题是 MacOS 使用 homebrew 安装的话默认会安装 extended 版本。发现这个问题是还看上了另外一款主题 MemE,这款主题要求安装 extended 版本的 Hugo,而我在 Install-Hugo 中也没有查找到 MacOS 中要如何安装 extended 版本,最后在 Hugo 的 Github 库中看到了一个 issue,里面提到:

An extended is default on macOS with brew install hugo

所以 MacOS 中使用 homebrew 安装 Hugo 的话是默认安装 extended 版本的。

参考

中英文空格使用指北

1. 前言

前阵子逛 Github 看到了一个有意思的库:中文文案排版指北,然后发现中文和英文之间加上空格好像是要更赏心悦目一些。

有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。

與大家共勉之。

——vinta

看到上面这段话乐了半天,想起研一某门课做 Pre 的时候,我复制论文到 PPT 里的时候还“体贴”的帮作者去除了他句子里中文和英文之间的空格,当时还心想这个作者不行,怎么能忘记删空格。

对不起,我的错。

上面这个库总结得很到位,我把空格抓出来做个列表,具体用例去看该库即可。

2. 空格

  • 中英文之间需要增加空格
  • 中文与数字之间需要增加空格
  • 数字和单位之间需要增加空格
  • 全角标点符号和其他字符之间不加空格
  • 链接之间增加空格(有争议)

3. 加 or 不加

2017年国家发布了《中文出版物夹用英文的编辑规范》,其中在第八小节——空格的规则中,列举了以下三条:

  1. 中文文本中夹用英文词语时,应根据所选用的中英文字体、字符间距以及排版的视觉效果决定英文词句与中文文字之间是否留有空格间距。如留空格,应保证体例的统一。
  2. 中文文本中夹用英文词句时,如英文部分之前或之后有中文标点符号,则英文部分与中文标点之间不设空格。
  3. 中文文本中夹用英文句子或段落时,英文句子或段落内部应按英文排版规则留空。

围观了一下知乎中关于该问题的各个高赞回答,其实加与不加全看个人习惯,如果你觉得不加更舒服你就别加,加上更舒服你就加,全看自己心情啦。

4. 参考

Room Database

1. 前言

ORM,Object Relational Mapping,对象关系映射,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

目前有很多优秀的第三方框架比如:

上面这些也不是不能用,但是每次要用的时候左看看右看看,选数据库都要选个半天,直接用原生的 Room 比较省事啦。

2. Room 是什么

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

Room 主要包含三个主要的组件:

  1. 数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。使用 @Database 注解的类应该满足以下三个条件:
    • 该类是继承 RoomDatabase 的抽象类。
    • 在注解中需要添加与数据库关联的实体列表
    • 需要包含具 0 个参数且返回使用 @Dao 注解的类的抽象方法。

在运行时,可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。

  1. Entity:实体,表示数据库中的表。
  2. DAO:包含用于访问数据库的方法。

首先,使用 Room 数据库来获取与该数据库相关联的数据访问对象 (DAO)。然后,使用每个 DAO 从数据库中获取实体,再将对这些实体的所有更改保存回数据库中。 最后,使用实体来获取和设置与数据库中的表列相对应的值。

3. 使用方法

3.1 添加依赖

Java

    dependencies {
      def room_version = "2.2.5"

      implementation "androidx.room:room-runtime:$room_version"
      annotationProcessor "androidx.room:room-compiler:$room_version"

      // optional - RxJava support for Room
      implementation "androidx.room:room-rxjava2:$room_version"

      // optional - Guava support for Room, 
      // including Optional and ListenableFuture
      implementation "androidx.room:room-guava:$room_version"

      // optional - Test helpers
      testImplementation "androidx.room:room-testing:$room_version"
    }

Kotlin

    dependencies {
      def room_version = "2.2.5"

      implementation "androidx.room:room-runtime:$room_version"
      kapt "androidx.room:room-compiler:$room_version"

      // optional - Kotlin Extensions and Coroutines support for Room
      implementation "androidx.room:room-ktx:$room_version"

      // optional - Test helpers
      testImplementation "androidx.room:room-testing:$room_version"
    }

3.2 创建Entity

在 Entity 中,至少需要包含一个主键 @PrimaryKey

Java

    @Entity
    public class User {
        @PrimaryKey
        public int uid;

        @ColumnInfo(name = "first_name")
        public String firstName;

        @ColumnInfo(name = "last_name")
        public String lastName;
    }

Kotlin

    @Entity
    data class User(
        @PrimaryKey val uid: Int,
        @ColumnInfo(name = "first_name") val firstName: String?,
        @ColumnInfo(name = "last_name") val lastName: String?
    )

3.3 创建DAO

DAO 表示数据访问对象,在 DAO 中,需要创建一系列用于访问数据库的方法,典型的包括下面的增删改查操作。

Java

    @Dao
    public interface UserDao {
        @Query("SELECT * FROM user")
        List<User> getAll();

        @Query("SELECT * FROM user WHERE uid IN (:userIds)")
        List<User> loadAllByIds(int[] userIds);

        @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
               "last_name LIKE :last LIMIT 1")
        User findByName(String first, String last);

        @Insert
        void insertAll(User... users);

        @Delete
        void delete(User user);

        @Update
        void update(User user);
    }

Kotlin

    @Dao
    interface UserDao {
        @Query("SELECT * FROM user")
        fun getAll(): List<User>

        @Query("SELECT * FROM user WHERE uid IN (:userIds)")
        fun loadAllByIds(userIds: IntArray): List<User>

        @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
               "last_name LIKE :last LIMIT 1")
        fun findByName(first: String, last: String): User

        @Insert
        fun insertAll(vararg users: User)

        @Delete
        fun delete(user: User)

        @Update
        fun update(user: User)
    }
    

3.4 创建数据库

数据库类需要使用 @Database 来注解,且在紧跟着的括号中,要添加与该数据库相关联的实体列表,如代码中的 User.class。注解中的 version 代表版本号。

如果应用在单个进程中运行,在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例的成本相当高,而应用几乎不需要在单个进程中访问多个实例。

Java

    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();

        public static synchronized AppDatabase getInstance(Context context) {
          if (instance == null) {
              instance = create(context);
          }
          return instance;
        }

        private static AppDatabase create(Context context) {
          return Room.databaseBuilder(getApplicationContext(),
                    AppDatabase.class, "database-name").build();
        }
    }
    

Kotlin

    @Database(entities = arrayOf(User::class), version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    }

    @Synchronized
    fun getInstance(context: Context): AppDatabase {
        if (instance == null) {
            instance = create(context)
        }
        return instance
    }

    private fun create(context: Context): AppDatabase {
        return Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()
}
    

3.5 使用数据库

创建数据库实例之后就可以愉快的增删改查啦。

Java

    AppDatabase db;
    db = AppDatabase.getInstance(context);
    // 增
    db.userDao().insertAll(users);
    // 删
    db.userDao().delete(user);
    // 改 
    db.userDao().update(user);
    // 查
    List<User> users = db.userDao().getAll();

Kotlin

    val db: AppDatabase
    db = AppDatabase.getInstance(context)
    // 增
    db.userDao().insertAll(users)
    // 删
    db.userDao().delete(user)
    // 改 
    db.userDao().update(user)
    // 查
    val users = db.userDao().getAll()

4. 注意事项

使用过程中碰到了一些坑,之后补充在这里。#TODO

5. 参考