您的位置:首页 > 职场人生

Android面试题四-简答题

2017-05-05 10:52 176 查看
1.什么是面向对象

答. Java面向对象的三大基本特性:

1. 继承:

(1).目的:实现代码的复用。

(2).遵循里氏代换原则。也就是开闭原则。修改关闭,扩展开放。

(3).结果:子类继承父类的属性和方法。但是不能继承父类的构造方法和私有属性。子类可以扩展自己的属性和方法。目的是实现功能的扩展性。子类也可以覆写父类的方法,实现具体的功能。

2. 封装:

(1).概念:将对象的私有属性封装起来。通过公开的行为方法改变对象的私有属性信息。不需要知道方法的具体实现,只需要通过对象提供的接口(对象名和参数)访问该对象。

(2).优点:分工专业明确。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。隐藏信息,实现细节。通过控制访问权限可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

3. 多态:

(1).概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。子类以父类的身份出现,但做事情时还是以自己的方法实现。

面向对象编程:

1.优点:在软件开发中,面向对象编程是当今最流行的程序设计技术,它具有代码易于维护、可扩展性好和代码可重用等优点。

2.类:

(1).类是具有相同属性和行为的一组对象的集合。具有相同的属性和行为,只是在执行某一个行为的时候达到的效果是不一样的。

(2).类是一种新的数据类型。 对象=属性+行为。在软件开发中要将数据与行为分离来进行设计。

2.什么是多线程编程及应用场景


通俗的解释一下多线程先:

多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推土机一起来处理,当然速度就快了,不过由于位置的限制,如果20个推土机,那么推土机之间会产生相互的避让,相互摩擦,相互拥挤,反而不如10个处理的好,所以,多线程处理,线程数要开的恰当,就可以提高效率。

多线程使用的目的:

1、 吞吐量:做WEB,容器帮你做了多线程,但是它只能帮你做请求层面的,简单的说,就是一个请求一个线程(如struts2,是多线程的,每个客户端请求创建一个实例,保证线程安全),或多个请求一个线程,如果是单线程,那只能是处理一个用户的请求

2、 伸缩性:通过增加CPU核数来提升性能。

多线程的使用场景:

1、 常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器)

2、 servlet多线程

3、 FTP下载,多线程操作文件

4、 数据库用到的多线程

5、 分布式计算

6、 tomcat,tomcat内部采用多线程,上百个客户端访问同一个WEB应用,tomcat接入后就是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用我们的servlet程序,比如doGet或者dpPost方法

7、 后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集

8、 自动作业处理:比如定期备份日志、定期备份数据库

9、 异步处理:如发微博、记录日志

10、 页面异步处理:比如大批量数据的核对工作(有10万个手机号码,核对哪些是已有用户)

11、 数据库的数据分析(待分析的数据太多),数据迁移

12、 多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割给多个线程完成

13、 desktop应用开发,一个费时的计算开个线程,前台加个进度条显示

14、 swing编程

举一个小栗子:

一个文本文件有100M,全是字符串,我要执行切分字符串,每达到N长度便执行切腹,最后求切分完成的字符串的集合

单线程处理:读取文本文件数据,扫描全部数据,一个一个的切分,最后消耗时间=文件传输时间(文本数据加载到内存)+切分过程消耗

多线程处理:

专门设置一个线程执行加载数据的操作,此时,如果加载的数据达到一个设定值,启动一个切线程处理,如此继续,多个切分字符串的线程能够并发执行,CPU的利用率提高了(文件传输的过程中没有占用处理器,而可以将加载的部分数据分配给切分线程,占用处理器来执行任务)

总结:

单线程处理,文件加载的过程中,处理器一直空闲,但也被加入到总执行时间之内,串行执行切分总时间,等于每切分一个时间*切分后字符串的个数,执行程序,估计等几分钟能处理完就不错了

多线程处理,文件加载过程与拆分过程,拆分过程与拆分过程,都存在并发——文件加载的过程中就执行了切分任务,切分任务执行过程中多线程并行处理,总消耗时间能比单线程提高很多,甚至几个数量级都不止。

3.Activity的生命周期及应用场景

#1完整生命周期代码如下。

?
完整生命周期 oncreate--》onstart--》onresume--》onpause--》onstop--》ondestory

可视生命周期 onstart--》onresume--》onpause--》onstop

前台生命周期 onresume--》onpause 界面用户仍然可见,但是失去焦点

#3使用场景

1.应用程序退出自动保存数据 ondestory oncreate

2.应用程序最小化 暂停的操作 onstop onstart 视频播放器

3.游戏的暂停和开始 前台生命周期

#4Tips

创建时调用oncreate() ----销毁时调用ondestory()

当activity界面用户可见的时候调用的方法onStart() ----当activity界面用户不可见的时候调用的方法onStop()

