百度项目手机网络运营商商有哪些

版权声明:本文为博主原创文章,首发简书。未经博主允许不得转载。

本文是百度2020上半年网友分享以及我个人收录的面试真题大全。并且花了大量时间为大家寻找到了最佳的答案解析。希望可以收到帮助到大家。喜欢的朋友可以点个赞支持一下,谢谢。

BATJ大厂面试真题收录大全PDF电子书已上传在:【】需要的小伙伴自取就好了。别忘了给文章点个赞~

1.1启动优化是怎么做的?

在某一个版本之后呢,我们会发现这个启动速度变得特别慢,同时用户给我们的反馈也越来越多,所以,我们开始考虑对应用的启动速度来进行优化。然后,我们就对启动的代码进行了代码层面的梳理,我们发现应用的启动流程已经非常复杂,接着,我们通过一系列的工具来确认是否在主线程中执行了太多的耗时操作。

我们经过了细查代码之后,发现应用主线程中的任务太多,我们就想了一个方案去针对性地解决,也就是进行异步初始化。 然后,我们还发现了另外一个问题,也可以进行针对性的优化,就是在我们的初始化代码当中有些的优先级并不是那么高,它可以不放在Application的onCreate中执行,而完全可以放在之后延迟执行的,因为我们对这些代码进行了延迟初始化,最后,我们还结合了idealHandler做了一个更优的延迟初始化的方案,利用它可以在主线程的空闲时间进行初始化,以减少启动耗时导致的卡顿现象。做完这些之后,我们的启动速度就变得很快了。
最后,我简单说下我们是怎么长期来保持启动优化的效果的。首先,我们做了我们的启动器,并且结合了我们的CI,在线上加上了很多方面的监控。

1.2是怎么异步的,异步遇到问题没有?

我们最初是采用的普通的一个异步的方案,即new Thread + 设置线程优先级为后台线程的方式在Application的onCreate方法中进行异步初始化,后来,我们使用了线程池、IntentService的方式,但是,在我们应用的演进过程当中,发现代码会变得不够优雅,并且有些场景非常不好处理,比如说多个初始化任务直接的依赖关系,比如说某一个初始化任务需要在某一个特定的生命周期中初始化完成,这些都是使用线程池、IntentService无法实现的。所以说,我们就开始思考一个新的解决方案,它能够完美地解决我们刚刚所遇到的这些问题。
这个方案就是我们目前所使用的启动器,在启动器的概念中,我们将每一个初始化代码抽象成了一个Task,然后,对它们进行了一个排序,根据它们之间的依赖关系排了一个有向无环图,接着,使用一个异步队列进行执行,并且这个异步队列它和CPU的核心数是强烈相关的,它能够最大程度地保证我们的主线程和别的线程都能够执行我们的任务,也就是大家几乎都可以同时完成。

1.3启动优化有哪些容易忽略的注意点?

首先,在CPU Profiler和Systrace中有两个很重要的指标,即cpu time与wall time,我们必须清楚cpu time与wall time之间的区别,wall time指的是代码执行的时间,而cpu time指的是代码消耗CPU的时间,锁冲突会造成两者时间差距过大。我们需要以cpu time来作为我们优化的一个方向。
其次,我们不仅只追求启动速度上的一个提升,也需要注意延迟初始化的一个优化,对于延迟初始化,通常的做法是在界面显示之后才去进行加载,但是如果此时界面需要进行滑动等与用户交互的一系列操作,就会有很严重的卡顿现象,因此我们使用了idealHandler来实现cpu空闲时间来执行耗时任务,这极大地提升了用户的体验,避免了因启动耗时任务而导致的页面卡顿现象。
最后,对于启动优化,还有一些黑科技,首先,就是我们采用了类预先加载的方式,我们在MultiDex.install方法之后起了一个线程,然后用Class.forName的方式来预先触发类的加载,然后当我们这个类真正被使用的时候,就不用再进行类加载的过程了。同时,我们再看Systrace图的时候,有一部分手机其实并没有给我们应用去跑满cpu,比如说它有8核,但是却只给了我们4核等这些情况,然后,有些应用对此做了一些黑科技,它会将cpu的核心数以及cpu的频率在启动的时候去进行一个暴力的提升。

1.4版本迭代导致的启动变慢有好的解决方式吗?

这种问题其实我们之前也遇到过,这的确非常难以解决。但是,我们后面对此进行了反复的思考与尝试,终于找到了一个比较好的解决方式。

