最近参加了一些Android工程师岗位的面试,总结了一些常见的考点,希望能帮到正在面试的你(答案还在整理中)!

1、Java调用函数传入实际参数时,是值传递还是引用传递?

2、单例模式的DCL方式,为什么需要第二次判空?

单例模式的DCL是一种比较好的单例实现方式,面试中被问及的频率非常高,考察的方式也多种多样。根据本题的提问,这里简单整理了一下,这里面的每一个点最好都能够做到烂熟于心:

 public class Test {
private volatile static Test instance; private Test() { } public static Test getInstance() {
if (instance == null) {
synchronized (Test.class) {
if (instance == null) {
instance = new Test();
}
}
}
return instance;
}
}

这里有5个要点需要注意:

(1)第一个注意点:使用私有的构造函数,确保正常情况下该类不能被外部初始化(非正常情况比如通过反射初始化,一般使用反射之后单例模式也就失去效果了)。

(2)第二个注意点:getInstance方法中第一个判空条件,逻辑上是可以去除的,去除之后并不影响单例的正确性,但是去除之后效率低。因为去掉之后,不管instance是否已经初始化,都会进行synchronized操作,而synchronized是一个重操作消耗性能。加上之后,如果已经初始化直接返回结果,不会进行synchronized操作。

(3)第三个注意点:加上synchronized是为了防止多个线程同时调用getInstance方法时,各初始化instance一遍的并发问题。

(4)第四个注意点:getInstance方法中的第二个判空条件是不可以去除,如果去除了,并且刚好有两个线程a和b都通过了第一个判空条件。此时假设a先获得锁,进入synchronized的代码块,初始化instance,a释放锁。接着b获得锁,进入synchronized的代码块,也直接初始化instance,instance被初始化多遍不符合单例模式的要求~。加上第二个判空条件之后,b获得锁进入synchronized的代码块,此时instance不为空,不执行初始化操作。

(5)第五个注意点:instance的声明有一个voliate关键字,如果不用该关键字,有可能会出现异常。因为instance = new Test();并不是一个原子操作,会被编译成三条指令,如下所示。
          1)给Test的实例分配内存

2)初始化Test的构造器

3)将instance对象指向分配的内存空间(注意,此时instance就不为空)

然后咧,java会指令重排序,JVM根据处理器的特性,充分利用多级缓存,多核等进行适当的指令重排序,使程序在保证业务运行的同时,充分利用CPU的执行特点,最大的发挥机器的性能!简单来说就是jvm执行上面三条指令的时候,不一定是1-2-3这样执行,有可能是1-3-2这样执行。如果jvm是按照1-3-2来执行的话,当1-3执行完2还没执行的时候,如果另外一个线程调用getInstance(),因为3执行了此时instance不为空,直接返回instance。问题是2还没执行,此时instance相当于什么都没有,肯定是有问题的。然后咧,voliate有一个特性就是禁止指令重排序,上面的三条指令是按照1-2-3执行的,这样就没有问题了。

参考:https://blog.csdn.net/hnd978142833/article/details/81633730

3、volatile有什么作用?AtomiticInteger有什么作用,底层实现原理是什么?与synchronized关键字有什么区别?cas有什么弊端?

       关于多线程相关的知识点,volatile、AtomiticInteger、synchronized、cas问题都是高频考点,与之相关的知识点如:重量级锁/轻量级锁、乐观锁/悲观锁、JMM(Java Memmory Mode Java内存模型)、用户空间/内核空间、多线程三要素(原子性、可见性、顺序性)、自旋、ABA问题等,都是需要掌握的要点。

推荐阅读:【死磕Synchronized底层实现

面试官没想到,volatile能吹上半个小时

《吊打面试官》系列-乐观锁、悲观锁

「每日知识点」什么是 CAS 机制

4、Android Log中的tag,用类名.class.getSimpleName()来获取,会有什么弊端?

5、反射有什么作用?有什么弊端?

6、广播底层实现机制?为什么会比AIDL方式慢?与EventBus相比有什么区别?

7、Handler如何保证每个线程只有一个looper?ThreadLocal有什么作用?

       这道题其实主要考察ThreadLocal,不了解ThreadLocal的可以阅读博文:【朝花夕拾】Android多线程之(二)ThreadLocal篇,以及【再有人问你什么是ThreadLocal,就把这篇文章甩给他!

8、100个0~100之间的整数,实现排序

