笔试
题目是 “最长不重复字母子串长度”
15分钟写完代码,讲解思路,放到main方法,提供几个测试用例。
有bug,改!改完还有bug,没事继续改!
没问题了,能优化这算法吗?性能优化。
还能优化吗?不只是性能,从各方各面,比如现在要把代码commit上去,有哪些要注意的地方?
自己没看出来,后面面试官提示了:代码缩进,入参校验。
整个笔试花了接近30分钟。
面试
- 主用语言是java还是kotlin?
- **java主要写哪些方面的内容?比如IO,并发等?**这里没答上来,因为平时并不负责某一模块,有什么需要我就去写什么,而且做的事情也比较单一,并不复杂。需要对这一块做一个刻意练习。
- 这里对我讲到的项目一个功能展开说
- **自定义注解实现检查字段上传功能。**这里我的表述有问题,我说了上传其实是把数据放到请求的body里,而他认为是上传功能,通过上面途径去上传,文件还是?这里可以对上传功能做一个润色。
- **还有什么场景需要用到这个功能?**定时任务,原来是用了Thread一分钟执行一次,尝试使用过AlarmWorker,但是效果较差,延迟较高,测试不通过。面试官问:这个定时任务一般配置多长时间?你是怎么保证他能在规定时间生效的?这里没有好方法,让我回去之后好好考虑间隔一段时间去执行任务到底怎么做,能不能做。
- 项目遇到存储需要对数据进行持久化的时候该怎么办?
- **sqlite用得多吗?**不多。
- **假设要提高查询性能一般有哪些方法?**建立索引。**怎么建?**不知道。
- **事务知道的多吗?**不多,知道一些原理。就没继续问了。
- JAVA的垃圾回收知道吗?
- 了解过,说了两个复制算法和标记清除。不过他好像对这个不感兴趣,打断了。
- JAVA常用的引用类型清楚吗?
- **强软弱虚引用的作用和区别,说下自己的理解。**强引用就是直接声明的引用,软引用和弱引用的对象需要继承各自的Reference类的子类。(这里介绍的也不深)
- 提到了ThreadLocal的Entry也用到了弱引用。(这里由于我个人发音的问题加上麦克风质量不好,我的ThreadLocal,很容易听成FredLocal。他也没打断,我一直说。到后面他才反应过来,你说的应该是ThreadLocal吧,我说是啊。然后他笑的很大声,说一直疑惑什么是FredLocal。)
- ThreadLocal用到了弱引用是为了防止内存泄漏,引出了内存泄漏这个话题
- **说下对内存泄露的理解。**提到了Handler机制,为什么会发生内存泄漏。注意怎么避免内存泄漏。
- **抛开Handler机制内存泄漏的例子,内存泄漏的本质是什么?**一个不再需要的对象在垃圾回收的时候应该被回收,而由于不正当的处理导致它不能被回收仍然占用着内存。
- **还有哪些场景需要注意内存泄漏问题?**这里也没说好,硬扯了一个注册广播和服务。这里被追问了,如果在onStop把功能停了,那原来的那些数据怎么保存?然后我说了savedInstance?,他笑了笑说,它不是用来干这个的。下去好好看看。
- 用过的常见的JAVA集合有哪些?知道的,用过的都可以说。
- 这里只说了ArrayList,LinkedList,HashMap,HashSet,ConcurrentMap
- **对ConcurrentMap发起提问,是用来解决什么问题,是怎么解决的?**用来解决HashMap并发写入问题。具体是什么问题?两个线程对一个HashMap的同一个桶进行操作的时候导致导致其中一个被覆盖。
- 设计模式用过吗?设计模式的分类,三大类。哪三大类?
- 创建型,结构型?不知道了。他说平时开发过程中也可以多去思考一下,会发现很多都是这几类的。
- **那你自己用过哪些?**了解比较深的是,单例,观察者,责任链,适配器。
- **自己写的话写过哪些?**单例。他好像不感兴趣(确实,这个听多了就没啥意思了,下次可以换观察者说)
- 设计模式的一些原则,如何理解依赖倒置原则。刚好提前看了设计模式的原则,应该是用来解决循环依赖的,然后我就说了把需要被多个模块引用的类放在低级模块也就是base模块,然后需要用到的其他模块就去引用base模块,从而避免了两个高级模块之间的互相引用。(说完他说稍等他去搜一下这个依赖倒置原则…)
- 操作系统
- **你理解进程的概念吗?**说了一些基本概念,开了进程操作系统就要分配虚拟空间。这里被打断了,应该是对内存空间比较感兴趣。
- **怎么理解操作系统分配的内存空间?**每个进程分配的都是虚拟内存,用户申请了内存就向操作系统的页表生成一个页表项,用到这块内存再去申请物理内存。
- **一个应用可以有多个进程,怎么理解多进程,你们公司或者自己项目也没有用到多进程,优势是什么?**这里也不知道,纯瞎扯,比如多开一个进程分担一些进程的负担,什么负担?比如Linux限制一个进程最多打开的文件描述符是1024个,如果需要打开的fd比较多,那就多开一个(这里说出来我自己都不敢相信)
- **你说的是Linux的,那安卓的呢?**安卓也是基于Linux内核,应该同样受限制吧?
- 你结合这个跟前面说的保活一起去看一下,多进程和保活。
- 网络这一块,简单问几个问题(翻车)
- **应用层和传输层常见的协议。**应用层:HTTP,HTTPS,FTP,SNMP,FTP。传输层:TCP和UDP。
- **你们公司用什么协议?**HTTPS。S是什么?SSL,HTTP是明文传输,HTTPS对信息加密。双方SSL连接之后,加密发送信息,用公钥解密。(天呐我居然说了公钥,我原以为对HTTPS很熟悉了,结果在关键时刻还是忘了,忘记客户端最重要的key就是PreMaster了,它用服务器的公钥加密,只有服务器的私钥能解密。所以应该是私钥解密?但是我没有说出来是私钥,因为它不是传统的那种私钥,因为服务器是知道客户端的私钥的,所以我就不认为是私钥了)。虽然确实不是私钥,到那时我也没有解释清楚。面试官还是让我下来再好好看一下。
- 说一下自己的优势,硬实力软实力都可以说。
- 这是全场最尴尬的一个环节,从来没想过,只能说自己勤奋和活泼了。
反问
钉钉安卓端分部门或者小组吗?
- 分的,他是IM组(不知道是IM还是IMF?),就是界面这一块,打开钉钉看到的这些界面都是他们负责的。
最后:
面试就到这里结束,后面的话,流程那种都关注一下!
#秋招##面试##面经#