首先,我们使用了启动器去管理每一个初始化任务,并且启动器中每一个任务的执行都是被其自动进行分配的,也就是说这些自动分配的task我们会尽量保证它会平均分配在我们每一个线程当中的,这和我们普通的异步是不一样的,它可以很好地缓解我们应用的启动变慢。

其次,我们还结合了CI,比如说,我们现在限制了一些类,如Application,如果有人修改了它,我们不会让这部分代码合并到主干分支或者是修改之后会有一些内部的工具如邮件的形式发送到我,然后,我就会和他确认他加的这些代码到底是耗时多少,能否异步初始化,不能异步的话就考虑延迟初始化,如果初始化时间太长,则可以考虑是否能进行懒加载,等用到的时候再去使用等等。

然后,我们会将问题尽可能地暴露在上线之前。同时,我们真正已经到了线上的一个环境下时,我们进行了监控的一个完善,我们不仅是监控了App的整个的启动时间,同时呢,我们也将每一个生命周期都进行了一个监控。比如说Application的onCreate与onAttachBaseContext方法的耗时,以及这两个生命周期之间间隔的时间,我们都进行了一个监控,如果说下一次我们发现了这个启动速度变慢了,我们就可以去查找到底是哪一个环节变慢了,我们会和以前的版本进行对比,对比完成之后呢,我们就可以来找这一段新加的代码。

1.5如何避免内存抖动?(代码注意事项)

内存抖动是由于短时间内有大量对象进出新生区导致的,它伴随着频繁的GC,gc会大量占用ui线程和cpu资源,会导致app整体卡顿。

避免发生内存抖动的几点建议:
尽量避免在循环体内创建对象,应该把对象创建移到循环体外。
注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
当需要大量使用Bitmap的时候,试着把它们缓存在数组或容器中实现复用。
对于能够复用的对象,同理可以使用对象池将它们缓存起来。

1.6你在做布局优化的过程中用到了哪些工具?

我在做布局优化的过程中,用到了很多的工具,但是每一个工具都有它不同的使用场景,不同的场景应该使用不同的工具。下面我从线上和线下两个角度来进行分析。

比如说,我要统计线上的FPS,我使用的就是Choreographer这个类,它具有以下特性:
1、能够获取整体的帧率。
2、能够带到线上使用。
3、它获取的帧率几乎是实时的,能够满足我们的需求。

同时,在线下,如果要去优化布局加载带来的时间消耗,那就需要检测每一个布局的耗时,对此我使用的是AOP的方式,它没有侵入性,同时也不需要别的开发同学进行接入,就可以方便地获取每一个布局加载的耗时。如果还要更细粒度地去检测每一个控件的加载耗时,那么就需要使用LayoutInflaterCompat.setFactory2这个方法去进行Hook。
此外,我还使用了LayoutInspector和Systrace这两个工具,Systrace可以很方便地看到每帧的具体耗时以及这一帧在布局当中它真正做了什么。而LayoutInspector可以很方便地看到每一个界面的布局层级,帮助我们对层级进行优化。

1.7布局为什么会导致卡顿,你又是如何优化的?

分析完布局的加载流程之后,我们发现有如下四点可能会导致布局卡顿:
1、首先,系统会将我们的Xml文件通过IO的方式映射的方式加载到我们的内存当中,而IO的过程可能会导致卡顿。
2、其次,布局加载的过程是一个反射的过程,而反射的过程也会可能会导致卡顿。
3、同时,这个布局的层级如果比较深,那么进行布局遍历的过程就会比较耗时。
4、最后,不合理的嵌套RelativeLayout布局也会导致重绘的次数过多。

对此,我们的优化方式有如下几种:

1、针对布局加载Xml文件的优化,我们使用了异步Inflate的方式,即AsyncLayoutInflater。它的核心原理是在子线程中对我们的Layout进行加载,而加载完成之后会将View通过Handler发送到主线程来使用。所以不会阻塞我们的主线程,加载的时间全部是在异步线程中进行消耗的。而这仅仅是一个从侧面缓解的思路。
2、后面,我们发现了一个从根源解决上述痛点的方式,即使用X2C框架。它的一个核心原理就是在开发过程我们还是使用的XML进行编写布局,但是在编译的时候它会使用APT的方式将XML布局转换为Java的方式进行布局,通过这样的方式去写布局,它有以下优点:1、它省去了使用IO的方式去加载XML布局的耗时过程。2、它是采用Java代码直接new的方式去创建控件对象,所以它也没有反射带来的性能损耗。这样就从根本上解决了布局加载过程中带来的问题。
3、然后,我们可以使用ConstraintLayout去减少我们界面布局的嵌套层级,如果原始布局层级越深,它能减少的层级就越多。而使用它也能避免嵌套RelativeLayout布局导致的重绘次数过多。
4、最后,我们可以使用AspectJ框架(即AOP)和LayoutInflaterCompat.setFactory2的方式分别去建立线下全局的布局加载速度和控件加载速度的监控体系。