界面开始获取到焦点对应的方法。 (界面按钮可以被点击,文本框可以输入内容)onResume() ----界面失去焦点对应的方法(暂停)(按钮不可被点击,文本框不可输入内容,但是界面用户仍然能看见onPause()

4.简述事件传递机制

触摸事件对应MotionEvent类,三种事件类型:ACTION_DOWN,ACTOIN_MOVE,ACTION_UP。

事件传递的三个阶段:

分发(Dispatch)

方法:public boolean dispatchTouchEvent(MotionEvent ev)

拦截(Intercept)

方法:public boolean onInterceptTouchEvent(MotionEvent ev)

消费(Consume)

方法:public boolean onTouchEvent(MotionEvent event)

dispatchTouchEvent 和 onTouchEvent return false,事件都回传给父控件的onTouchEvent处理。

dispatchTouchEvent 返回值为 false,意味着事件停止往子View分发,并往父控件回溯。

onTouchEvent 返回值为 false,意味着不消费事件,并往父控件回溯。

return super.xxxxxx() 就会让事件依照U型的方向的完整走完整个事件流动路径。

ViewGroup的dispatchTouchEvent方法返回super的时候,默认调用onInterceptTouchEvent

onInterceptTouchEvent return true时, 拦截事件并交由自己的onTouchEvent处理

onInterceptTouchEvent return super和false, 不拦截事件,并将事件传递给子View。super.onInterceptTouchEvent(ev)的默认实现返回值为false。

dispatchTouchEvent 和 onTouchEvent 一旦return true,终结事件传递;

5.如何做版本升级

(1)点击事件判断是否有新版本更新

(2)自定义一个通知 同时刷新下载进度

3) 异步下载新版本app

(4) 隐士意图来安装

或者

1.进入程序

2.检查是否有版本更新,如果有则询问用户是否更新,否则维持原状

3.检测当前网络状态并且询问用户是否进行版本更新,如果是则进行更新,否则维持原状

4.切换网络,当当前网络为wifi时,检查版本更新,重复2、3

6.==和===的区别是什么

”==”与”===”是不同的,一个是判断值是否相等,一个是判断值及类型是否完全相等。

下面的规则用于判定===运算符比较的两个值是否相等的判断条件

•如果两个值的类型不同,它们就不相同。

•如果两个值是数字,而且值相同,那么除非其中一个或两个都是NaN(这种情况它们不是等同的),否则它们是等同的。值NaN永远不会与其他任何值等同,包括它自身(奇怪的家伙),要检测一个值是否是NaN,可以使用全局函数isNaN()。

•如果两个值都是字符串,而且在串中同一位置上的字符完全相同,那么它们就完全等同。如果字符串的长度或内容不同,它们就不是等同的。

•如果两个值都是布尔型true,或者两个值都是布尔型false,那么它们等同。

•如果两个值引用的是同一个对象、数组或函数,那么它们完全等同。如果它们引用的是不同的对象(数组或函数),它们就不完全等同,即使这两个对象具有完全相同的属性,或两个数组具有完全相同的元素。

•如果两个值都是null或都是undefined,它们完全相同。

下面的规则用于判定==运算符比较的两个值是否相等的判断条件

•如果两个值具有相同的类型,那么就检测它们的等同性。如果这两个值完全相同,它们就相等。如果它们不完全相同,则它们不相等。

•如果两个值的类型不同,它们仍然可能相等。用下面的规则和类型转换来检测它们的相等性 ◦如果一个值是null,另一个值是undefined,它们相等。

◦如果一个值是数字,另一个值是字符串,把字符串转换为数字,再用转换后的值进行比较。

◦如果一个值为true,将它转化为1,再进行比较。如果一个值为false,把它转化为0,再进行比较。

◦如果一个值是对象,另一个值是数字或字符串,将对象转换成原始类型的值,再埋比较。可以使用对象的toString()方法或valueOf()方法把对象转化成原始类型的值。JavaScript核心语言的内部类通常先尝试valueOf()方法转换,再尝试toString()方法转换,但是对于Date类,则先执行toString()方法再执行valueOf()方法转换。不属于JavaScript核心语言的对象则可以采用JavaScript实现定义的方式把自身转换成原始数值。

◦其他的数值组合是不相等的。

== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。



=== 和 !== 只有在相同类型下,才会比较其值。

7.什么事数据库建表的三范式

数据库建表三范式简介

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

在实际开发中最为常见的设计范式有三个:

一范式1NF(确保每列保持原子性)

1、 数据库表的每一行都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

2、 表的每一行包含一个实例的信息。

第二范式2NF

1、 要求数据库表中的每个实例或行必须是唯一的。为实现区分,通常需要为表加一个列,以存储各个实例的唯一标识(即主键)。

2、 实体的属性完全依赖于主关键字。所谓完全依赖指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个 新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。总之第二范式就是非主属性非部分依赖于主关 键字。

第三范式3NF

一个数据库表中不包含已在其他表中已包含的非主关键字信息。例如存在一个部门信息表,其中每个部门有部门编号DEPT_ID、部门名称、部门简介等信息。那么在员工信息表中列出的部门编号DEPT_ID后,就不能再有关于部门的其他信息,否则就会造成数据冗余

8.将一个字符串逆序,不要使用反转函数

public class Test {

public static void main(String[] args) {

String message = "Hello China!";

StringBuilder str = new StringBuilder();

for (int i = message.length() - 1; i >= 0 ; i--) {

str.append(message.charAt(i));

}

System.out.println(str.toString());

}

}

9.在三角形的三个顶点上各有一只蚂蚁,它们向另一个顶点运动,目标随机(可能为另外两个顶点的任意一个)。问三只蚂蚁不相撞的概率是多少?

10.若有一头小母牛,从出生起第四个年头开始每年生一头,生的牛有50%的概率为母牛,只有母牛能生小牛,并且所有的牛从10岁开始,每年会增加10%的死亡率,问N年后有几头牛?

最后两题的答案大家有好的方法可以贴出来。

以上是实际面试中遇到的一些问题,大家可以看看,做个参考和借鉴,如果回答的有不对的或者不够完整的,欢迎补充修改提出意见,谢谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: