虎牙安卓一面——凉

拒了目前唯一拿到的一个offer,心凉凉地,坚信自己能拿到更满意的,终于在假期期间圆之前的面试坑了

一面是在大学城的酒店,面试通知在我出去玩的时候接到的,当时就有一种预感反正我去了也不会过,所以带着一种消极的心态复习。第二天早起,去到大厅等候,我看我的序号就知道我是我们组第一个,唉,忐忑不安就去了

印象比较深刻的,主要还是针对你的简历来提问,上面有啥他感兴趣就问(我现在对面试官剩下的印象就是他穿着yy的t恤),所以一定要复习得比较细。针对你的项目里面用到的知识点,与之相关联的知识点也最好看看。下面是我印象比较深的回答不出来的或答得不怎么好的题目。

1、service是什么?在后台充当功能函数?(我用的是这样啊,可是被反问我就虚了)

复习可看博客

2、虚拟机的哪些对象可以被回收?

可达性分析算法

       在主流的JVM实现中,都是通过可达性分析算法来判定对象是否存活的。可达性分析算法的基本思想是:通过一系列被称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots对象没有任何引用链相连,就认为GC Roots到这个对象是不可达的,判定此对象为不可用对象,可以被回收。

  1.        

       在上图中,objectA、objectB、objectC是可达的,不会被回收;objectD、objectE虽然有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。

       在Java中,可作为GC Roots的对象包括下面几种:

       1、虚拟机栈中引用的对象;

       2、方法区中类静态属性引用的对象;

       3、方法区中常量引用的对象;

       4、本地方法栈中Native方法引用的对象。

3、Android插件化

建议可以看一下这篇博客,入门者可快速看懂。

4、apk主要包括什么

manifest.xml配置文件dex文件(相对于class文件被jvm执行并加载,dex是能被DVM或者Art虚拟机执行并且加载的文件格式),META签名加密文件三方包(例如:okhttp3这种),res资源文件resources.arsc(是由AAPT工具在打包过程中生成的,他本身是一个资源的索引表,里面维护者资源ID、Name、Path或者Value的对应关系,AssetManager通过这个索引表,就可以通过资源的ID找到这个资源对应的文件或者数据)。

5、gradle文件的编写

先了解gradle文件里面有什么,看https://blog.csdn.net/qq_22003641/article/details/79202966

6、哪些内容需要往manifest文件里写?

具体看https://blog.csdn.net/joychanger/article/details/51336809

7、Opengl

8、rxjava的作用

除了作为线程管理器,还可以对数据类型进行变换。

9、常见app推荐等功能顶部栏的实现

10、父进程和子进程之间的关系

参考博客:线程和进程、程序、应用程序之间的关系 - 言止予思 - 博客园  http://www.cnblogs.com/lisuyun/articles/3293580.html

看到一种说法是“一个程序至少有一个进程,一个进程至少有一个线程”,这种把程序与进程,进程与线程的关系混淆的说法是错误的。

程序(program)只能有一个进程,一个进程就是一个程序。有人说,我打开一个程序,比如chrome,有十多个进程呢,这是咋回事。那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU。对于用户而言,他们是一个整体,我们通常称之为应用程序(application)。对于计算机而言,一个进程就是一个程序,多个进程(比如一个浏览器的多个进程)对计算机而言就是多个不同的程序,它不会把它们理解为一个完整的“程序”。

其实进程之间的关系只有父子关系,没有主从关系,他们之间是并行独立的。但是线程之间是有主从关系的,而且他们共享的是同一个内存块(包括程序、数据和堆栈)。

打个比方,进程之间是父子关系,父进程fork子进程,就好比你养了个儿子。这个子进程会拷贝一份内存块,把程序和数据都复制过去,你儿子跟你长的也很像。但是一旦出生下来了,你们就是两个独立的个体,法律上都是平等的。子进程之后就完全独立了,父进程与子进程之间的关系,与其他进程的关系都是一样的,平等的,谁也管不着谁了,他们也只能采用进程间通信才能相互了解。父亲死了,儿子还活着;父进程over了,子进程可以照样活的好好的。(除非程序员认定有一个进程over了,其他进程没有存在的意义,比如浏览器负责渲染的进程如果down掉了,其他进程自动kill掉)。

但是进程的不同线程的关系可不是这样的。进程可以由多个线程组成,这称之为多线程程序,他们之间的关系就好比你的大脑与四肢和身体其他部分的关系一样。大脑就是主线程,其他部分就是子线程。子线程由主线程派生,而依附于主线程。主线程一旦over,进程就over了,其他子线程更是over了。他们的内存和数据都是同一份,没有进行隔离(既方便,也危险),不需要额外的通信函数。

父亲死了,儿子依旧活下去,你头断了,人还能活吗?

了解进程与线程的关系,就要了解他们的区别。一个计算机可以有多个进程,这称之为多任务,他们共享的是CPU,硬盘,打印机,显示器,但他们的内存是独立的,所以需要进程间通信,这是计算机发展的第一步。一个进程可以有多个线程,这称之为多线程,他们除了共享进程间的共享内容之外,还共享内存,这是计算机发展的第二步,主要是为了满足并行运算时共享数据,无需额外的通信。

所以正确的结论是:一个程序(program)就是一个正在执行的进程,而每个进程,可以是单线程的,也可以是多线程的。一个应用程序(application)通常由多个程序组成。

还是强调下程序(program)和应用程序(application)的区别。一个程序就是一个进程,永远不要说一个程序可能有多个进程。你打开一个应用程序(比如chrome),会有十多个进程,对于计算机而言,它们都是独立的。好比,父亲和儿子在外人看来是一家人,但是对于法律上来说,就是独立的法人。

总结来说,父进程和子进程相当于父子关系,分别是独立的两个个体,所以它们的生命周期互不相干;而子线程和主线程相当于同一个身体的各个部位之间的关系,头(相当于主线程)一旦over,其它子线程也对应over。

加上一道拒掉offer那家公司的逻辑题吧,当时只做出了一种做法,现在补上完整的解法:

有两个8升的水桶装满水和一个空的3升的水桶,平均将水分到4个容量大于4升的容器里,注意,倒入结果容器的水不可以再倒出来。

解题思路:因为3升是空的,那么以它为衡量基准的话,我们应该尽量多地分出1升的水到容器内。

猜你喜欢

转载自blog.csdn.net/cyanchen666/article/details/82926184