1.8你是怎么做卡顿优化的?

从项目的初期到壮大期,最后再到成熟期,每一个阶段都针对卡顿优化做了不同的处理。各个阶段所做的事情如下所示:
1、系统工具定位、解决
2、自动化卡顿方案及优化
3、线上监控及线下监测工具的建设

我做卡顿优化也是经历了一些阶段,最初我们的项目当中的一些模块出现了卡顿之后,我是通过系统工具进行了定位,我使用了Systrace,然后看了卡顿周期内的CPU状况,同时结合代码,对这个模块进行了重构,将部分代码进行了异步和延迟,在项目初期就是这样解决了问题。但是呢,随着我们项目的扩大,线下卡顿的问题也越来越多,同时,在线上,也有卡顿的反馈,但是线上的反馈卡顿,我们在线下难以复现,于是我们开始寻找自动化的卡顿监测方案,其思路是来自于Android的消息处理机制,主线程执行任何代码都会回到Looper.loop方法当中,而这个方法中有一个mLogging对象,它会在每个message的执行前后都会被调用,我们就是利用这个前后处理的时机来做到的自动化监测方案的。同时,在这个阶段,我们也完善了线上ANR的上报,我们采取的方式就是监控ANR的信息,同时结合了ANR-WatchDog,作为高版本没有文件权限的一个补充方案。在做完这个卡顿检测方案之后呢,我们还做了线上监控及线下检测工具的建设,最终实现了一整套完善,多维度的解决方案。

1.9 你是怎么样自动化的获取卡顿信息?

我们的思路是来自于Android的消息处理机制,主线程执行任何代码它都会走到Looper.loop方法当中,而这个函数当中有一个mLogging对象,它会在每个message处理前后都会被调用,而主线程发生了卡顿,那就一定会在dispatchMessage方法中执行了耗时的代码,那我们在这个message执行之前呢,我们可以在子线程当中去postDelayed一个任务,这个Delayed的时间就是我们设定的阈值,如果主线程的messaege在这个阈值之内完成了,那就取消掉这个子线程当中的任务,如果主线程的message在阈值之内没有被完成,那子线程当中的任务就会被执行,它会获取到当前主线程执行的一个堆栈,那我们就可以知道哪里发生了卡顿。

经过实践,我们发现这种方案获取的堆栈信息它不一定是准确的,因为获取到的堆栈信息它很可能是主线程最终执行的一个位置,而真正耗时的地方其实已经执行完成了,于是呢,我们就对这个方案做了一些优化,我们采取了高频采集的方案,也就是在一个周期内我们会多次采集主线程的堆栈信息,如果发生了卡顿,那我们就将这些卡顿信息压缩之后上报给APM后台,然后找出重复的堆栈信息,这些重复发生的堆栈大概率就是卡顿发生的一个位置,这样就提高了获取卡顿信息的一个准确性。

1.11移动端获取网络数据优化的几个点

2、请求合并:即将多个请求合并为一个进行请求,比较常见的就是网页中的CSS Image Sprites。如果某个页面内请求过多,也可以考虑做一定的请求合并。
3、减少请求数据的大小:对于post请求,body可以做gzip压缩的,header也可以做数据压缩(不过只支持http 2.0)。
返回数据的body也可以做gzip压缩,body数据体积可以缩小到原来的30%左右(也可以考虑压缩返回的json数据的key数据的体积,尤其是针对返回数据格式变化不大的情况,支付宝聊天返回的数据用到了)。
4、根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多)。
5、使用HttpDNS优化DNS:DNS存在解析慢和DNS劫持等问题,DNS 不仅支持 UDP,它还支持 TCP,但是大部分标准的 DNS 都是基于 UDP 与 DNS 服务器的 53 端口进行交互。HTTPDNS 则不同,顾名思义它是利用 HTTP 协议与 DNS 服务器的 80 端口进行交互。不走传统的 DNS 解析,从而绕过运营商的 LocalDNS 服务器,有效的防止了域名劫持,提高域名解析的效率。

1.12关于网络优化可参照百度APP网络优化


