第一次Android面试惨痛经历及其总结

分享三天杭州面试经历,涉及Activity生命周期、SharedPreferences、OkHttp等知识点,从失败中汲取经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于…终于周五了
来杭州的第三天 经历了三天的残酷面试…
我就来写一下小结吧…提醒自己 也希望给大家增加点经验
在这里插入图片描述
首先第一家公司问了我很多基础的问题,但是!!!!!好吧,我承认自己是five(小声BB)…

1.谈谈activity的生命周期?

当时我第一反应,woc?送分题? 然后就巴拉巴拉说了一大堆,毕竟我还写了关于这个的文章呀!
《Android学习之浅谈Activity的生命周期》

但是他接下来的问题,我就有点懵逼了,那Aactivity转跳到Bactivity 它们的生命周期又是怎么样的呢?

我想也不难啊,首先Aactivity肯定执行OnCreate、OnStart、OnResume、OnPause、OnStop

然后Bactivity执行OnCreate、OnStart、OnResume

但是我这里犯了一个错误,OnStop的作用是,当你这个界面完全不可见时,才会执行

所以正确的应该是

Aactivity执行OnCreate、OnStart、OnResume、OnPause
Bactivity执行OnCreate、OnStart、OnResume后,Aactivity才执行OnStop

这时候,我能感觉到面试官对我有点失望。
在这里插入图片描述

2.听说你对数据存储比较了解,那你给我说说SharedPreferences的实现流程吧。

呵,尽管我有一道没回答好,这一道简单。
首先调用SharedPreferences对象的edit()方法获取一个SharedPreferences.editor对象…最后apply()方法将数据提交

面试官:说的挺详细,那你能给我说说apply()和commit()的区别吗?
我:??????what ???commit是什么??what’s this??两个单词长得不一样?

这时候,他轻咳了一声,我慌的一批。

后来查阅资料知晓,apply和commit的主要区别是:

apply是先将数据保存在内存中,然后再保存到磁盘上。
commit是直接保存到磁盘上

好吧,这时候他可能不想理我了。
在这里插入图片描述
3.说说okHttp吧。
这一次我回答的小心翼翼,生怕出点错。首先添加一个依赖库,之后创建一个okHttpClient实例,这时候如果要想发起一个http请求,就需要创建一个Request请求…

面试官:那你和我说说OkHttp的拦截吧。
我:(这时候我很坦然了)对不起(不会就先道歉),我对这个网络请求框架仅仅是了解,没有实际操作过。
面试官:那今天的面试就到这吧,你可以走了。面试的结果我们后期会通知你。
我:…谢谢

这里就不写相关的拦截器了,毕竟我也没搞懂(手动滑稽),这两天我会专门写一个关于网络请求的文章,和大家一起聊聊OKHttp。

这样第一天的面试就结束了(因为下午才到的杭州,所以就约了一个),其中还有什么多态的定义,单例模式,activity的启动模式什么的,都比较简单,就不说了。

--------------------------------------------------------------手动分隔符---------------------------------------------------------

Day2

昨晚把第一天面试不会的总结了一下,我觉得自己又行了!
在这里插入图片描述

但是第一家,刚上门就甩了一份面试题,全是基础的东西…
(yysy,算法这个东西很久没碰以后,真的忘的很快)

1.给你一个字符串,比如aabcdddef,求出出现三次的字符是什么?输出为e。(这题比较简单)

class Bubbling{
    public static void main(String[] args){

        String str1 = "aabcdddef";  

        char s = find(str1);

        System.out.println(s);

    }

    public static char find(String str1){

        int e = 0;

        char[] arr = str1.toCharArray();

        for (char c : arr) {
            for (char value : arr) {
                if (c == value) {
                    e++;
                }
                if (e == 3) {
                    return c;
                }
            }
            e = 0;
        }
        return 0;
    }
}

2.给你两个字符串,比如aadfcds和fcd,求出fcd第一次出现的位置。(kmp算法我给忘了…暴力匹配法走起)

关于kmp算法,我当时也写了一篇文章,感兴趣的可以去看看…

《kmp算法实现思路及其代码演示》

(还有几个我记不得了,反正挺简单的)

做完,提交上去。

面试官:你的笔试题做的比较差,你先回去吧,我们以后再联系。
我:…谢谢您。

当时的我真的很难受,因为我觉得自己大题写的还可以…但是选择、填空有很多二叉树相关的东西,我真的是忘了。(复习重点)

因为下午还有一个面试,住的地方也离得比较远,所以中午所幸不回去了。一个人走在大街上,前往下一个面试地点,感觉很迷茫,自己什么都不会。

在这里插入图片描述
Afternoon

下午面试的是一家初创公司,也是上来就先做一个笔试题。这一次我感觉做的比较不错,也都是些很基础的东西。