9、RxJava介绍

10、Glide介绍

11、measuredWidth和width的区别

      结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小。getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小。

推荐阅读:【android中getWidth()和getMeasuredWidth()之间的区别

12、SparseArray介绍,为什么能提高性能

13、MVP与MVVM的区别,MVVM的实现方式

14、分享时,Android N开始对url做了什么限制?

15、HashSet介绍

16、软引用和弱引用的区别,什么时候会GC?System.gc()的时候系统会立即回收系统垃圾吗?

17、Exception和Error有什么区别?Error能被捕捉吗?OOM Error能被捕捉吗?

18、Sharepreference commit()和apply()的区别。Sharepreference进程安全吗?线程安全吗?

19、500x500的png图片所占的内存大小。同一张图片在xxdpi-drawable和drawable中谁占用的内存更大,大多少?

20、RecyclerView与ListView的区别。

大体上这记得么多,面试官会根据回答的内容进一步深入提问,读者可以在该知识点上进一步拓展。

看到这些常见的android面试题,你慌了吗?的更多相关文章

  1. 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18) eoe上看到的

    ===============eoeAndroid社区推荐:======================= 1.Android开发新浪面试题[开发者必看哦]下载地址 http://www.eoeand ...

  2. Android面试题整理【转载】

      面试宝典(5)  http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad ...

  3. 19、android面试题整理(自己给自己充充电吧)

    (转载,出处丢失,请原作者原谅,如有意见,私信我我会尽快删除本文) JAVA 1.GC是什么? 为什么要有GC?GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问 ...

  4. Android面试题(文章内容来自他人博客)

    腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)?(++a):(a+=3); ...

  5. Android面试题收集(有具体答案)

    Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每个Android应用程序都在它自己的进程中执行,都 ...

  6. Android面试题集锦 (转)

    转自:http://xiechengfa.iteye.com/blog/1044721 一些常见的Android面试基础题做下总结,看看你能做出多少道? 1. Intent的几种有关Activity启 ...

  7. android面试题总结加强再加强版(一)

    在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...

  8. Android 面试题 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Android 面试题集 包含答案

    作者:guoxiaoxing 链接: https://github.com/guoxiaoxing/android-interview 本文基于作者采用的MIT协议分发. 手画一下Android系统架 ...

随机推荐

  1. Understanding REST and RESTful APIs

    Understanding REST and RESTful APIs If you've spent any amount of time with modern web development, ...

  2. JAVA设计模式之原型模式(prototype)

    原型模式: 原型模式又叫克隆模式 Java自带克隆模式 实现克隆模式必须实现Cloneable 接口,如果不实现会发生java.lang.CloneNotSupportedException异常 当某 ...

  3. 微信小程序制作个人简历

    使用微信小程序云开发制作自己的个人简历,简单高效. 首先需要了解小程序的基本结构以及云开发模式,及一些css样式基础. 使用小程序云数据库.vant组件库实现简历内容. 最终效果如下: 首先申请个人微 ...

  4. SpringMVC入门总结

    一.SpringMVC的好处? 1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式 2,能与spring其它技术整合比如说webflow等, 3,获取request及s ...

  5. NOI2006 最大获利 洛谷P4174

    洛谷题目传送门! 题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就 ...

  6. 加速国内Github代码下载速度

    标题: 加速国内Github代码下载速度 作者: 梦幻之心星 347369787@QQ.com 标签: [Github, 代码, 下载] 目录: 代码 日期: 2019-10-27 目录 前提说明 解 ...

  7. Rocket - devices - CanHaveBuiltInDevices

    https://mp.weixin.qq.com/s/C9iktVr4hnQ8lM0CiWtedQ 简单介绍CanHaveBuiltInDevices的实现. 1. HasBuiltInDeviceP ...

  8. cmd启动mysql,服务名无效

    通过cmd无法启动mysql 解决办法: 在计算机管理(或者win+R,输入services.msc)中打开服务,查看mysql服务的名称是否正确. 键入正确的名称启动mysql.

  9. Java实现 LeetCode 647 回文子串(暴力)

    647. 回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "a ...

  10. java实现巧排扑克牌

    ** 巧排扑克牌** 小明刚上小学,学会了第一个扑克牌"魔术",到处给人表演.魔术的内容是这样的: 他手里握着一叠扑克牌:A,2,-J,Q,K 一共13张.他先自己精心设计它们的顺 ...