这是因为在客户端中,加载H5页面之前,需要先初始化WebView,在WebView完全初始化完成之前,后续的界面加载过程都是被阻塞的。

优化手段围绕着以下两个点进行:
加载WebView的同时,请求H5页面数据。

客户端代理页面请求。WebView初始化完成后向客户端请求数据。
asset存放离线包。

除此之外还有一些其他的优化手段:
脚本执行慢,可以让脚本最后运行,不阻塞页面解析。
DNS链接慢,可以让客户端复用使用的域名与链接。
React框架代码执行慢,可以将这部分代码拆分出来,提前进行解析。

为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。

你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。

另外一个非常耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。

如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。

1.16TraceView的实现原理,分析数据误差来源。

2.1View的事件分发机制?滑动冲突怎么解决?

触摸事件对应的是MotionEvent类,事件的类型主要有如下三种:
View事件分发本质就是对MotionEvent事件分发的过程。即当一个MotionEvent发生后,系统将这个点击事件传递到一个具体的View上。

注意:在Android系统中,拥有事件传递处理能力的类有以下三种:
Activity:拥有分发和消费两个方法。
ViewGroup:拥有分发、拦截和消费三个方法。
View:拥有分发、消费两个方法。

2.2如何解决View的事件冲突?

对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。
对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部View拦截事件,何时由内部View拦截事件。
对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。

外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的onInterceptTouchEvent方法,在内部做出相应的拦截。
内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。具体方法:需要配合requestDisallowInterceptTouchEvent方法。

2.4Android中进程和线程的关系?区别?

  • 线程是CPU调度的最小单元,同时线程是一种有限的系统资源;而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。
  • 一般来说,一个App程序至少有一个进程,一个进程至少有一个线程(包含与被包含的关系),通俗来讲就是,在App这个工厂里面有一个进程,线程就是里面的生产线,但主线程(即主生产线)只有一条,而子线程(即副生产线)可以有多个。
  • 进程有自己独立的地址空间,而进程中的线程共享此地址空间,都可以并发执行。

2.5为何需要IPC?多进程通信可能会出现的问题?

所有运行在不同进程的四大组件(Activity、Service、Receiver、ContentProvider)共享数据都会失败,这是由于Android为每个应用分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这会导致在不同的虚拟机中访问同一个类的对象会产生多份副本。比如常用例子(通过开启多进程获取更大内存空间、两个或者多个应用之间共享数据、微信全家桶)。

一般来说,使用多进程通信会造成如下几方面的问题:

  • 静态成员和单例模式完全失效:独立的虚拟机造成。
  • 线程同步机制完全失效:独立的虚拟机造成。
  • SharedPreferences的可靠性下降:这是因为Sp不支持两个进程并发进行读写,有一定几率导致数据丢失。
  • Application会多次创建:Android系统在创建新的进程时会分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程,自然也会创建新的Application。

为什么选用Binder,在讨论这个问题之前,我们知道Android也是基于Linux内核,Linux现有的进程通信手段有以下几种:

  • 管道:在创建时分配一个page大小的内存,缓存区大小比较有限;
  • 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  • 共享内存:无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  • 套接字:作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通信;
  • 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

既然有现有的IPC方式,为什么重新设计一套Binder机制呢。主要是出于以上三个方面的考量:

  • 1、效率:传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。从Android进程架构角度分析:对于消息队列、Socket和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝,如图:

而对于Binder来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程,如图:

共享内存不需要拷贝,Binder的性能仅次于共享内存。

  • 2、稳定性:上面说到共享内存的性能优于Binder,那为什么不采用共享内存呢,因为共享内存需要处理并发同步问题,容易出现死锁和资源竞争,稳定性较差。Socket虽然是基于C/S架构的,但是它主要是用于网络间的通信且传输效率较低。Binder基于C/S架构 ,Server端与Client端相对独立,稳定性较好。
  • 3、安全性:传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Binder机制为每个进程分配了UID/PID,且在Binder通信时会根据UID/PID进行有效性检测。

Binder机制的作用和原理?

Linux系统将一个进程分为用户空间和内核空间。对于进程之间来说,用户空间的数据不可共享,内核空间的数据可共享,为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的,这就需要跨进程之间的数据通信方式。普通的跨进程通信方式一般需要2次内存拷贝,如下图所示:

一次完整的 Binder IPC 通信过程通常是这样:

  • 首先 Binder 驱动在内核空间创建一个数据接收缓存区。
  • 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系。
  • 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

  • Binder驱动(如同路由器):负责进程之间binder通信的建立,计数管理以及数据的传递交互等底层支持。

最后,结合 的总结图来综合理解一下:

2.7AMS家族重要术语解释。

2.9广播发送和接收的原理了解吗?

2.通过AIDL工具处理AIDL文件,生成相应的Java文件。
4.通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex,该过程主要完成Java字节码转换成Dalvik字节码,压缩常量池以及清除冗余信息等工作。
5.通过ApkBuilder工具将资源文件、DEX文件打包生成APK文件。
7.如果是正式版的APK,还会利用ZipAlign工具进行对齐处理,对齐的过程就是将APK文件中所有的资源文件距离文件的起始距位置都偏移4字节的整数倍,这样通过内存映射访问APK文件的速度会更快,并且会减少其在设备上运行时的内存占用。

2.11说下安卓虚拟机和java虚拟机的原理和不同点?

3.Android优秀三方库源码及架构设计


3.2为什么要在项目中使用OKHTTP这个库?

1.OkHttp 提供了对最新的 HTTP 协议版本 HTTP/2 和 SPDY 的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。
2.如果 HTTP/2 和 SPDY 不可用,OkHttp 会使用连接池来复用连接以提高效率。
3.OkHttp 提供了对 GZIP 的默认支持来降低传输内容的大小。
4.OkHttp 也提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求。
5.当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址。

3.3OKhttp针对网络层有哪些优化?

3.4网络请求缓存处理,okhttp如何处理网络缓存的?

3.5从网络加载一个10M的图片,说下注意事项?

支持多种数据的解析 & 序列化格式
通过注解配置网络请求参数
采用大量设计模式简化使用

1、多样化媒体加载:不仅可以进行图片缓存,还支持Gif、WebP、缩略图,甚至是Video。
2、通过设置绑定生命周期:可以使加载图片的生命周期动态管理起来。
3、高效的缓存策略:支持内存、Disk缓存,并且Picasso只会缓存原始尺寸的图片,内Glide缓存的是多种规格,也就是Glide会根据你ImageView的大小来缓存相应大小的图片尺寸。
4、内存开销小:默认的Bitmap格式是RGB_565格式,而Picasso默认的是ARGB_8888格式,内存开销小一半。

3.9Glide源码机制的核心思想:

activeResources来盛放项目中正在使用的资源。Lrucache中不含有正在使用的资源。资源内部有个计数器来显示自己是不是还有被引用的情况,把正在使用的资源和没有被使用的资源分开有什么好处呢??因为当Lrucache需要移除一个缓存时,会调用resource.recycle()方法。注意到该方法上面注释写着只有没有任何consumer引用该资源的时候才可以调用这个方法。那么为什么调用resource.recycle()方法需要保证该资源没有任何consumer引用呢?glide中resource定义的recycle()要做的事情是把这个不用的资源(假设是bitmap或drawable)放到bitmapPool中。bitmapPool是一个bitmap回收再利用的库,在做transform的时候会从这个bitmapPool中拿一个bitmap进行再利用。这样就避免了重新创建bitmap,减少了内存的开支。而既然bitmapPool中的bitmap会被重复利用,那么肯定要保证回收该资源的时候(即调用资源的recycle()时),要保证该资源真的没有外界引用了。这也是为什么glide花费那么多逻辑来保证Lrucache中的资源没有外界引用的原因。

3.10Glide内存缓存如何控制大小?

3.11加载bitmap过程(怎样保证不产生内存溢出)

3.12Bitmap如何处理大图,如一张30M的大图,如何预防OOM?

1、(最主要区别)View与Model并不直接交互,而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互。
2、Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。

V已经隔离了,方便测试了,但代码还不够优雅简洁,所以 MVVM 就弥补了这些缺陷。在 MVVM 中就出现的 Data Binding 这个概念,意思就是 View 接口的 showData 这些实现方法可以不写了,通过 Binding 来实现。

3.17MVP如何管理Presenter的生命周期,何时取消网络请求?

3.20从0设计一款App整体架构,如何去做?

3.21实现一个库,完成日志的实时上报和延迟上报两种功能,该从哪些方面考虑?

3.22你最优秀的工程设计项目,是怎么设计和实现的;扩展,如何做成一个平台级产品?


4.3低版本SDK如何实现高版本api?

4.5RecyclerView和ListView有什么区别?局部刷新?前者使用时多重type场景下怎么避免滑动卡顿。懒加载怎么实现,怎么优化滑动体验。

4.6说说谷歌新推出的Room架构。

4.8android文件存储,各版本存储位置的权限控制的演进,外部存储,内部存储

