之前牛客上联系的淘天的其他部门,直接发简历给到组内的负责人。被约面试,没有走系统内推,被面试官告知可以不走系统,也能拿到offer。
个人感觉这种流程不是很可靠,只能先面,后续有无推进都随缘了
面试内容:
算法题:定义一种特殊数对(i,j)满足:0<=i<j<nums.length,lower<=nums[i]+nums[j]<upper;找出特殊数对
发题目到邮件,但是因为太卡了,那个系统写一半就不让继续写了,只能讲述一下思路,归并排序然后递归比较;
- Java中Hash Map线程安全如何保证?
- 说了HashTable是整体加锁,效率太低,后面改成ConcurrentHashMap,分段锁
- 那ConcurrentHashMap性能是否好?
- 没太理解面试官想问的点,回答性能很好啊。
- 读操作(查询)可以并发执行。不同的线程可以同时读取不同的片段,无需相互阻塞。
- 写操作(插入、更新、删除)只会锁定对应的片段
- 问Java8之后对ConcurrentHashMap的优化
- 一开始没想起来,后来经过提醒想起来了,讲分段锁给换了,不用Segment分段锁,改成CAS+红黑树+链表
- CAS+synchronized 实现颗粒度更低的锁
- ConCurrentHashmap 每次扩容是原来容量的2倍,而且扩容的时候也能进行读写操作
- 那这里面CAS有什么问题?
- 想半天,想到了ABA的问题
- 还会有自旋的开销
- 那如何解决CAS的ABA问题?
- AtomicStampedReference 提供的有版本号
- 增加一个中间状态
- 使用带有时间戳的原子类,AtomicStampedLong
- 但是这些其实本质上就是多做了几次比较,能解决ABA问题,那也会有ABABABA这种情况
- 为什么直接调用方法和访问字段的性能通常比使用反射更好
- 反射需要进行额外的运行时类型检查和解析。
- 看你们有做过内存优化相关的,怎么做的
- 分两个大的方向,一个是资源优化,比如使用合适的图片缓存策略和图片压缩方式,用Webp这种格式
- 另一个就是偏解决内存分析的问题,如内存抖动等等,对内存管理用一些常见的工具监测
- 有用过哪些内存监测的工具?
- Android studio自带的Memory Profiler,可以查找对象的引用链和内存泄漏情况
- 使用 LeakCanary,定位内存泄漏的位置
- Java堆方向的分析MAT
- 那有没有做过这种内存线上监控,怎么实现?
- 没有做过,自己了解可以去实现类APM这种工具
- 监测一些内存快照,监测一些关键指标,如CPU使用率这种
- Android签名的流程和原理
- 密钥对生成:首先,使用 Java 的
keytool
工具生成一个密钥对。 - 生成证书请求:使用私钥生成一个证书请求
- CA 的签发:将证书请求发送给 CA 进行签发
- 开发者使用密钥对中的私钥对应用进行签名
- 将 CA 签发的数字证书(即公钥)添加到应用的签名区域中。
- 如何生成摘要?
- MD5、SHA、base64 的加密算法,在打包时配置build.gradle,在构建过程中自动生成摘要文件
- 有了解现在目前Android签名有几个版本?
- 不是很了解,知道v1,v2,v3,v4(Android 11)
- v1是基于基于JAR签名规范实现,使用RSA和SHA-1算法组合签名,存在相对较大的安全,META-INF目录下的文件并不在校验范围内
- v2全文件签名方案,Android 7引入的,通俗点说就是签名信息不再以文件的形式存储,而是将其转成二进制数据直接写在apk文件中
- v3支持 APK 密钥轮替,这使应用能够在 APK 更新过程中更改其签名密钥
- v4 Android 11 将签名存储在单独的 .apk.idsig 文件中,也支持ADB 增量 APK 安装
- OpenGL ES的渲染流程
- 输入阶段(Input Stage):该阶段负责接收场景数据,包括顶点位置、纹理坐标、法向量等。
- 顶点着色器阶段:在这个阶段,顶点着色器对输入的顶点进行处理,执行各种变换操作,如模型变换、视图变换和投影变换
- 图元组装阶段,几何着色器阶段(可选)
- 光栅化阶段,就是给图元放在对应的位置,就是转成片段(fragement),我们手机上的像素
- 片段着色器阶段,对每个片段处理
- Tcp的可靠性怎么实现
- 面向连接传输,三次挥手,四次握手
- 序列号和确认应答
- 数据包重传
- 滑动窗口,拥塞机制
- Android虚拟机是什么?
- 早期的Dalvik,现在的ART,编译生成DEX文件
- JAR包和APK的区别?性能方向?
- Dex文件相当于将多个class文件合并在一起之后再进行压缩,加载类时对dex需要一次IO可以加载很多新类,而class需要加载多次IO
- Android是基于寄存器式的虚拟机,直接经由CPU运算,运算的速度就会更快,移动设备本身性能就不行,所以用这个更好,但是带来的包的内容会更大
反问,业务方向,技术方向,流程推进等等
#淘天#
#Android面经##客户端面经#
#许愿offer##阿里#