腾讯音乐Android工程师一面面试题记录,拿走不谢!
最近参加了一次鹅厂音乐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、volatila有什么作用?AtomiticInteger有什么作用,底层实现原理是什么?与synchronized关键字有什么区别?cas有什么弊端?
4、Android Log中的tag,用类名.class.getSimpleName()来获取,会有什么弊端?
5、反射有什么作用?有什么弊端?
6、广播底层实现机制?为什么会比AIDL方式慢?与EventBus相比有什么区别?
7、Handler如何保证每个线程只有一个looper?ThreadLocal有什么作用?
8、100个0~100之间的整数,实现排序
9、RxJava介绍
10、Glide介绍
11、measuredWidth和width的区别
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工程师一面面试题记录,拿走不谢!的更多相关文章
- Android工程师常见面试题集
本文汇总了朋友同事在面试过程中被经常问道的一些问题,讲解不详细,有需要特别了解的可以留言告诉我.持续更新中…… 1.接口回调机制 ①定义一个接口,定义接口中的方法: ②在数据产生的地方持有接口,并提供 ...
- Android工程师常见面试题集答案
13.描述一下Android的系统结构? android系统架构分从下往上为linux 内核层.运行库.应用程序框架层.和应用程序层. linuxkernel:负责硬件的驱动程序.网络.电源.系统安全 ...
- hive面试题(免费拿走不谢)
Hive 最常见的几个面试题 1.hive 的使用, 内外部表的区别,分区作用, UDF 和 Hive 优化(1)hive 使用:仓库.工具(2)hive 内部表:加载数据到 hive 所在的 hdf ...
- BAT Android工程师面试流程解析+还原最真实最完整的一线公司面试题
尊重原创,转载请写明原文出处:http://blog.csdn.net/sk719887916/article/details/47040931 (skay) 求职和我们每个人息息相关,而求职也有门道 ...
- QQ音乐Android客户端Web页面通用性能优化实践
QQ音乐 Android 客户端的 Web 页面日均 PV 达到千万量级,然而页面的打开耗时与 Native 页面相距甚远,需要系统性优化.本文将介绍 QQ 音乐 Android 客户端在进行 Web ...
- Android 工程师如何快速学会web前段
Android 工程师如何快速学会web前段 今天主要聊一下本人最近在学习web前段的感受,最近html5是越来越火了,前段时间公司做了一个项目然后让我们“android”的程序猿过去帮忙把客户 端框 ...
- Android工程师必会做的20道题
一.单选题 (共7道题,每题5分) 1.使用AIDL完成远程service方法调用下列说法不正确的是 A.aidl对应的接口名称不能与aidl文件名相同 B.aidl的文件的内容类似java代 ...
- Android 工程师
转发:https://zhuanlan.zhihu.com/p/30429725 这句话我真的憋了好久.Android 工程师只要关注我,我就能让你达到大师级水平,不是面试时的吹牛逼水平,不是自我欺骗 ...
- 【深圳·招聘】QQ音乐测试工程师-职位内推
QQ音乐测试工程师 岗位职责 负责腾讯QQ音乐移动端/后台/web相关特性测试分析和执行,保障发布质量. 岗位要求 专业本科及以上学历,计算机/软件工程/信息管理/数学与应用数学/自动化/通信工程/电 ...
随机推荐
- Create First Application
Node.js创建第一个应用 Node.js开发的目的就是为了用JavaScript编写Web服务器程序, 在使用Node.js时,不仅仅是在实现一个应用,同时还实现了整个HTTP服务器.在创建Nod ...
- JVM中的垃圾收集
引用计数(Reference Counting) 循环引用问题 标记清除(Mark and Sweep) 内存池(Memory Pools) Eden 是内存中的一个区域, 用来分配新创建的对象 . ...
- Git常用目录
Git常用目录 // 初始化Git仓库 $ git init // 将代码添加到暂存区中 $ git add . // 将代码保存到仓库中 $ git commit -m "保存的说明&qu ...
- Verilog代码和FPGA硬件的映射关系(五)
既然我们可以指定寄存器放在IOB内,那我们同样也可以指定PLL的位置.首先要确保我们有多个PLL才行.如图1所示,我们所使用的EP4CE10F17C8芯片刚好有两个. 图 1 为了演示这个例子,我们使 ...
- UIAutomator2安装及连接
记录一下自己的偿试过程,内容来自:https://github.com/openatx/uiautomator2 d.service("uiautomator").stop()是因 ...
- Qt如何管理组件
转载:清凉简装的博客 解决“要继续此操作,至少需要一个有效且已启用的储存库“问题 1.在Qt安装目录找到组件管理软件MaintenanceTool,双击. 2.点击下一步,出现要继续此操作,至少需要一 ...
- 【C++】VS Code配置
0.前言 本文已配置C++环境为例,本文主要是面向刚开始接触VS Code的朋友,采用生成默认配置任务的方法,在编写本文过程中大量参考了官方文档,感兴趣的朋友可直接前往传送门. 环境: win10 + ...
- 华为五大专家亲述:如何转型搞 AI?
导语:非AI专业技术人员转型AI技术,或是作为一名学生学习AI技术开发,对每个有这样诉求和经历的人来说,都希望能够看到AI技术人才的成长经历,给出自己的真实经历分享. 前言 参考塞缪尔.约翰逊(18世 ...
- [JavaWeb基础] 022.线程安全(一)
在我们做客户端程序的时候我们经常会碰到线程安全的问题,比较经典的例子就是模拟局域网聊天.那么线程的安全到底是怎么回事呢,我们经常会听到StringBuffer是线程安全的,StringBuilder不 ...
- Centos8 删除了yum.repos.d 下面的文件
原文: https://www.cnblogs.com/junjind/p/9016107.html centos-release-8.1-1.1911.0.9.el8.x86_64 找到 https ...