笔试完就开始和他们的技术主管开始聊,阿巴阿巴说了一大堆…然后和hr开始谈未来规划和薪资方面的一些东西,最后同意给我发offer。

(因为是初创公司,而且公司内部是没有人搞Android开发的,所以面试内容也没有什么营养,就不细说了)

但是我还有很多家面试(嘿嘿) 就委婉的说,能否通融几天,hr也是答应了。

--------------------------------------------------------------手动分隔符---------------------------------------------------------

Day3

今天早上这第一家公司就比较有意思了,必须要求上机测试,而且公司在一家工厂里。

按流程先填完一张表,然后由一个技术人员领我到一个电脑前,说题目就在桌面,你自己找。(感觉态度比较差)
我:???
大丈夫能屈能伸,我先瞄一眼题。
在这里插入图片描述

emmmm 看到这道题,我思考了一会,然后…你以为我要开始敲代码了?错,我站了起来!信誓旦旦的说了句:对不起,我不会,打扰了!

我能感觉到整个团队惊愕的眼神。后来也在boss上给他们的经理发了个:本人技术有限,实在不好意思。

其实这个项目,真要做我也是可以做出来的。后来自己写了个,上传到了github,有兴趣的小伙伴可以去看下

Send a text message

但是掉头就走,主要有下面两个原因吧:

  1. 接待人员态度不是很好…(emmm,内心就是这么脆弱),而且公司在一个工厂内…接受不了
  2. 可能是自己想得比较多…为什么一定要按ui给的图画…我是来白打工的??(第一次遇到这种面试…没经验…也不知道这种是不是常态化)

就这样,我刷新了我人生中的一项记录:面试最短时间 5min。

其实这次面试完,心情还算不错的,可能是有offer在手了?

在这里插入图片描述

Afternoon

下午来的这一家,在一个挺大的园区。光找公司地址就在园区逛了差不多十分钟…(当然也怪我路痴)
ps:大家一定要学会做时间管理大师…不然之前一个面试完事了,下一个面试要等好久。

首先也是填一张表,然后一个漂亮hr小姐姐带我去一个小房间谈话。主要是聊一些关于生活、学习上的东西,得知我喜欢在csdn上写文章,给我写上了一个热爱学习的标签。我???整个谈话流程还是比较舒服的(可能人家小姐姐长得好看?)接下来就是技术面。

一个穿着人字拖,手拿MacBook的中年大叔就向我走来了,我当时内心的想法是
在这里插入图片描述
也是常规的先问了一下activity的生命周期啥的,一大堆基本的东西。然后就开始针对我的简历进行询问,比如知道哪些主流框架等等。

但是很大一部时间,他都在看我的CSDN博客(嘿嘿,多写点文章还是有用的),根据我的文章问一些问题(可能是想确定是不是我写的?)最后还根据我上传到github上的项目进行了一些相关的问答,老老实实说出来就好了。

但是我知道自己有一个缺点:项目经验不足。所以当他说出这点时,我的心里凉了半截。最后面试完,还是常规的回去等通知。

晚上在地铁上收到了hr发来的信息
在这里插入图片描述

耶,第二个offer到手。

--------------------------------------------------------------手动分隔符---------------------------------------------------------

终于到周末了,也可以有时间总结一下了(毕竟写博客真的耗时间)。

自身不足:

  1. 基础掌握的还可以,但是细枝末节有待修整。
  2. 对主流框架仅仅只是了解,这一点不够的。
  3. 项目经验不足。

刚好花两天的时间来提升下自己。

这就是我第一阶段面试的全部经历和总结啦~ 希望能帮助到大家

大家如果有什么疑惑,也可以积极给我留言呀!我一定会尽力帮助你们~ 一同成长!