4.10下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复

4.11Android程序运行时权限与文件系统权限

4.6如何在整个系统层面实现界面的圆角效果。(即所有的APP打开界面都会是圆角)

4.8如何解决git冲突?

4.9单元测试有没有做过,说说熟悉的单元测试框架?

4.10对文件描述符怎么理解?

4.11如何实现进程安全写文件?

4.14flutter了解吗?内部是如何实现跨平台的?如何实现多Native页面接入?如何实现对现有工程的flutter迁移?

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

BATJ大厂面试真题收录大全PDF电子书已上传在:【】需要的小伙伴自取就好了。别忘了给文章点个赞~

}

1华为云面向政企客户发布智能工作平台Welink,进军企业IM市场

2、申通正全面迁上阿里云,将成为首个全面上云的快递企业

3、奇安信成为北京冬奥会官方网络安全服务和杀毒软件赞助商

4、浪潮,一经查实,将立刻删除涉嫌侵权内容。

}

终于来更新我的笔试面试真题啦!希望这篇文章对你有所帮助!

二、互联网暑期实习真题

(一)百度 c++研发工程师

(三)华为 运营商-服务与软件研发管理部

(四)美团 后端开发

(五)字节跳动 新业务 后端开发 内推无笔试

(六)拼多多 开发

(一)华为优招 运营商-服务与软件研发管理部

(二)字节跳动 新业务 后端开发 转正答辩

(三)商汤、携程、阿里、腾讯、美团、小米、百度

(一)中国银行 信科类管培生

(二)农业银行 总行理工类培训生/北研软开第二批

(三)工商银行 牡丹卡中心科技菁英

(四)建设银行 总行数字化建设委员会办公室

(五)国家开发银行 总行信科岗(面试调剂到信贷岗)

(六)进出口银行 总行信息科技类

 正文从这里开始~

我本科和硕士都是北航的,通信专业,研究方向是雷达信号处理,成绩的话还行,研究生期间做的学生工作比较多。

刚开始的目标是互联网的后端开发工程师

非科班所以比较难,基础知识都是平时自学,再加刷题,运气比较好,拿到了互联网的offer。后来感觉互联网不太适合自己,投了许多银行,也拿到了offer。

本篇文章仅分享自己的真题,想了解其他相关经历,可以看我这篇文章——~

二、互联网暑期实习真题

(一)百度 c++研发工程师

1)找1-n之间的两个数的最小公倍数和最大公约数之差最大 注意longlong

测评:性格测试+限时言语理解

2)项目相关(用图像、机器学习么,我说看过论文可以用,但我们是做传统检测的)

3)多态,分别举几个例子,有什么好处

5)排序算法 介绍拓扑排序 堆排序

8)BFS说思路,给二叉树的图讲

1)算法题 乱序数组,奇数排前,偶数排后

3)TCP UDP区别,UDP丢包么,TCP丢包么,如果一个路由器接收到一个超时的包,会怎么办

4)进程间通信,套接字说一下(我不会)那信号呢(我不会,信号量吧)好,说吧

5)虚拟地址解决了什么问题

6)数据库,范式说一下,一般用到第几范式

8)select时间很长,如何检测很长

9)设计模式了解过么(没细看,大概知道几种)说吧(balabala,观察者模式看过一个例子)讲讲这个例子吧,用了观察者模式有什么好处?

10)然后看简历,讲了一下项目

11)反问(秋招没有c++项目是不是比较吃亏?)面试官说,也不是,主要还是操作系统,网络,数据库那些,得学好

CDG广告部 开发工程师

4.9 一面(提前批)

2)按照简历自我介绍,因项目不相关,没深入问

你怎么实现new,就是如何实现自动分配内存大小吧

描述内存分配方式以及区别(静态存储区域,栈,堆)哪个是系统分的,哪个是程序员分的

 二叉树,层次遍历,每行输出一层。

TEG-AI平台部 开发工程师

4.26 笔试(正式批)巨难 题目忘记了

 二分查找 找到目标数字的最后一个位置(要优化)

4)反问(秋招 项目或实习看重么)无所谓,没经验也不代表你差

1)c++:stl 排序 进程线程及各种通信方式 共享私有的资源 多态,虚函数,继承的虚析构函数 内存碎片,内部碎片和外部碎片

3)算法题:链表有环 和 树的层次遍历

4)平衡二叉树 map和排序map,哈希表冲突

5)vector2倍扩充;clear底层操作;高效插入大量数据

7)大量数据,找出现次数最多的100个字符

