• 若为false,则遍历子View,找到点击对应的View。然后拦截分发,同时调用 View控件的dispatchTouchEvent

3.在View控件的 dispatchTouchEvent() 方法中主要对View控件进行3个条件的判断:

public boolean dispatchTouchEvent(MotionEvent event) {

if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&

mOnTouchListener.onTouch(this, event)) {

return true;

}

return onTouchEvent(event);

}

  • **条件1 mOnTouchListener !=null:**即我们只要给View控件注册了Touch事件,mOnATouchListener就不为空

  • **条件 2 (mViewFlags & ENABLED_MASK) == ENABLED:**判断当前View控件是否enable(很多View默认enable)

  • **条件 3 mOnTouchListener.onTouch(this,event):**即控件注册Touch事件时的onTouch()

由此可见,只有给View控件添加点击事件同时在点击事件中的onTouch()返回true时,dispatchTouchEvent()方法才能返回true,分发才结束。否则进入onTouchEvent()方法。

4. HashMap、ArrayList、LinkList原理**


5. 你在开发过程中常用设计模式有哪些,单例设计模式的双重校验的目的?去掉第一个判空或第二个判空有啥不同?工厂模式解决了什么问题?使用了哪些设计原则?**


  • 设计模式
  1. 单例模式

  2. Build建造者模式

  3. 观察者模式

  4. 原型模式

  5. 策略模式

  6. 工厂模式

  • 单例模式双重校验的目的

在说单例的双重校验目的之前,先看一下单例的双重校验长什么样子

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

可以看到在getInstance()方法里面,先判断当前实例是否为空,然后进入同步处理后又判断一次实例是否为空。前后两次判断校验了两次。这个就是双重校验

去掉第一个判断为空:即懒汉式(线程安全),这会导致所有线程在调用getInstance()方法的时候,不管三七二十一就直接排队等待同步锁,然后等到排到自己的时候进入同步处理时,才去校验实例是否为空,这样子做会耗费很多时间(即线程安全,但效率低下)。

//去掉判断第一个为空

public static
synchronized SingleTon getInstance(){

if (instance==null){

instance = new SingleTon();

}

return instance;

}

去掉第二个判断为空:即懒汉式(线程不安全),这会出现 线程A先执行了getInstance()方法,同时线程B在因为同步锁而在外面等待,等到A线程已经创建出来一个实例出来并且执行完同步处理后,B线程将获得锁并进入同步代码,如果这时B线程不去判断是否已经有一个实例了,然后直接再new一个。这时就会有两个实例对象,即破坏了设计的初衷。(即线程不安全,效率高)

//去掉第二个判断为空

public static SingleTon getInstance(){

if (instance==null){

instance = new SingleTon();

}

return instance;

}

双重校验的目的:除了第一次实例化需要进行加锁同步,之后的线程只要进行第一层的if判断不为空即可直接返回,而不用每一次获取单例都加锁同步,因此相比前面两种懒汉式,双重检验锁更佳。(双重校验锁结合了 两种懒汉式 的优点)

6. retrofit,okhttp,rxjava原理,okhttp用到了哪些设计模式,连接池的实现原理,rxjava线程切换的原理,eventbus原理


retrofit 、 okhttp 、 rxjava原理 :

7. jvm模型,java内存模型,垃圾回收机制,垃圾回收哪个区域,对象在内存哪个区域等等


  • jvm模型、java内存模型:

  • 垃圾回收机制 :

主要分为两个步骤:

  1. 检测垃圾

  2. 回收垃圾

检测垃圾又有两种:

  1. 引用计数法(已过时)

给对象一个添加一个引用计数器,每当有一个地方引用该对象时,计数器加1,反之当引用无效时,计数器减1 。在任何时候,当计数器为0时,即没有任何地方引用该对象,表示该对象无用,即为回收器回收的对象。(因为这个方法无法解决对象之间相互循环引用的问题,所以被淘汰。)

  1. 可达性分析

通过GC root根节点往外遍历(可以想象树形图),当一个与root根节点可达的节点A所代表的对象持有另外一个节点B所代表的对象的引用,则视节点B为可达的。反之,如果某个节点是不可达的,则为可回收的对象。