好的!以下是十个常见的 C 语言面试及其简要解析: --- ### **1. 解释一下指针的概念以及它的用途是什么?** **答:** 指针是一个变量,它存储的是另一个变量的内存地址而不是其值本身。通过使用指针可以提高程序效率、减少内存占用,并支持动态内存分配等操作。 --- ### **2. 动态内存分配有哪些函数?它们的区别是什么?** **答:** 常见的动态内存分配函数有 `malloc()` 和 `calloc()` 等。 - `malloc(size)` 分配指定大小的连续空间并返回指向该块首地址的指针;未初始化内容。 - `calloc(n, size)` 分配 n 个元素,每个大小为 size 的连续空间,并将所有字节初始化为零。 区别在于是否自动清零及参数形式的不同。 --- ### **3. 结构体(struct)和联合体(union)之间有什么区别?** **答:** 结构体会为每一个成员单独分配内存区域,而联合体内存共享——即所有的成员共用一块固定的内存区间,在任一时刻只能保存其中一个成员的数据值。此外两者的访问方式基本一致但意义完全不同。 --- ### **4. 静态局部变量(static local variable)有何特点?** **答:** 它们只会在第一次运行到定义处时初始化一次之后便一直保持上次结束后的状态直到整个进程销毁为止。这意味着静态局部变数在其生存期内保留了最近更新过的数值而非每次进入作用范围都重新设置默认初值0或者其他预设值。 --- ### **5. 内部链接(internal linkage),外部链接(external linkage)分别代表什么意思? 给出例子说明两者差异在哪里。** **答:** 如果某个标识符声明成`static`,那么这个ID就具备内部连接属性意味着仅限于当前源文件可见不可被其他翻译单元引用;反之无此修饰词则拥有全局级别外联性质允许跨文间互相参照. 示例如下: ```c //file_a.c int globalVar = 10;//External Linkage void func(){ static int localVar=9; } ``` 上述代码片段里globalVar对外公开可供其它模块利用,localVar局限于此func()内部独享. --- ### **6. 为什么说数组名本质上就是一个常量指针呢 ? 能否对它赋新址吗?如果不能又该如何改变所指向的内容位置呢?** **答:** 数组名字实际上是指向第一个元素的一个固定地址因此不可以直接更改成为新的目标地址然而我们可以通过计算偏移量间接调整有效读取的位置比如&arr[1]表示从第二个开始计数依次往后递增以此类推形成类似效果达到目的. --- ### **7. sizeof运算符的工作机制如何理解? 对比普通数字与字符串这两种情况下的结果含义会有哪些变化吗?** **答**: `sizeof`用于测定表达式或者类型占有的比特位宽单位转换成八进制后得到相应字节数目反映实际储存容量需求状况之下对于整型实数字符等各种基础数据类型的测量均按系统架构规格设定标准予以回报至于涉及到复合实体像struct之类的情形,则综合考虑其中包含的所有成分共同确定总体规模当处理串列的时候由于末端终止符'\0'的存在故整体长度必然超出单纯统计字符数目所得数额之外还需要额外预留一位作为标志用途体现出来最终呈现出来的具体数字可能会有所不同视具体情况定夺罢了! --- ### **8. 文件包含(#include)指令背后发生的具体过程包括哪几个阶段步骤组成?是否存在潜在风险隐患需要注意规避之处么?** **答:** 包含头文档其实就是一种文本嵌套替换动作简单来说就是把指定路径下面找到的目标件全文照搬粘贴过来融合为一体然后继续往下分析编译下去而已不过这样一来确实容易引发一些循环依赖问题导致混乱不堪另外也可能因为不小心引入过多无关紧要的信息增加不必要的负担所以应当谨慎挑选必需品尽量避免滥用以免影响性能表现带来不良后果. --- ### **9. 函数调用栈帧(stack frame)是如何构建起来并且维护下来的?举例阐明递归场景下一个典型的压栈弹栈序列应该是怎样的模样样子才合理合规符合预期期望呢?** **答:** 当主叫方发起请求准备跳转至别处执行任务之前先把自己的私人物品妥善存放好诸如返回点地址寄存器暂存信息等等接着腾出手来接纳对方传递过来的实际参量按照既定规则排列整齐摆放到合适的地方等待接收者前来领取完毕再正式启程前往异地一旦完成使命归来之际再逐层剥离恢复原来的状态直至回到起点至此圆满落幕期间若有自我召唤情形出现同样遵守以上原则只不过需要不断重复累积叠加形成树状分支结构而已形如下图所示示意流程大概长这样: 假设有这么一段伪码演示递归阶乘计算: ```c unsigned long factorial(int x){ if(x <=1 ) return 1 ; else{ unsigned long result=factorial (x -1)*x ; return result ;}} ``` 对应的可能栈布局模拟草图为: ``` factorial(5) |------| |x:5 |retval=?| |-----| factorial(4) ... factorial(1)->Base Case Found! Return Value Back Upwards Step By Step Until Root Level Reached Again! ``` --- ### **10. 栈(Stack)堆(heap)之间的根本差别体现在哪里方面上最为显著突出值得关注探讨一番值得深究探究一番呢???** **答:** 主要是生命周期管理方面的策略存在本质区别具体而言前者由操作系统内核负责实时调控属于短暂临时性的短期记忆仓库后者则是程序员自行掌控长期使用的持久化资源库二者相互独立互不影响但是都需要精心策划巧妙安排才能充分发挥各自的优势同时也要警惕可能出现的各种边界条件限制防止越界溢出等问题的发生给应用程序带来致命打击造成难以挽回的巨大损失教训惨痛务必小心防范才是正道啊亲! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值