(三)华为 运营商-服务与软件研发管理部

1)投票,一串名字,统计票数,难点是输入

3)求栈上函数调用的最长时间

1)个人及项目简介(说我没C++项目,很吃亏)

3)冒泡 快排;链表和数组对比

5)数据库事务 典型场景;TCP/IP

6)平时研究遇到什么问题

7)手写代码:温度序列,输出第几天后温度升高

聊的很开心,去了可能得转java,说c++现在面很少了。我问面试官,美国限制华为,对你们部门影响大么,这个部门是做什么大数据,还有数据流监控之类的,也会开发一些上层的app,影响不大,对高端的5g手机,5g终端,影响挺大的

(四)美团 后端开发

1)n个学生m门课,问给几个人发第一名的奖

2)循环小数的循环长度

3)n个数,组成n方个数对,找第k小的

4)让一组数中某个数是中位数,需要在前还是后加几个数

5)两个字符串,第一个取子串,第二个取子序列,对应有多少种

4.21一面 牛客面试

1)自我介绍,没问项目,问通信的为什么想要来互联网

3)函数的参数传递,值传递和地址传递

4)数组和链表的区别,怎么存储

5)OSI七层结构是什么

7)算法题:牛客网真题

(五)字节跳动 新业务 后端开发 内推无笔试

5.12 14:00-19:30连续面试三场(所以很多题目记不清了,见谅)

2)面向对象 封装(public等的作用域)

3)线程进程 通信 线程几种状态

6)数据库事务acid,举例

 找出重复数组中两个只出现一次的数

 O(1)时间内实现找栈内最大最小值

5.15 hr打电话说过了,接着就发邮件录用了

(六)拼多多 开发

1)让每个盒子里的球不同,需要往里加入的球的最小数量

2)一组长度为整数的火柴,是否能够摆出一个正方形

3)给你两个初值,求斐波那契数列第N项是否为3的倍数,N最大为

4)一个数列,相邻连续几个的GCd与个数的乘积,最大是多少

(一)华为优招 运营商-服务与软件研发管理部

暑期实习面试过了,但是没发录用通知,8.21打电话说被选上去优招的面试,如果定15级就直接发offer。

(第二次一天三面的经历)

3)会不会java(不会)

4)算法题:有效的括号

7)链表和双向链表的区别,为什么要分这两种?

8)熟悉什么算法?排序算法,时间空间复杂度

10)实习的时候有没有遇到什么问题,怎么解决的?

11)最后说等一下就会有二面

3)问我上一个面试官问了什么题

4)算法题(忘了写的啥了)

6)学过哪些计算机课程(都是自学的)

8)最后说下午会有三面

主管面基本就是聊天:自我介绍 自我评价 简单聊聊实习项目 学生干部经历 职业规划 对华为的看法

通过了,但不是15级,所以到很晚才约面谈

(二)字节跳动 新业务 后端开发 转正答辩

1)提前几分钟到会议室,简单聊几句

2)根据ppt,讲实习期间的工作

答辩是通过了,但评级低,确实因为疫情远程实习学的太慢

(三)商汤、携程、阿里、腾讯、美团、小米、百度

2、携程笔试 选择题不能返回修改 敏感词过滤 另一个忘了

3、阿里笔试 拖到快结束才做 只记得挺难。。

4、腾讯笔试 记录找不到了 写的很烂

5、美团笔试 五道算法题(竟然是上午)装饰物的美丽值 填数游戏 齿轮解密

6、小米笔试 选择题+算法题 秋招的最后一场,很简单

7、百度笔试 两道算法题

1)m食堂ai个窗口n个学生, 所有食堂最长队伍的期望

2)长度n的数组,问m次,区间[l,r]内有多少子序列乘积为偶数或奇数

确实互联网的秋招我准备的不好,一是因为字节实习能转正放松了其他的准备,二是因为字节实习占用了一些时间,所以最后也没面几家,9.22面的美团和小米发挥的贼烂,特别是小米,面试官问了好多底层的知识,我好多都答不上来,就开始问我学过的矩阵(无语)。秋招的笔面真题不能帮到大家太多,抱歉!

(一)中国银行 总行信科管培生

题目数量大 英语阅读难 做完眼疼 发挥还行

1、签到,查证,抽签,交手机,等

1)题目:根据顾客反馈改善商场设施

2)8-10人一组,进面试间,发题,先自己思考,之后开始讨论

3)同组一个留学生过于厉害,在白板上各种记录大家说的,也会引导大家,分层也很好,各种写英文单词,厉害,最后也是让他总结的,我们整体很不错

