牛客上投递的,集团还没开系统,被部门老哥提前约面。
约下午16点,老哥开会到17:30,然后电话面的
面试内容如下:
- 项目里面说到Kotlin,你认为Kotlin和Java的区别是什么?
- Kotlin更简洁,加入了可空类型,扩展函数,Lambda表达式等
- Kotlin减少空指针异常,引入了空类型;
- Kotlin有扩展函数
- 有协程!
- 说到Kotlin协程,你使用协程过程中,它的优缺点?
- 优点:
- 轻量级,就是一个简单化的线程
- 方便操作,实现Callback功能,有async,await等操作符号
- 以声明的方式处理协调顺序,避免传统的回调地狱
- 缺点:除了和老版本的代码或者框架有兼容问题,自己没感觉有啥缺点
- 协程实现callback功能的原理:
- 先说一下协程的好处:
- Android通常会将耗时操作放到子线程中,然后通过回调的方式将结果返回后切换主线程更新UI,如果现在有多个子线程并发操作,UI线程在所有子线程工作完之后,处理他们的回调。
- 传统方法会在子线程设一个boolean值,1,0判断,但是这样去写会有回调地狱问题
- 可以用retrofit+Rxjava解决,Rxjava中还有Zip操作符
- 但是Kotlin协程就不用这么麻烦~
- 原理是kotlin可以实现挂起操作,等待结果过程中,运行lamada中的代码,等调用完成了,直接再恢复执行,然后调用。
- Java常见集合类
- ArrayList,Hashmap,hashset,linkedlist等
- 那线程安全的有哪些?
- ConcurrentHashMap,CopyOnWriteArrayList(读的时候不加锁,写的时候加锁),包括跳表等
- 详细说一个实现原理:
- 跳表Skip List通过锁和CAS实现
- 说到CAS,详细说一下原理
- 保证原子性,先比较内存值与预期值,一样的时候才操作
- 锁和CAS区别
- 锁基于互斥,CAS基于比较
- 锁能阻塞,CAS非阻塞
- 锁是悲观锁的机制,CAS是乐观锁的机制
- CAS比较发现失败了怎么办?
- 先重试,重试达到一个阈值之后获取锁来互斥访问
- 了解锁升级的过程吗?
- 偏向锁,一个线程访问,其他线程竞争,升级轻量级锁
- 多个线程竞争,没抢到锁的线程开始自旋,超过10次之后就要爆炸了!锁升级为重量级锁
- 重量级锁的时候,线程就不会再循环干等了,会挂起等待
- HashMap的get方法时间复杂度
- 平均是O(1),最坏的时候是O(n);
- O(n)的时候是大量的键值对都映射到同一个桶里面,形成长链表或不平衡的红黑树
- 怎么减少这种情况?
- 哈希函数要设计好
- 当负载因子超过一定阈值的时候,进行扩容操作重新调整桶数量和分布
- 怎么设计一个好的哈希函数
- 根据键的特性做对应的哈希值;
- 取模运算,加一点位运算,异或等操作
- 散列变换
- Https的证书校验流程
- 检验基本信息:证书所有者、有效期等信息进行一一校验
- 校验 CA 机构
- 解密证书:取出 颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密
- 比对 hash 值:浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,对比校验
- 使用OkHttp证书校验流程
- 获取服务器的数字证书,可以通过浏览器访问该服务器并查看证书信息,或者通过 OpenSSL 工具获取证书信息。
- 将数字证书添加到 Android 应用的资源文件中, raw 目录下的文件
- 创建证书工厂,将证书添加到该工厂中,以便 OkHttp 进行证书校验。
- 将证书工厂添加到 OkHttp 客户端中,并使用该客户端进行 HTTPS 请求。
- 使用TrustManager进行证书校验,使用 hostnameVerifier 进行主机名验证
- 说到自定义证书校验逻辑,使用的是哪种级别的校验?
- 不了解,只是简单看过同事代码
反问:了解部门;了解秋招流程。
问完后要拜拜,结果手一抖我先挂的电话,不知道面试官在对面是不是已经偷偷骂我了
#Android面经##阿里##淘天#
#秋招面经##秋招#