在今年年初的疫情中,成了就业人员之一,于是各种筹备面试,发现面试题网上很多,然而都是很凌乱的,而且一个中央一点,没有一个零碎的面试题库,有题库有的没有答案或者是答案很简洁,没有达到面试的要求。所以始终想零碎的整顿一份面试题。
最近终于得闲花了将近一个月的工夫整顿了一份面试题库。这些面试题,包含我自己本人去面试遇到的,还有其余人员去面试遇到的,我都对立的整顿了一下,心愿对大家有用。作者不易,如有谬误望见谅。
一、java面试题(根底+进阶)(必须)
1.java中==和equals和hashCode的区别
==是运算符,用来比拟两个值、两个对象的内存地址是否相等;
equals是Object类的办法,默认状况下比拟两个对象是否是同一个对象,外部实现是通过“==”来实现的。
如果想比拟两个对象的其余内容,则能够通过重写equals办法,
hashCoed也是Object类外面的办法,返回值是一个对象的哈希码,同一个对象哈希码肯定相等,但不同对象哈希码也有可能相等。
1、如果两个对象equals,Java运行时环境会认为他们的hashcode肯定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不肯定equals。
4、如果两个对象hashcode不相等,他们肯定不equals。
2.int、char、long各占多少字节数(口试题多呈现)
Int:4字节 chat:2字节 long\double:8字节
3.int与integer的区别 (口试)
1、Integer是int的包装类,int则是java的一种根本数据类型
2、Integer变量必须实例化后能力应用,而int变量不须要
3、Integer理论是对象的援用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是间接存储数据值
4、Integer的默认值是null,int的默认值是0
4.谈谈对java多态的了解
多态是指:父类援用指向子类对象,在执行期间判断所援用对象的理论类型,依据其理论的类型调用其相应的办法。(同一音讯能够依据发送对象的不同而采纳多种不同的行为形式。
多态的作用:打消类型之间的耦合关系。
实现多态的技术称为:动静绑定(dynamic binding),是指在执行期间判断所援用对象的理论类型,依据其理论的类型调用其相应的办法。
实现多态的三要素:继承,重写,父类援用指向子类对象(即,申明是父类,理论指向的是子类的一个对象)
5.String、StringBuffer、StringBuilder区别
1、三者在执行速度上:StringBuilder > StringBuffer > String (因为String是常量,不可扭转,拼接时会从新创立新的对象)。
2、StringBuffer是线程平安的,StringBuilder是线程不平安的。(因为StringBuffer有缓冲区)
6.什么是外部类?外部类的作用
外部类:将一个类定义在另一个类外面或者一个办法外面,这样的类称为外部类。
作用:1.每个外部类都能独立的继承一个接口的实现,所以无论外部类是否曾经继承了某个(接口的)实现,对于外部类都没有影响。外部类使得多继承的解决方案变得残缺,
2.不便将存在肯定逻辑关系的类组织在一起,又能够对外界暗藏。
3.不便编写事件驱动程序
4.不便编写线程代码
7.抽象类和接口区别
雷同:
1、都能被继承
2、继承的类都必须将未实现的函数实现
3、只关注办法的定义,不关注办法的实现
差别:
1、一个子类能够继承多个接口,然而只能继承一个父类
2、抽象类在对象中只能示意一种对象,接口能够被很多对象继承
8.抽象类与接口的利用场景
如果你领有一些办法并且想让它们中的一些有默认实现,那么应用抽象类吧。
如果你想实现多重继承,那么你必须应用接口。因为Java不反对多继承,子类不可能继承多个类,但能够实现多个接口。因而你就能够应用接口来解决它。
如果基本功能在一直扭转,那么就须要应用抽象类。如果一直扭转基本功能并且应用接口,那么就须要扭转所有实现了该接口的类。
9.抽象类是否能够没有办法和属性?
抽象类专用于派生出子类,子类必须实现抽象类所申明的形象办法,否则,子类仍是抽象类。
蕴含形象办法的类肯定是抽象类,但抽象类中的办法不肯定是形象办法。
抽象类中能够没有形象办法,但有形象办法的肯定是抽象类。所以,java中 抽象类外面能够没有形象办法。 抽象类的作用在于子类对其的继承和实现,也就是多态;而没有形象办法的抽象类的存在价值在于:实例化了没有意义,因为类曾经定义好了,不能扭转其中的办法体,然而实例化进去的对象却满足不了要求,只有继承并重写了他的子类能力满足要求。所以才把它定义为没有形象办法的抽象类
10.泛型中extends和super的区别
1、< extends T>限定参数类型的上界:参数类型必须是T或T的子类型
限定参数类型的下界:参数类型必须是T或T的超类型
2、 只能用于办法返回,通知编译器此返参的类型的最小继承边界为T,T和T的父类都能接管,然而入参类型无奈确定,只能承受null的传入
只能用于限定办法入参,通知编译器入参只能是T或其子类型,而返参只能用Object类接管既不能用于入参也不能用于返参
11.父类的静态方法是否被子类重写
不能,父类的静态方法可能被子类继承,然而不可能被子类重写,即便子类中的静态方法与父类中的静态方法齐全一样,也是两个齐全不同的办法。
12.过程和线程的区别(问的蛮多的,答复的时候用书面语说进去,不要背书)
过程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
过程之间不能共享资源,而线程共享所在过程的地址空间和其它资源。
一个过程内可领有多个线程,过程可开启过程,也可开启线程。
一个线程只能属于一个过程,线程可间接应用同过程的资源,线程依赖于过程而存在。
13.final,finally,finalize的区别
final:润饰类、成员变量和成员办法,类不可被继承,成员变量不可变,成员办法不可重写
finally:与try...catch...独特应用,确保无论是否出现异常都能被调用到
finalize:类的办法,垃圾回收之前会调用此办法,子类能够重写finalize()办法实现对资源的回收
14.Serializable 和Parcelable 的区别
Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量长期变量的生成,外部执行大量的i/o操作,效率很低。
Parcelable Android 序列化接口 效率高 应用麻烦 在内存中读写(AS有相干插件 一键生成所需办法) ,对象不能保留到磁盘中。
15.动态属性和静态方法是否能够被继承?是否能够被重写?以及起因?
可继承 不可重写 而是被暗藏
如果子类外面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"暗藏"。如果你想要调用父类的静态方法和属性,间接通过父类名.办法或变量名实现。
16.成员外部类、动态外部类、部分外部类和匿名外部类的了解,以及我的项目中的利用
java中外部类次要分为成员外部类、部分外部类(嵌套在办法和作用域内)、匿名外部类(没构造方法)、动态外部类(static润饰的类,不能应用任何外围类的非static成员变量和办法, 不依赖外围类)
应用外部类最吸引人的起因是:每个外部类都能独立地继承一个(接口的)实现,所以无论外围类是否曾经继承了某个(接口的)实现,对于外部类都没有影响。
因为Java不反对多继承,反对实现多个接口。但有时候会存在一些应用接口很难解决的问题,这个时候咱们能够利用外部类提供的、能够继承多个具体的或者形象的类的能力来解决这些程序设计问题。能够这样说,接口只是解决了局部问题,而外部类使得多重继承的解决方案变得更加残缺。
17.string 转换成 integer的形式及原理
String —>integer Intrger.parseInt(string);
Integer—> string Integer.toString();
原理:
parseInt(String s)--外部调用parseInt(s,10)(默认为10进制)
失常判断null,进制范畴,length等
判断第一个字符是否是符号位
循环遍历确定每个字符的十进制值
通过*= 和-= 进行计算拼接
判断是否为负值 返回后果。
18.哪些状况下的对象会被垃圾回收机制解决掉?
1.所有实例都没有流动线程拜访。
2.没有被其余任何实例拜访的循环援用实例。
3.Java 中有不同的援用类型。判断实例是否合乎垃圾收集的条件都依赖于它的援用类型。
要判断怎么的对象是没用的对象。这里有2种办法:
1.采纳标记计数的办法:
给内存中的对象给打上标记,对象被援用一次,计数就加1,援用被开释了,计数就减一,当这个计数为0的时候,这个对象就能够被回收了。当然,这也就引发了一个问题:循环援用的对象是无奈被辨认进去并且被回收的。所以就有了第二种办法:
2.采纳根搜索算法:
从一个根登程,搜寻所有的可达对象,这样剩下的那些对象就是须要被回收的
19.动态代理和动静代理的区别,什么场景应用?
由程序员创立或由特定工具主动生成源代码,再对其编译。在程序运行前,代理类的.class文件就曾经存在了。动静代理类:在程序运行时,使用反射机制动态创建而成。
场景:驰名的Spring框架、Hibernate框架等等都是动静代理的应用例子
20.Java的异样体系
Throwable,Error,Exception
21.谈谈你对解析与分派的意识。
解析:Java中办法调用的指标办法在Class文件外面都是常量池中的符号援用,在类加载的解析阶段,会将其中的一部分符号援用转化为间接援用。这种解析的前提是:办法在程序真正运行之前就有一个能够确定的调用版本,并且这个办法的调用版本在运行期是不可扭转的,即“编译期可知,运行期不可变”,这类指标的办法的调用称为解析(Resolve)。
只有能被invokestatic和invokespecial指令调用的办法,都能够在解析阶段中确定惟一的调用版本,符合条件的有静态方法(invokestatic指令)、公有办法、实例构造方法、父类办法(这3个是invokespecial指令),它们在类加载的的解析阶段就会将符号援用解析为该办法的间接援用。
分派:分派是多态性的体现,Java虚拟机底层提供了咱们开发中“重载”(Overload)“和重写”(Override)的底层实现。其中重载属于动态分派,而重写则是动静分派的过程。
解析调用肯定是个动态的过程,在编译期就齐全确定,在类加载的解析阶段就将波及的符号援用全副转变为能够确定的间接援用,不会提早到运行期再去实现。
22.Java中实现多态的机制是什么?
答:办法的重写Overriding和重载Overloading是Java多态性的不同体现
重写Overriding是父类与子类之间多态性的一种体现
重载Overloading是一个类中多态性的一种体现.
23.说说你对Java反射的了解
JAVA反射机制是在运行状态中, 对于任意一个类, 都可能晓得这个类的所有属性和办法; 对于任意一个对象, 都可能调用它的任意一个办法和属性。 从对象登程,通过反射(Class类)能够获得获得类的残缺信息(类名 Class类型,所在包、具备的所有办法 Method[]类型、某个办法的残缺信息(包含修饰符、返回值类型、异样、参数类型)、所有属性 Field[]、某个属性的残缺信息、结构器 Constructors),调用类的属性或办法本人的总结: 在运行过程中取得类、对象、办法的所有信息。
24.说说你对Java注解的了解
元注解
元注解的作用就是负责注解其余注解。java5.0的时候,定义了4个规范的meta-annotation类型,它们用来提供对其余注解的类型作阐明。
1.@Target
2.@Retention
3.@Documented
4.@Inherited
因为篇幅无限,只能分享局部面试题,更多面试题及答案能够我的【Github】浏览下载哦~无偿分享给大家,算是一个感恩回馈吧
二、Android面试题(根底+进阶)(必须)
1.四大组件是什么(这个不晓得的话,没必要去面试了,转行吧)
Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver。
2.四大组件的生命周期和简略用法
activity:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
Service:
service 启动形式有两种,一种是通过startService()形式进行启动,另一种是通过bindService()形式进行启动。不同的启动形式他们的生命周期是不一样.
通过startService()这种形式启动的service,生命周期是这样:调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。这种形式启动的话,须要留神一下几个问题,第一:当咱们通过startService被调用当前,屡次在调用startService(),onCreate()办法也只会被调用一次,而onStartConmon()会被屡次调用当咱们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当咱们通过startService启动时候,通过intent传值,在onStartConmon()办法中获取值的时候,肯定要先判断intent是否为null。
通过bindService()形式进行绑定,这种形式绑定service,生命周期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 这种形式进行启动service益处是更加便当activity中操作service,比方退出service中有几个办法,a,b ,如果要在activity中调用,在须要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中外部类的类对象,而后通过这个类对象就能够调用类中的办法,当然这个类须要继承Binder对象
contentProvider:contentProvider的生命周期、了解应该跟过程一样,它作为零碎利用组件、其生命周期应该跟app利用的生命周期相似,只是它属于零碎利用、所以随系统启动而初始化,随零碎关机而完结;但也存在其余状态下完结过程、比如说零碎内存不够时,进行内存回收、会依据生成工夫态、用户操作等状况进行是否内存回收。
BroadcastReceiver:播送的生命周期从调用开始到onReceiver执行结束完结,须要留神的是,个别播送的生命周期都极短,须要在10s内解决完onReceiver中的所有工作,所以,个别不进行耗时长的工作,如果有耗时长的工作,该当通过Intent传递给Service进行解决。(留神,不要在onReceiver中开启线程进行耗时工作解决,否则,在10s后,该线程会变成空线程,从而导致工作的失落。同样的,也不要应用bindService来绑定服务。)
值得注意的是,如果是在代码中动静注册的播送,如:在Activity注册,那么在Activity的onDestory中须要应用unregisterReceiver登记播送。
3.Activity之间的通信形式
Intent
借助类的动态变量
借助全局变量/Application
借助内部工具
借助SharedPreference
应用Android数据库SQLite
赤裸裸的应用File
Android剪切板
借助Service
4.横竖屏切换的时候,Activity 各种状况下的生命周期
分两种状况:
1.不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会从新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
横竖屏切换造成 activity 的生命周期
onPause()-onSaveInstanceState()-onStop()-onDestroy()-onCreat()-onStart()-onRestoreInstanceState()-onResume()即会导致 activity 的销毁和重建 。
2.配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged办法。
onSaveInstanceState() 与onRestoreIntanceState() 资源相干的系统配置产生扭转或者资源有余时(例如屏幕旋转),以后 Activity 会销毁,并且在 onStop 之前回调 onSaveInstanceState 保留数据,在从新创立 Activity 的时候在onStart 之后回调 onRestoreInstanceState。其中 Bundle 数据会传到 onCreate(不肯定有数据)和 onRestoreInstanceState(肯定有数据)。
用户或者程序员被动去销毁一个 Activity 的时候不会回调(如代码中 finish()或用户按下 back,不会回调),其余状况都会调用,来保留界面信息。
5.Activity与Fragment之间生命周期比拟
a. 在创立的过程中,是 Activity 率领 Fragment 执行生命周期的办法,所以它们生命周期执行的程序如下:
Activity -- onCreate() ,
Fragment -- onAttach() -> onCreate() -> onCreateView() -> onActivityCreated
Activity -- onStart()
Fragment -- onStart()
Activity -- onResume()
Fragment -- onResume()
最初,在销毁时是 Fragment 率领 Activity 执行生命周期的办法:
Fragment -- onPause()
Activity -- onPause()
Fragment -- onStop()
Activity -- onStop()
Fragment -- onDestroyView() -> onDestroy() -> onDetach()
Activity -- onDestroy()
6.Activity上有Dialog的时候按Home键时的生命周期
有 Dialog 和 无 Dialog 按 Home 键成果一样:
失常启动: onCreate() -> onStart() -> onResume()
按 home 键: onPause() -> onStop()
再次启动: onRestart() -> onStart() -> onResume()
7.两个Activity 之间跳转时必然会执行的是哪几个办法?
a. 失常状况下 Activity A 跳转到 Activity B 时:
A调用 onCreate() 办法 -> onStart() 办法 -> onResume() 办法,此时 A 前台可见。当 A 跳转到 B 时,A 调用 onPause() 办法,而后调用新的 Activity B 中的 onCreate() 办法 -> onStart() 办法 -> onResume() 办法。最初 A 再调用onStop()办法。
b. 当 Activity B 为通明主题时:
除了最初 Activity A 不调用 onStop() 办法之外,其它都和 a 中的一样。
8.Activity的四种启动模式比照
此处延长:栈(First In Last Out)与队列(First In First Out)的区别
区别:队列先进先出,栈先进后出
对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
遍历数据速度不同
standard 模式
这是默认模式,每次激活Activity时都会创立Activity实例,并放入工作栈中。应用场景:大多数Activity。
singleTop 模式
如果在工作的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创立新的实例并放入栈顶,即便栈中曾经存在该Activity的实例,只有不在栈顶,都会创立新的实例。应用场景如新闻类或者浏览类App的内容页面。
singleTask 模式
如果在栈中曾经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因而在它下面的实例将会被移出栈。如果栈中不存在该实例,将会创立新的实例放入栈中。应用场景如浏览器的主界面。不论从多少个利用启动浏览器,只会启动主界面一次,其余状况都会走onNewIntent,并且会清空主界面下面的其余页面。
singleInstance 模式
在一个新栈中创立该Activity的实例,并让多个利用共享该栈中的该Activity实例。一旦该模式的Activity实例曾经存在于某个栈中,任何利用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其成果相当于多个利用共享一个利用,不论谁激活该 Activity 都会进入同一个利用中。应用场景如闹铃揭示,将闹铃揭示与闹铃设置拆散。singleInstance不要用于两头页面,如果用于两头页面,跳转会有问题,比方:A -> B (singleInstance) -> C,齐全退出后,在此启动,首先关上的是B。
9.Activity状态保留于复原
当 Activity 在异常情况( 零碎内存不足或者系统配置产生了扭转等 )被销毁重建后, 在销毁的时候 Activity 会调用 onSaveInstanceState() 办法用于保留 Activity 相干的状态和数据,而后在重建后的 Activity 的中咱们能够通过 onCreate() 或者 onRestoreInstanceState() 办法复原数据,这里咱们须要留神的是如果通过 onCreate() 办法复原,那么得先判断它的 intent 参数 是否为空,如果在 onRestoreInstanceState() 办法复原就不会,因为只有 onRestoreInstanceState() 办法被调用就阐明肯定有数据,不会为空。Google 举荐应用 onRestoreInstanceState() 办法。
10.如何实现Fragment的滑动?
将Fragment与viewpager绑定,通过viewpager中的touch事件,会进行move事件的滑动解决。
11.fragment之间传递数据的形式?
1、在fragment中设置一个办法,而后进行调用
2、采取接口回调的形式进行数据传递。
3、播送或者是应用三方开源框架:EventBus
12.Activity 怎么和Service 绑定?怎么在Activity 中启动本人对应的Service?
1、activity能进行绑定得益于Serviece的接口。为了反对Service的绑定,实现onBind办法。
2、Service和Activity的连贯能够用ServiceConnection来实现。须要实现一个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected办法,一旦连贯建设,就能失去Service实例的援用。
3、执行绑定,调用bindService办法,传入一个抉择了要绑定的Service的Intent(显示或隐式)和一个你实现了的ServiceConnection的实例
13.service和activity怎么进行数据交互?
1.通过 broadcast:通过播送发送音讯到 activitry
2.通过 Binder:通过与 activity 进行绑定
(1)增加一个继承 Binder 的外部类,并增加相应的逻辑办法。
(2)重写 Service 的 onBind 办法,返回咱们刚刚定义的那个外部类实例。
(3)Activity 中创立一个 ServiceConnection 的匿名外部类,并且 重 写 里 面 的 onServiceConnected 方 法 和onServiceDisconnected 办法,这两个办法别离会在流动与服务胜利绑定以及解除绑定的时候调用(在onServiceConnected办法中,咱们能够失去一个方才那个 service 的 binder 对象,通过对这个 binder 对象进行向下转型,失去咱们那个自定义的 Binder 实例,有了这个实例,做能够调用这个实例外面的具体方法进行须要的操作了)。
14.Service的开启形式,请形容一下Service 的生命周期,请形容一下Service 的生命周期
service 启动形式有两种,一种是通过startService()形式进行启动,另一种是通过bindService()形式进行启动。不同的启动形式他们的生命周期是不一样.
通过startService()这种形式启动的service,生命周期是这样:调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。这种形式启动的话,须要留神一下几个问题,第一:当咱们通过startService被调用当前,屡次在调用startService(),onCreate()办法也只会被调用一次,而onStartConmon()会被屡次调用当咱们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当咱们通过startService启动时候,通过intent传值,在onStartConmon()办法中获取值的时候,肯定要先判断intent是否为null。
通过bindService()形式进行绑定,这种形式绑定service,生命周期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 这种形式进行启动service益处是更加便当activity中操作service,比方退出service中有几个办法,a,b ,如果要在activity中调用,在须要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中外部类的类对象,而后通过这个类对象就能够调用类中的办法,当然这个类须要继承Binder对象
15.请形容一下播送BroadcastReceiver的了解
播送,是一个全局的监听器,属于Android四大组件之一。Android 播送分为两个角色:播送发送者、播送接收者。作用是监听 / 接管 利用 App 收回的播送音讯,并 做出响应
可利用在:
Android不同组件间的通信(含 :利用内 / 不同利用之间)
多线程通信
与 Android 零碎在特定状况下的通信
如:电话呼入时、网络可用时
16.Broadcast注册形式与区别 (此处延长:什么状况下用动静注册)
Broadcast播送,注册形式次要有两种.
第一种是动态注册,也可成为常驻型播送,这种播送须要在Androidmanifest.xml中进行注册,这中形式注册的播送,不受页面生命周期的影响,即便退出了页面,也能够收到播送这种播送个别用于想开机自启动啊等等,因为这种注册的形式的播送是常驻型播送,所以会占用CPU的资源。
第二种是动静注册,而动静注册的话,是在代码中注册的,这种注册形式也叫十分驻型播送,收到生命周期的影响,退出页面后,就不会收到播送,咱们通常使用在更新UI方面。这种注册形式优先级较高。最初须要解绑,否会会内存泄露
播送是分为有序播送和无序播送。
17.本地播送和全局播送有什么差异?
BroadcastReceiver是针对利用间、利用与零碎间、利用外部进行通信的一种形式
LocalBroadcastReceiver仅在本人的利用内发送接管播送,也就是只有本人的利用能收到,数据更加平安播送只在这个程序里,而且效率更高。
18.BroadcastReceiver,LocalBroadcastReceiver 区别
一、利用场景不同
1、BroadcastReceiver用于利用之间的传递音讯;
2、而LocalBroadcastManager用于利用外部传递音讯,比broadcastReceiver更加高效。
二、应用安全性不同
1、BroadcastReceiver应用的Content API,所以实质上它是跨利用的,所以在应用它时必须要思考到不要被别的利用滥用;
2、LocalBroadcastManager不须要思考平安问题,因为它只在利用外部无效。
19.AlertDialog,popupWindow区别
(1)Popupwindow在显示之前肯定要设置宽高,Dialog无此限度。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会隐没。
(3)Popupwindow不会给页面其余的局部增加蒙层,而Dialog会。
(4)Popupwindow没有题目,Dialog默认有题目,能够通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);勾销题目
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都能够通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
最实质的区别:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后盾还能够做事件;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会期待,在PopupWindow退出前,程序始终期待,只有当咱们调用了dismiss办法的后,PopupWindow退出,程序才会向下执行。
20.解说一下Context
Context是一个形象基类。在翻译为上下文,也能够了解为环境,是提供一些程序的运行环境根底信息。Context下有两个子类,ContextWrapper是上下文性能的封装类,而ContextImpl则是上下文性能的实现类。而ContextWrapper又有三个间接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个间接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity须要主题,Service不须要主题。Context一共有三种类型,别离是Application、Activity和Service。这三个类尽管别离各种承当着不同的作用,但它们都属于Context的一种,而它们具体Context的性能则是由ContextImpl类去实现的,因而在绝大多数场景下,Activity、Service和Application这三种类型的Context都是能够通用的。不过有几种场景比拟非凡,比方启动Activity,还有弹出Dialog。出于平安起因的思考,Android是不容许Activity或Dialog凭空出现的,一个Activity的启动必须要建设在另一个Activity的根底之上,也就是以此造成的返回栈。而Dialog则必须在一个Activity下面弹出(除非是System Alert类型的Dialog),因而在这种场景下,咱们只能应用Activity类型的Context,否则将会出错。
getApplicationContext()和getApplication()办法失去的对象都是同一个application对象,只是对象的类型不一样。
Context数量 = Activity数量 + Service数量 + 1 (1为Application)
21.Android属性动画个性
(1) 对任意对象的属性执行动画操作:属性动画容许对任意对象的属性执行动画操作,因为属性动画的性质是通过反射实现的。
(2)可扭转背景色彩。
(3)真正扭转 View 自身:因为是通过反射扭转其属性,并刷新,如扭转width,他会搜寻getWidth(),反射获取,再通过进行某种计算,将值通过setWidth()设置进去并更新。
22.LinearLayout、RelativeLayout、FrameLayout的个性及比照,并介绍应用场景。
RelativeLayout的onMeasure过程
依据源码咱们发现RelativeLayout会依据2次排列的后果对子View各做一次measure。
首先RelativeLayout中子View的排列形式是基于彼此的依赖关系,在确定每个子View的地位的时候,须要先给所有的子View排序一下,所以须要横向纵向别离进行一次排序测量
23.LinearLayout的onMeasure过程
LinearLayout会先做一个简略横纵方向判断
须要留神的是在每次对child测量结束后,都会调用child.getMeasuredHeight()/getMeasuredWidth()获取该子视图最终的高度,并将这个高度增加到mTotalLength中。
然而getMeasuredHeight临时避开了lp.weight>0且高度为0子View,因为前面会将把残余高度按weight调配给相应的子View。因而能够得出以下论断:
(1)如果咱们在LinearLayout中不应用weight属性,将只进行一次measure的过程。(如果应用weight属性,则遍历一次wiew测量后,再遍历一次view测量)
(2)如果应用了weight属性,LinearLayout在第一次测量时获取所有子View的高度,之后再将残余高度依据weight加到weight>0的子View上。由此可见,weight属性对性能是有影响的。
1)RelativeLayout慢于LinearLayout是因为它会让子View调用2次measure过程,而LinearLayout只需一次,然而有weight属性存在时,LinearLayout也须要两次measure。
2)在不响应层级深度的状况下,应用Linearlayout而不是RelativeLayout。
24.谈谈对接口与回调的了解
接口回调就是指: 能够把应用某一接口的类创立的对象的援用赋给该接口申明的接口变量,那么该接口变量就能够调用被类实现的接口的办法。实际上,当接口变量调用被类实现的接口中的办法时,就是告诉相应的对象调用接口的办法,这一过程称为对象性能的接口回调。
25.Android中View,SurfaceView和GLSurfaceView
View:显示视图,内置画布,提供图形绘制函数,触屏事件,按键事件函数;必须在UI线程中更新画面,速度较慢。
SurfaceView:基于View视图进行拓展的视图类,更适宜2D游戏的开发;是View的子类,相似双缓机制,在新的线程中更新画面,所以刷新界面速度比View快。(双缓机制:即前台缓存和后盾缓存,后盾缓存计算场景、产生画面,前台缓存显示后盾缓存已画好的画面。)
GLSurfaceView:基于SurfaceView视图再次进行扩大的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,OpenGL专用。(OpenGL:是一个凋谢的三维图形软件包。)
26.序列化的作用,以及Android两种序列化的区别
作用:java序列化次要有2个作用:
对象长久化,对象生存在内存中,想把一个对象长久化到磁盘,必须已某种形式来组织这个对象蕴含的信息,这种形式就是序列化;
近程网络通信,内存中的对象不能间接进行网络传输,发送端把对象序列化成网络可传输的字节流,接收端再把字节流还原成对象。
Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量长期变量的生成,外部执行大量的i/o操作,效率很低。
Parcelable Android 序列化接口 效率高 应用麻烦 在内存中读写(AS有相干插件 一键生成所需办法) ,对象不能保留到磁盘中
27.差值器和估值器
差值器: 依据工夫流逝的百分比计算以后属性扭转的百分比。
估值器: 依据以后属性扭转的百分比计算扭转后的属性值
28.Android中数据存储形式
1 应用SharedPreferences存储数据
适用范围:保留大量的数据,且这些数据的格局非常简单:字符串型、根本类型的值。
比方应用程序的各种配置信息(如是否关上音效等),解锁口 令明码等
外围原理:保留基于XML文件存储的key-value键值对数据,通常用来存储一些简略的配置信息。
2 文件存储数据
外围原理: Context提供了两个办法来关上数据文件里的文件IO流:
FileInputStream openFileInput(String name);
FileOutputStream openFileOutput(String name , int mode)
3 SQLite数据库存储数据
4 应用ContentProvider存储数据
5 网络存储数据
Requestlayout,onlayout,onDraw,DrawChild区别与分割
requestLayout()办法 :会导致调用measure()过程 和 layout()过程 。 阐明:只是对View树从新布局layout过程包含measure()和layout()过程,不会调用draw()过程,但不会从新绘制 任何视图包含该调用者自身。
onLayout()办法(如果该View是ViewGroup对象,须要实现该办法,对每个子视图进行布局)
调用onDraw()办法绘制视图自身 (每个View都须要重载该办法,ViewGroup不须要实现该办法)
drawChild()去从新回调每个子视图的draw()办法
29.invalidate和postInvalidate的区别及应用
1、postInvalidate() 办法在非 UI 线程中调用,告诉 UI 线程重绘。
2、invalidate()办法在 UI 线程中调用,重绘以后 UI。Invalidate不能间接在线程中调用,因为他是违反了单线程模型:Android UI操作并不是线程平安的,并且这些操作必须在UI线程中调用。
Activity-Window-View三者的差异
这个问题真的很不好答复。所以这里先来个算是比拟失当的比喻来形容下它们的关系吧。Activity像一个工匠(管制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。
1:Activity结构的时候会初始化一个Window,精确的说是PhoneWindow。
2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。
3:“ViewRoot”通过addView办法来一个个的增加View。比方TextView,Button等
4:这些View的事件监听,是由WindowManagerService来承受音讯,并且回调Activity函数。比方onClickListener,onKeyDown等。
30.ActivityThread,AMS,WMS的工作原理
Activity与Window:
Activity只负责生命周期和事件处理
Window只管制视图
一个Activity蕴含一个Window,如果Activity没有Window,那就相当于Service。
因为篇幅无限,只能分享局部面试题,更多面试题及答案能够我的【Github】浏览下载哦~无偿分享给大家,算是一个感恩回馈吧