小红书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);}}
}

高德云图

一面

  1. activity A 启动activity B的过程

  2. App 按home键 回到桌面,然后再回到app 的整个过程

  3. HandlerThread 是什么?

  4. Android为什么使用binder,已经有linux的管道,消息队列,socket,共享内存了,为什么还要binder。

  5. 事件分发流程, 先decorview 还是先window?

  6. 为什么再activity的oncreate, onstart, onresume中拿不到view 的宽高
    view是在setContentView之后才被添加到decorView的;
    ViewRootImpl还未执行messure ,layout等过程;

  7. 如果就想要再这些函数中拿到width需要怎么做?
    可以view.post(runnable 中去拿);

  8. 反射中getDeclaredField 和getFiled 的区别
    getDeclaredField 只能找到本类申明的filed,getFiled 会先在本类找,找不到再其父类找; 如果父类找不到,再去父类的父类找。

  • c++
  1. c++的编译过程

  2. 函数重载

  3. 多态

  4. 虚函数,虚表;虚表放在哪里?对象还是类?
    虚表放在只读区,属于类的信息,每个类的对象中的虚表指针指向其虚表;
    子类的虚表会拷贝父类的虚表内容,并将自己的虚函数地址覆盖对应的位置。

  5. malloc 和new 的区别
    new是关键字,malloc是库函数;
    new 返回的是对应类型的指针;malloc返回 void *,需要强制转换;
    new 的大小编译器自动计算,malloc需要自己制定;
    创建对象都需要调用构造函数来进行初始化工作,编译器默认为new 添加的行为,编译器可以控制主动调用构造函数;malloc 不再编译器的控制范围内。
    new 分配失败会抛异常,malloc 失败返回null;

  6. #ifdef XXX #endif 的作用

  7. 如果用宏实现 a+ b, 有啥注意的?
    define add(a, b) ((a) + (b)); 宏是直接字符串替换,如果a,b是表达式,展开后会有问题。

  8. lambda 表达式

  9. 为什么析构函数需要virtual?
    是为了回收资源。如果不virtual, 通过父类指针 delete 子类对象时,永远调不到子类的析构函数,调了父类的析构函数,从而没办法释放子类的内存。

  10. c++ 中使用c 写的代码时,如何使用?
    extern “C” {
    c 代码
    }
    为什么要这样做? 它解决什么问题。 c语言的函数编译后函数名就是原始函数名,c++ 会带上类型信息; 加上这句话就是告诉编译器,直接使用原始函数名去 找函数,而不是c++格式的方式。

  11. 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 面经【持续更新.....】相关推荐

  1. Android 学习资料(持续更新)

    概述 收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习 ...

  2. android studio小日常(持续更新)

    这里会更新一些android  studio大家可能找不到的地方,也是比较常用的一些技巧. 大家也可以把使用中的问题留在评论中,大家相互交流 1.我们在使用android studio编辑xml的时候 ...

  3. Android开发学习持续更新中

    Android开发 单个Activity界面内的操作 控件1TextView控件使用 控件2Button控件使用 1首先对于android的按键格式 2对按键监听事件进行绑定 控件3EditText文 ...

  4. 助力Android开发者(持续更新)

    文章目录 网络相关 网络请求 文件下载 图片相关 图片加载 图片编辑 储存相关 数据库 键值对 音视频相关 视频 音频 UI 事件总线 其他 网络相关 网络请求 RxHttp(支持Kotlin协程.内 ...

  5. android常用轮子(持续更新)

    一.快速开发框架 XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载.缓存.事件总线.权限管理.数据库.图片加载,基本都是项目中必用功能,每个模块 ...

  6. Android pm命令(持续更新中...)

    # adb shell pm uninstall -k --user 0 包名 //adb 删除系统应用 # adb shell am start -n 包名/包名.活动名 //adb运行apk # ...

  7. 分享大神的一些博文、视频、资料--持续更新

    心理学家 Ericsson 的研究发现:决定伟大水平和一般水平的关键因素,既不是天赋,也不是经验,而是[刻意练习]的程度. 教育最重要的不是灌输,而是引发思考.这样的话就没有必要按时间顺序,介绍很多细 ...

  8. android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)

    前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...

  9. Android系统兼容性问题(持续更新)

    相信开发过一段Android的都被Android中的兼容性问题给折腾过,有时这确实很无奈,Android被不同的厂商改的七零八落的.本文主要总结下本人在实际的项目开发过程中所遇到的兼容性问题,以及最后 ...

  10. Android常用开发网址(持续更新)

    2019独角兽企业重金招聘Python工程师标准>>> Android常用开发网址(持续更新) 环境搭建 android镜像 http://www.androiddevtools.c ...

最新文章

  1. 人脸识别门禁_门禁人脸识别系统铜陵县门禁人脸识别系统哪家好
  2. 8天学通MongoDB——第三天 细说高级操作
  3. 如何快速成长为技术大牛?
  4. 反射调用private或internal构造函数
  5. wchar_t*和string相互转换
  6. 数据结构与算法之暴力递归改动态规划
  7. Jlink commander、MCU GD32启动方式、Bootloader
  8. Linux技术学习路线图
  9. Docker安装及配置镜像加速器
  10. 数据库原理—数据库管理系统的功能和特点(四)
  11. 海量数据处理相关算法及数据结构【转】
  12. Interpreting and Disentangling Feature Components of Various Complexity from DNNS论文解读
  13. 不小心把Run Dashboard隐藏了多服务运行操作菜单找不到?springboot多服务快速启动窗口打开,按照这个办法完美解决!
  14. 信号与系统——初识信号的原理与分类
  15. ⭐❤️sqlite数据库使用大全❤️⭐
  16. 想要快速增肌?肌酸可以帮你高效获得肌肉和力量
  17. httpwatch初级使用
  18. opencv+ffmpeg+Qt h264录制
  19. Excel计算工作日的公式
  20. 李彦宏创业语录中我喜欢的几句

热门文章

  1. 计算机网络技术用苹果电脑,苹果电脑的硬盘能接到PC机上用吗?能用硬盘 – 手机爱问...
  2. 数据结构常见问题系列(二)
  3. 京东白条三道坎:“白条”如何吸金?
  4. 电影/电视剧/综艺/动漫/游戏 下载链接搜索引擎
  5. aruba无线ap认证服务器,Aruba无线AP及AC配置.doc
  6. 计算机网络知识点整理(笔试面试)
  7. SDU信息门户(8)组队和文件系统分析
  8. cuda编译错误 ptxas fatal : Unresolved extern function xxxx
  9. 06-08 无人机怎么拍摄VR全境图?
  10. 走进一心堂,读懂数字化转型新风向