Android 面经【持续更新.....】
小红书Android开发
一面
- 先是自我介绍;
- 对着简历问项目经历;
- 然后是基础:ANR的原理和分析方法, 回答的比较随意,没怎么深入去说。
- 然后就是笔试: 二叉树的广度优先遍历
没有准备二叉树这块,所以没有做出来,在面试官提示的情况下才做出来。
哎,贴一下二叉树的几种遍历方式吧
// 前序遍历
void PreOrderTraversal(BitNode *root)
{if (root){cout << root->data << " ";PreOrderTraversal(root->left);PreOrderTraversal(root->right);}
}//深度优先搜索
//利用栈,现将右子树压栈再将左子树压栈
void DepthFirstSearch(BitNode *root)
{stack<BitNode*> nodeStack;nodeStack.push(root);while (!nodeStack.empty()){BitNode *node = nodeStack.top();cout << node->data << ' ';nodeStack.pop();if (node->right){nodeStack.push(node->right);}if (node->left){nodeStack.push(node->left);}}
}//广度优先搜索
void BreadthFirstSearch(BitNode *root)
{queue<BitNode*> nodeQueue;nodeQueue.push(root);while (!nodeQueue.empty()){BitNode *node = nodeQueue.front();cout << node->data << ' ';nodeQueue.pop();if (node->left){nodeQueue.push(node->left);}if (node->right){nodeQueue.push(node->right);}}
}
高德云图
一面
activity A 启动activity B的过程
App 按home键 回到桌面,然后再回到app 的整个过程
HandlerThread 是什么?
Android为什么使用binder,已经有linux的管道,消息队列,socket,共享内存了,为什么还要binder。
事件分发流程, 先decorview 还是先window?
为什么再activity的oncreate, onstart, onresume中拿不到view 的宽高
view是在setContentView之后才被添加到decorView的;
ViewRootImpl还未执行messure ,layout等过程;如果就想要再这些函数中拿到width需要怎么做?
可以view.post(runnable 中去拿);反射中getDeclaredField 和getFiled 的区别
getDeclaredField 只能找到本类申明的filed,getFiled 会先在本类找,找不到再其父类找; 如果父类找不到,再去父类的父类找。
- c++
c++的编译过程
函数重载
多态
虚函数,虚表;虚表放在哪里?对象还是类?
虚表放在只读区,属于类的信息,每个类的对象中的虚表指针指向其虚表;
子类的虚表会拷贝父类的虚表内容,并将自己的虚函数地址覆盖对应的位置。malloc 和new 的区别
new是关键字,malloc是库函数;
new 返回的是对应类型的指针;malloc返回 void *,需要强制转换;
new 的大小编译器自动计算,malloc需要自己制定;
创建对象都需要调用构造函数来进行初始化工作,编译器默认为new 添加的行为,编译器可以控制主动调用构造函数;malloc 不再编译器的控制范围内。
new 分配失败会抛异常,malloc 失败返回null;#ifdef XXX #endif 的作用
如果用宏实现 a+ b, 有啥注意的?
define add(a, b) ((a) + (b)); 宏是直接字符串替换,如果a,b是表达式,展开后会有问题。lambda 表达式
为什么析构函数需要virtual?
是为了回收资源。如果不virtual, 通过父类指针 delete 子类对象时,永远调不到子类的析构函数,调了父类的析构函数,从而没办法释放子类的内存。c++ 中使用c 写的代码时,如何使用?
extern “C” {
c 代码
}
为什么要这样做? 它解决什么问题。 c语言的函数编译后函数名就是原始函数名,c++ 会带上类型信息; 加上这句话就是告诉编译器,直接使用原始函数名去 找函数,而不是c++格式的方式。c++ 的内存区域, 堆和栈
栈用来存放局部变量,由系统自己分配和释放;堆存放程序员分配释放,比如new 关键字,malloc等;
栈向下拓展,堆向上拓展;
某公司
设计一个登录模块,你会怎么设计?
登录状态token你会怎么缓存
答了sp。
其实还可以数据库,json 序列化保存等。
不使用成熟的网络上传库,直接使用原生接口实现文件上传
直接使用HttpURLConnection 建立链接,然后将文件写入输出流就行了
private void uploadFile() {String end = "/r/n";String Hyphens = "--";String boundary = "*****";try {URL url = new URL(actionUrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();/* 允许Input、Output,不使用Cache */con.setDoInput(true);con.setDoOutput(true);con.setUseCaches(false);/* 设定传送的method=POST */con.setRequestMethod("POST");/* setRequestProperty */con.setRequestProperty("Connection", "Keep-Alive");con.setRequestProperty("Charset", "UTF-8");con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);/* 设定DataOutputStream */DataOutputStream ds = new DataOutputStream(con.getOutputStream());ds.writeBytes(Hyphens + boundary + end);ds.writeBytes("Content-Disposition: form-data; "+ "name=/"file1 / ";filename=/"" + newName + " / "" + end);ds.writeBytes(end);/* 取得文件的FileInputStream */FileInputStream fStream = new FileInputStream(uploadFile);/* 设定每次写入1024bytes */int bufferSize = 1024;byte[] buffer = new byte[bufferSize];int length = -1;/* 从文件读取数据到缓冲区 */while ((length = fStream.read(buffer)) != -1) {/* 将数据写入DataOutputStream中 */ds.write(buffer, 0, length);}ds.writeBytes(end);ds.writeBytes(Hyphens + boundary + Hyphens + end);fStream.close();ds.flush();/* 取得Response内容 */InputStream is = con.getInputStream();int ch;StringBuffer b = new StringBuffer();while ((ch = is.read()) != -1) {b.append((char) ch);}System.out.println("上传成功");ds.close();} catch (Exception e) {System.out.println("上传失败" + e.getMessage());}}
Taptap
一面
聊了一堆项目后,做一个算法题,实现版本好对比。
然后以为结束了,又来问一堆八股。。
c++构造函数为什么不能是虚函数?
调用构造函数需要通过虚函数指针找到虚表,然后找到对应的虚函数地址;如果构造函数是虚函数,那么调用构造函数就需要通过虚函数指针去找到,而虚函数又是在构造函数中初始化的,这就出问题了。智能指针用过哪些?
git rebase 和git merge的区别?
1、rebase把当前的commit放到公共分支的最后面,merge把当前的commit和公共分支合并在一起;
2、用merge命令解决完冲突后会产生一个commit,而用rebase命令解决完冲突后不会产生额外的commit。git切换分支为什么能够这么快?
git 的commit 是创建一个指向当前快照的指针,git分支本质上是一个指向提交对象的可变指针,指向最新的commit 对象
每个快照都是一次完整信息,所以可以快速地切换。viewModel 和LiveData用过吗?
viewModel的setValue 和postValue的区别? postValue能够保证顺序吗?
viewModel 和普通的观察者相比使用上有什么优势?
Android 多进程通信的方式有哪些?
binder 的原理
相对布局怎么实现在左中显示一个view?
为什么编码使用utf-8 ,它一个字符占多少字节?
为了兼容各个语言字符.
UTF-8使用1~4字节为每个字符编码:
1、一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
2、带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
3、其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
4、其他极少使用的语言字符使用4字节编码。用过哪些设计模式?在哪些场景使用了?
怎么保证工程质量的?
说了合码卡点,代码静态检测,性能自动化,包大小检测等。。
又问了静态检测了哪些规则。。
Android 面经【持续更新.....】相关推荐
- Android 学习资料(持续更新)
概述 收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习 ...
- android studio小日常(持续更新)
这里会更新一些android studio大家可能找不到的地方,也是比较常用的一些技巧. 大家也可以把使用中的问题留在评论中,大家相互交流 1.我们在使用android studio编辑xml的时候 ...
- Android开发学习持续更新中
Android开发 单个Activity界面内的操作 控件1TextView控件使用 控件2Button控件使用 1首先对于android的按键格式 2对按键监听事件进行绑定 控件3EditText文 ...
- 助力Android开发者(持续更新)
文章目录 网络相关 网络请求 文件下载 图片相关 图片加载 图片编辑 储存相关 数据库 键值对 音视频相关 视频 音频 UI 事件总线 其他 网络相关 网络请求 RxHttp(支持Kotlin协程.内 ...
- android常用轮子(持续更新)
一.快速开发框架 XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载.缓存.事件总线.权限管理.数据库.图片加载,基本都是项目中必用功能,每个模块 ...
- Android pm命令(持续更新中...)
# adb shell pm uninstall -k --user 0 包名 //adb 删除系统应用 # adb shell am start -n 包名/包名.活动名 //adb运行apk # ...
- 分享大神的一些博文、视频、资料--持续更新
心理学家 Ericsson 的研究发现:决定伟大水平和一般水平的关键因素,既不是天赋,也不是经验,而是[刻意练习]的程度. 教育最重要的不是灌输,而是引发思考.这样的话就没有必要按时间顺序,介绍很多细 ...
- android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)
前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...
- Android系统兼容性问题(持续更新)
相信开发过一段Android的都被Android中的兼容性问题给折腾过,有时这确实很无奈,Android被不同的厂商改的七零八落的.本文主要总结下本人在实际的项目开发过程中所遇到的兼容性问题,以及最后 ...
- Android常用开发网址(持续更新)
2019独角兽企业重金招聘Python工程师标准>>> Android常用开发网址(持续更新) 环境搭建 android镜像 http://www.androiddevtools.c ...
最新文章
- 人脸识别门禁_门禁人脸识别系统铜陵县门禁人脸识别系统哪家好
- 8天学通MongoDB——第三天 细说高级操作
- 如何快速成长为技术大牛?
- 反射调用private或internal构造函数
- wchar_t*和string相互转换
- 数据结构与算法之暴力递归改动态规划
- Jlink commander、MCU GD32启动方式、Bootloader
- Linux技术学习路线图
- Docker安装及配置镜像加速器
- 数据库原理—数据库管理系统的功能和特点(四)
- 海量数据处理相关算法及数据结构【转】
- Interpreting and Disentangling Feature Components of Various Complexity from DNNS论文解读
- 不小心把Run Dashboard隐藏了多服务运行操作菜单找不到?springboot多服务快速启动窗口打开,按照这个办法完美解决!
- 信号与系统——初识信号的原理与分类
- ⭐❤️sqlite数据库使用大全❤️⭐
- 想要快速增肌?肌酸可以帮你高效获得肌肉和力量
- httpwatch初级使用
- opencv+ffmpeg+Qt h264录制
- Excel计算工作日的公式
- 李彦宏创业语录中我喜欢的几句
热门文章
- 计算机网络技术用苹果电脑,苹果电脑的硬盘能接到PC机上用吗?能用硬盘 – 手机爱问...
- 数据结构常见问题系列(二)
- 京东白条三道坎:“白条”如何吸金?
- 电影/电视剧/综艺/动漫/游戏 下载链接搜索引擎
- aruba无线ap认证服务器,Aruba无线AP及AC配置.doc
- 计算机网络知识点整理(笔试面试)
- SDU信息门户(8)组队和文件系统分析
- cuda编译错误 ptxas fatal : Unresolved extern function xxxx
- 06-08 无人机怎么拍摄VR全境图?
- 走进一心堂,读懂数字化转型新风向