4)我是提了一两个比较有创意的点,被采纳,可能加分了

1)先进单独的屋里,发试题,20分钟5道题

你用过的app有什么你觉得可以改进的功能,怎么改?(我说的某购物app的推荐,改进推荐算法)

讲一下,某件事,你采取了和别人不同的思路,最后取得了出其不意的效果

讲一个需要付出很多时间和精力的事,你是怎么做的

同事消极,想辞职,你作为同事会怎么做,现场模拟

2)进面试间,依此回答上述问题,不用读题,之后面试官提问

3)实习经历,项目相关问题

4)父母做什么的,对于你未来的工作有什么期望?

5)有什么offer了,为什么不去字节来银行?

6)英语问我怎么看待美国对tiktok的禁令。

(二)农业银行 总行理工类培训生/北研软开第二批

1、菁穗培训生-理工类

行测45分钟60道题+英语+专业知识

1)站起来自我介绍(准备无线耳机)

2)蔚来和特斯拉你会买哪个(这个问题属于即兴)

3)根据专业问 我通信问我通信相关 中美5G对比,之后可以在银行做什么工作,专业优势是什么?

站在企业的角度,如何提高企业的创新能力

2)要找计时员,或者大家都看着点时间

3)没较大把握别抢领导,很容易翻车

4)没特别大把握别抢总结,推荐别人当总结人的时候说点实际的理由,别只是随大流

选择+算法题 正常刷题很容易AC

1)一大半穿正装,其中一大半打领带

2)10点半先签到,查证件,备注是否需要户口

3)每组10个,每个时间段两组,一天大概七八组,大概两三天

4)先看ppt,三道题,限时马克笔写纸上,之后挨个展示自己写的同时讲,不能讲纸上没有的(写大点,好看点)

dao模式/数据库存储过程和函数的区别,存储过程的优点/数据库索引的优缺点

5)然后面试官看着简历,挑感兴趣的同学问他们的项目:

用过哪些开发工具,框架;用什么语言,怎么实现哪种功能。

6)其他还会问基础知识,数据库,网络,操作系统,我这种cpp选手也会被问cpp相关(我是cpp,感觉还是java更适合银行)

(三)工商银行 牡丹卡中心科技菁英

难(行测是里面最简单的)

1)结构化题目:银行的数字化技术发展如何建立在需求之上

2)实习经历的遗憾、自身缺点、未来规划、想望哪方面发展

3)不轻易放弃的事例(因为我自我介绍提到了)

4)有哪些offer、了解过牡丹卡中心的岗位么

面试下午场所有人分两三个时间段签到,就一直等,我还被人插队,但也因此在面试间外跟老师聊了很多,工资比总行略高(还说工银瑞信最后取得都是双清北)

(技术岗但是没问技术)

2)根据简历问,字节实习,项目介绍

3)其他银行结果怎么样了

5)为啥不去互联网了要来银行?“我们这也加班,这个领导天天12点走呢”

(四)建设银行 总行数字化建设委员会办公室

正常难吧,就是做的很闹心

1、签到,查证,交手机

三个面试官,都会问问题,但我没有和银行有关的项目和实习,所以面试官也很为难,随便问了问,答的也一般

就是hr面,也是说我没实习,不太匹配之类的

(这是我第二志愿,最后也没过,等待时间太长,体验感很差)

(五)国家开发银行 总行信科岗(面试调剂到信贷岗)

三道题 300字+300字+800字 作文差几行没写完

1、签到、交手机、抽签、测评

1)8分钟4道题(很多人这部分结束就直接出来了)

是不是练过公务员面试?(因为我用了答题模板)

为什么不去互联网来银行?

讲一下最近组织过什么事吧,干的像科技局的活

女朋友什么工作?在哪上的学?

3、无领导小组-银行招聘人员素质重要性排序

这次我们分歧比较大,最后没太达成统一,可能整组分数比较低,最后大家都没过,太惨了

(六)进出口银行 总行信息科技类

1)没几道行测题,几乎全是进出口银行的常识题

3)六篇英语阅读,没做完

4)党员,党最近开的会是什么

主考官说“挺适合我们岗位的”,我说我可能等不到口行结果,面试官说“你可以等等”

(结果确实过了,不过太晚了,被我拒了)

我的真题库就是这些了,希望能帮助到大家!

2021届春招开始了,大家冲吧!

2022届毕业生也要加油啊!

}

我要回帖

更多关于 手机网络运营商 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信