回收垃圾

  1. 标记 - 清除法(mark - sweep)

标记所有需要回收的对象,然后统一清除。该方法简单粗暴,但是清除完会导致内存空间中出现大量碎片。

  1. 复制(copying)

把内存中的空间平分为两个,然后每次只使用任意一个。当回收垃圾时,遍历当前该内存区域,将正在使用的对象复制到另外一个内存区域中(复制过来后会自动整理,不会出现碎片的问题),然后再清空原来的内存区域。该方法通过两个内存区域的方法解决了碎片的问题,同时又迎来了新的问题,即提高了内存的空间要求,舍弃了空间换取了效率。

  1. 标记 - 整理(mark - compact)

第一阶段:从根节点标记所有能被引用的对象,即标记有用的对象。

第二阶段:遍历整个堆中的对象,清除没有被标记的对象,并把剩下的 “压缩” 到堆中的其中一块,按顺序排放。

该方法避免了 “ 标记 - 清除 ” 所造成的碎片问题,也解决了 “ 复制 ” 对空间的要求高的问题。

  1. 分代收集算法

根据每个对象生命周期不同的特点,将对象划分到不同代上,使用不同的垃圾回收方式。

新生代:新创建的对象都是使用新生代分配内存。新生代里面又有三个区域(1个Eden区和2个Survivor区),新建的对象会放再Eden区,当Eden区满了就会执行 Minor GC ,然后把存活的对象转移到任意一个Survivor区。

老年代:经过多次 Minor GC后依然存活的对象便送到该代,当该代内存被占满时就会触发Full GC回收整个内存。

持久代:顾名思义。永生不死,相当于吸血鬼。用于存放java类等

  • 垃圾回收在哪个区域:

  • 要了解垃圾回收到底是回收哪个区域,就得先了解JAVA内存管理

  • 内存的管理即对对象的分配释放,释放即回收。

JAVA内存分配策略

1. 静态分配:主要存在静态变量,这块在编译时就已经分配好了,在整个程序运行期间存在。

**2. 栈式分配:**当方法被执行时,方法体内部的局部变量(基本数据类型,对象的引用)都会放进栈内存中。当方法执行结束,分配给该方法的内存空间也会被释放。

**3. 堆式分配:**又称动态分配,通常指对象的实例,这部分内存在不用的时候会被GC回收。

通过上面三个分配策略可知,静态分配在整个程序运行过程中都在存在,栈式分配的内存在方法体执行结束后会自动释放。使用这两种分配策略的对象都不用进行回收,只有使用堆式分配的对象需要进行GC回收。

8. startService和bindService区别,多次启动会调用哪些方法?


  • startService和bindService的区别

startService:

作用:启动服务

生命周期:onCreate() → onStartCommand() → onDestory()

bindService:

作用:启动服务

生命周期:onCreate() → onBind() → onUnbind() → onDestory()

  • 区别:
  1. 从通讯角度看,使用startService()方法启动的服务不能与Activity进行通讯,而使用bindService()方法启动的服务可以与Activity进行通讯。

  2. 从生命周期看,startService()方法启动服务是通过startCommand()方法,而bindService()方法是通过onBind()方法。

  3. 通过startService()方法启动的服务,当调用者退出后,服务仍然可以运行,而使用bindService()方法启动的服务则不行。

  • onCreate()方法在生命周期中只调用一次,若在服务已经启动的前提下,多次调用startService()方法或者调用bindService()方法,都不会再执行onCreate()方法,在使用starService()方法启动服务的情况下,会多次调用onStart()方法。

9. Activity旋转会调用哪些方法


Activity横竖屏切换的生命周期根据清单配置文件中的属性“ android:configChanges ”的值的不同而不同。

android:configChanges =" orientation "消除横竖屏的影响

android:configChanges=" keyboardHidden " :消除键盘的影响

android:configChanges=" screenSize " :消除屏幕大小的影响

*_情况1:android:configChanges =" orientation " 或者_android:configChanges =" orientation | keyboardHidden "***或者不设置该属性时,其切换屏幕的生命周期如下:

onPause() → onSaveInstanceState() → onStop() → onDestory() → onCreate() → onStart() → onRestoreInstanceState() → onResume()

*_情况2:_android:configChanges=" orientation | screenSize | keyboardHidden "***时,其切换屏幕不会调用任何一个生命周期方法。

*_情况3:_android:configChanges=" orientation | screenSize "***时,其切换屏幕时不会调用任何一个生命周期方法,而是调用onConfigurationChanged()方法。

10.数据结构和算法,比较少会去写,要求手写 冒泡或者快速希尔排序等排序,最少要会一种


排序相对基础一点,这里本着复习的目的,就贴出冒泡排序的代码。使用Ecplise写的

Scanner sd =new Scanner(System.in);

String[] temp=sd.nextLine().split(" ");

//这里就是排序的代码

for(int i=0;i<temp.length;i++) {

for(int j=temp.length-1;j>i;j–) {

if(Integer.parseInt(temp[j])<Integer.parseInt(temp[j-1])) {

String str=temp[j];

temp[j]=temp[j-1];

temp[j-1]=str;

}

}

}

//这里是遍历打印出来

for(String str:temp) {

System.out.print(str+" ");

}

11. 你都做过哪些内存优化,apk优化等


12,哪些会导致内存泄漏,如何检测,以及解决办法,内存泄漏和溢出有啥不同


  • 哪些会导致内存泄漏

12.1 单例模式:

在该模式中,需要外部传入一个context来获取该类实例,一般我们在Activity中直接写入this做为contetx来获取单例实例,此时该单例持有Activity的context强引用。这样的话,即使Activity早已退出,该Activity的内存也不会被回收,这样就造成了内存泄漏。

避免单例模式造成的内存泄漏就是在Activity获取单例实例的时候,将getApplicationContext替换this作为传入的context。这样,该实例实际上获取的是整个应用的引用,就不会出现内存泄漏的情况了。

12.2 非静态内部类/匿名类:

非静态内部类和匿名类都默认持有外部类的强引用,且其生命周期甚至比外部类长。当外部类退出了,就导致了内存泄漏。

解决的办法就是实现静态内部类。

12.3 集合:

集合类添加元素后,仍引用着集合元素的对象,导致该集合元素中的对象无法被回收,从而导致内存泄漏。

解决的办法也相对简单,在集合元素使用后从集合中删除,等所有元素都使用完后,将集合置空。

12.4 其他情况:

  • 需要手动关闭的对象没有关闭:

网络、文件流 忘记关闭
ivity早已退出,该Activity的内存也不会被回收,这样就造成了内存泄漏。

避免单例模式造成的内存泄漏就是在Activity获取单例实例的时候,将getApplicationContext替换this作为传入的context。这样,该实例实际上获取的是整个应用的引用,就不会出现内存泄漏的情况了。

12.2 非静态内部类/匿名类:

非静态内部类和匿名类都默认持有外部类的强引用,且其生命周期甚至比外部类长。当外部类退出了,就导致了内存泄漏。

解决的办法就是实现静态内部类。

12.3 集合:

集合类添加元素后,仍引用着集合元素的对象,导致该集合元素中的对象无法被回收,从而导致内存泄漏。

解决的办法也相对简单,在集合元素使用后从集合中删除,等所有元素都使用完后,将集合置空。

12.4 其他情况:

  • 需要手动关闭的对象没有关闭:

网络、文件流 忘记关闭

