阅读 31

2020年3月Android面试总结

前言:

由于新冠状病毒隔离的原因
去年离职到现在一直没有办法找工作
在深圳呆了一个多月了 java基础也复习了一遍 总体来说还是有些收获!
在3月初正式复工以来 公布简历后有很多外包公司打招呼!
因为自己对外包公司印象不好所以拒绝了很多岗位面试
就近几天面试了几家自研产品公司,所以对面试问题做一下总结!

进入正题:

  • 1 看你简历上有写 熟练使用GosnFastJson你能讲讲其他的区别吗?
    Gson是由Google公司推出的功能最全Json解析器
    FastJson是由阿里巴巴公司开发的高性能Json解析器
    它们两个都是 无依赖,不需要例外额外的jar,能够直接跑在JDK上!
    解析过程:
    Gosn: 需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象
    FastJson: 在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
    FastJson 采用独创的算法,将parse的速度提升到极致,超过所有json库。

  • 2 既然你知道FastJson性能优于Gson 有深入了解原因吗?
    这里我没有答上来 面试官也没有深入解释 只是说了句:FastJson性能优化是内部使用的for循环

  • 3 说说你在项目中常用的布局,为什么用它?
    因为笔者在上家公司用到最多的布局基本就是 ConstraintLayout 为什么用它?
    原因很简单 : 减少布局的层级, 优化渲染性能,使用灵活等等优点
    如果你还不熟练 请移步 :约束布局ConstraintLayout看这一篇就够了

  • 4 能说说 mvp模式 吗? 有什么好处?
    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

  • 5如何实现文件上传
    参考
    android上传文件至服务器(android端+服务器端)

  • 6有用过单例模式吗?单例模式的好处?

    • 1 ) 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
    • 2 ) 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
    • 3 ) 有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了.
      (比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),
      所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

下面内容是笔试题:

  • 7说说你对context的理解
    简单点说:Context是维持Android程序中各组件能够正常工作的一个核心功能类
    也是应用程序环境中全局信息的接口
    contest延申 :
    Context的内存泄露
    Android中的内存泄露,很多数情况都是Context造成的,根据上面对其结构和用途的分析,可以推测一下几点原因:

    • 涉及各种系统、APP资源,功能过于强大,
    • 导致使用的地方太多,在流程和引用关系上造成混乱
    • 1.比如:异步的网络请求、View动画等,在流程上处理不当,导致无法释放
    • 2.杂乱无章的传值,让很多对象都Hold一份Context,开辟了过多无法回收的资源
    • 3.Drawable对象、Bitmap对象回收不及时,甚至与View死死绑定
    • 4.单例的滥用,导致Context长期被引用无法释放

解决方案:
没必要传值的时候,尽量使用Application的Context,这样保证Context即可以全局使用,
又不会创建多份在与Activity等组件耦合的情况下,必须要使用Activity的Context的时候
考虑使用弱引用,
避免循环持有Context

  • 8 android rawassets 区别?

    • assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且该文件被打包到APK中时,不会被编码到二进制文件。
      Android还存在一种放置在res下的raw目录,该目录与assets目录不同。
      注意点:
      1、 assets目录不会被映射到R中,因此,资源无法通过R.id方式获取,必须要通过AssetManager进行操作与获取;res/raw目录下的资源会被映射到R中,可以通过getResource()方法获取资源。
      2、 多级目录:assets下可以有多级目录,res/raw下不可以有多级目录。
      3、 编码(都不会被编码):assets目录下资源不会被二进制编码;res/raw应该也不会被编码。
  • 9 android的热修复
    这个问题博主也不熟 还请参考 Android热修复总结

  • 10 android中的ui适配,如何优化?
    参考鸿洋大神的博文 Android UI性能优化实战 识别绘制中的性能问题

  • 11 上架过哪些平台
    参考博主博文 Android APK打包 加固 以及上传审核流程

  • 12 android机型适配是如何解决的?
    参考 Android开发:最全面、最易懂的Android屏幕适配解决方案

  • 13.怎么查看内存泄漏 又是怎么解决的?
    Android内存泄漏原因及解决办法

  • 14 笔试题: 一个按升序排列好的数组int[] array = {-5,-1,0,5,9,11,13,15,22,35,46},输入一个x,int x = 31,在数据中找出和为x的两个数,例如 9 + 22 = 31,要求算法的时间复杂度为O(n);
    解决方法:

public class GetNumber {

	public static void main(String[] args) {
		GetNumber gn = new GetNumber();
		//随便给定一个数组
		int[] num = { -5, -1, 1, 3, 8, 9, 11, 15, 19, 20, 23, 25, 30, 35, 44 };
		//随便给的值
		int a = 44;
		int[] x = gn.getNum(num, a);
		System.out.println(x[0]);
		System.out.println(x[1]);
	}

	public int[] getNum(int[] array, int x) {
		int headNum = 0;
		int footNum = array.length - 1;
		int[] newNum = new int[2];
		for (int i = 0; i < array.length; i++) {
			if (array[headNum] + array[footNum] != x) {
				if (array[headNum] + array[footNum] < x) {
					headNum++;
				} else if (array[headNum] + array[footNum] > x) {
					footNum--;
				}
			}
			newNum[0] = array[headNum];
			newNum[1] = array[footNum];
			if (headNum >= footNum) {
				return newNum;
			}
		}
		return newNum;
	}

}
输出结果为: 9
输出结果为: 35
		  
复制代码

与君共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
1

文章分类
Android
文章标签