2020年腾讯,阿里,美团等Android高频面试题及答案,2021Android者未来的出路在哪里相关推荐

  1. 阿里、腾讯、美团等P7岗位面试题

    来自朋友最近阿里.腾讯.美团等P7岗位面试题 程序员小灰 昨天 以下文章来源于艾小仙 ,作者艾小仙 艾小仙 2本学渣,阿里P7,9年码龄,纵观半生,产品运营,开发测试,app游戏,大厂小厂,雨露均沾, ...

  2. android java 面试题及答案_android面试题及答案

    引导语:android是这段时间非常热门的开发专业之一,而有关android的面试题及答案哪里有呢?接下来是小编为你带来收集整理的文章,欢迎阅读! 在android中,请简述jni的调用过程. 1安装 ...

  3. 重庆对口高职计算机类专业答案2020,2020年重庆市高职分类考试汽车类专业招生试题及答案...

    2021年高职单招升学一对一咨询刘琪:15608331050(微信) 2020年重庆市高职分类考试汽车类专业招生试题及答案 2020 年重庆市高等职业教育分类考试汽车类专业综合理论测试参考答案 一.单 ...

  4. 腾讯阿里美团相继搞事,渣本程序员的出路在哪?

    10月份美团在内网通报最新的职级体系调整,明年初起实行新的"扁平职级,宽带薪酬"体系,原有的"M+P"双职级线."1-2 至 3-3"等专业 ...

  5. android最新面试题及答案,分享两道阿里P7究极难度算法题

    前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实 ...

  6. android最新面试题及答案,Android项目开发如何设计整体架构

    首先,讲讲为什么我们要讲JAVA的语言进阶,从整体来讲,Java和Android的区别在于Android程序是基于组件和配置的,而且Android开发以Java语言为开发工具,表面上看他们有点同宗不同 ...

  7. 「独家」五面阿里P6:Java开发面试题及答案

    说说最近的项目 如何实现session共享,用redis如何实现 缓存击穿的概念和解决方案 说说微服务,微服务之间如何管理 二面(现场) java nio常?用的三个类 java里面的同步锁了解吗?C ...

  8. 阿里 java 面试题 p6_「独家」五面阿里P6:Java开发面试题及答案

    一面(电话) 说说对JVM的理解 treemap和hashmap有什么区别? Java多线程的的5大状态图流转 mysql主键和唯一索引的区别 说说最近的项目 如何实现session共享,用redis ...

  9. 1549页Android最新面试题含答案,android游戏开发

    22.Java中实现多态的机制是什么? 答:方法的重写Overriding和重载Overloading是Java多态性的不同表现 重写Overriding是父类与子类之间多态性的一种表现 重载Over ...

最新文章

  1. 图论 ---- C. Graph Transpositions(数据分阶段分层图最短路(二维) + 贪心)
  2. 利用epoll写一个迷你的网络事件库
  3. Serverless 在大厂都怎么用?
  4. F2etest+UIRecorder(录制脚本)【2】
  5. 学习J2ME编程需要掌握的七种技术
  6. 怎么将零件整合到一起_Fraunhofer ILT用于大型零件3D打印的“边飞行边加工”的LPBF概念...
  7. spring 注解说明以及@Resource和@Autowired的区别
  8. java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具
  9. python修改文件格式为unix_软件测试技术之如何用python在Windows系统下,生成UNIX格式文件...
  10. 决定你人生命运的10年,你做了什么?
  11. Linux安装MySQL-MariaDB版本
  12. C# Cookie工具类
  13. php mysqli 字段缺失,mysqli 为什么不提示字段异常
  14. 职称计算机考试f11,2016全国职称计算机考试PowerPoint单选试题3
  15. imagej得到灰度图数据_【原创】imagej使用达人指南,分享给大家!
  16. shiro原理简介说明
  17. python文本风格_Python风格规范-FYI
  18. unity实现角色的移动(用状态机控制动画)
  19. delphi 企业微信消息机器人_GitHub - guoxianlong/insight: Insight是一个可以管理企业微信群机器人的小工具,可以非常方便的往群里发布即时消息和定时消息。...
  20. 液压杆原理//2021-1-30

热门文章

  1. java版地图源码_TreeMap就这么简单【源码剖析】
  2. 金海佳学C++primer 练习9.18/9.19
  3. IDEA MAVEN 项目 打包文件到指定目录
  4. VS 2017生成exe(msi)文件
  5. 电子商务经过了十多年的发展 企业建站网站与域名选择的重要性
  6. 光功率 博科交换机_希望查询7604,CE3000等交换机读取光口光功率的oid,以及电源状态的oid...
  7. WiFi beacon时槽
  8. No module named ‘torchvision.models.feature_extraction‘
  9. 微信小程序学习笔记(一)
  10. 十进制转化为二进制(栈算法)