文档章节

Android面试题及其答案(三)

abcijkxyz
 abcijkxyz
发布于 2016/07/30 17:24
字数 2256
阅读 3
收藏 0
1、list map set三个接口,存取元素时,各有什么特点?
List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。
Set里面不允许有重复的元素.
存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。
取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。 
List表示有先后顺序的集合.
存元素:多次调用add(Object)方法时,每次加入的对象按先后顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍历各个元素
        方法2:调用get(index i)来明确说明取第几个。 
Map是双列的集合,每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。
存元素:存放用put方法:put(obj key,obj value)。
取元素:用get(Object key)方法根据key获得相应的value;
        也可以获得所有的key的集合,还可以获得所有的value的集合;
        还可以获得key和value组合成的Map.Entry对象的集合。 
List以特定次序来持有元素,可有重复元素。Set无法拥有重复元素,内部排序。Map 存key-value值,key不能重复。
2、Collection是什么?
Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
3、ArrayList vs Vector
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按 序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
4、HashMap vs Hashtable
HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全效率上可能高于 Hashtable。 HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的 方法实现同步,而 HashMap 就必须为之提供外同步。
Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。
5、sleep vs wait
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时间后会自动恢复。调用 sleep 不会释放对象锁。
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发 出 notify(或 notifyAll)方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。
6、android touch事件分发机制
View关键的函数:dispatchTouchEvent,onTouch,onTouchEvent,onClieck。
ViewGroup关键函数:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。
onInterceptTouchEvent返回true就代表拦截子view的touch事件,那么此时就交由父类view的dispatchTouchEvent处理。
详细流程请参另一篇博文:http://blog.csdn.net/wdong_love_cl/article/details/51477607
7、android断点续传下载实现的大致思路
以下载为例:
使用HttpURLConnection进行下载,使用RandomAccessFile进行文件写入。
1、需要获取需要下载的文件大小并设置到本地文件,使用:
int filesize = 0;
filesize = httpURLConnection.getContentLength();
RandomAccessFile file;
file.setLength(filesize);
2、根据文件大小和线程数来确定每个线程需要下载的大小,如:文件的大小为8M,有4个线程,那么每个线程就需要下载2M。
3、确定每个线程下载的开始和结束位置 httpURLConnection.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
4、可以使用file.seek(position)来明确规定从什么地方开始写入;
8、handler.sendmessage的大致步骤
消息存到消息队列:
handler.sendMessage()-->handler.sendMessageDelayed()-->handler.sendMessageAtTime()-->msg.target = this[就是handler];queue.enqueueMessage()==>把msg添加到消息队列中
从消息队列取出并处理:
Looper.loop()[死循环,不停从消息队列取消息]--> msg.target.dispatchMessage(msg)--->handler.handleMessage()
详细流程请参另一篇博文:http://blog.csdn.net/wdong_love_cl/article/details/43572773
9、android scrollview嵌套viewpager滑动冲突
两种解决方法:
1、重写scrollview类的onInterceptTouchEvent方法,如果发现是水平滑动的话,那就在该方法内返回false,这样就不拦截viewpager了,会执行viewpager的onTouchEvent方法;
2、重写viewpager中的onTouchEvent方法,如果MotionEvent.ACTION_DOWN或者MotionEvent.ACTION_MOVE的水平滑动就设置getParent().requestDisallowInterceptTouchEvent(true),如果是竖直滑动就设置为false.
10、Android fregment 的使用
详情见:http://blog.csdn.net/wdong_love_cl/article/details/51569440
11、String str1="abc" 和 String str1=new String("abc"); 这两个的区别是什么?
前者在编译的时候就将"abc"放在方法区的字符串常量池当中,并利用str1指向这个字符串常量,而后者是在运行的时候,在堆区创建一个字符串对象"abc"并利用str1指向这个对象,因此两个str1指向的内存地址不同,而逻辑上输出的内容相同。
12、android的官方建议应用程序的开发采用mvc模式,何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给model处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
13、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
可以将dictionary.db文件复制到工程中的res/raw目录中。所有在res/raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。
14、如何打开res/raw目录中的数据库文件?
在Android中不能直接打开res /raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android中可以使用SQLiteDatabase.openOrCreateDatabase()方法来打开任意目录中的SQLite数据库文件。



本文转载自:http://blog.csdn.net/wdong_love_cl/article/details/51638936

共有 人打赏支持
abcijkxyz
粉丝 64
博文 6196
码字总数 1876
作品 0
深圳
项目经理
Android开发工程师面试指南(面试题集附答案、简历模板)

给Android开发工程师的一份面试指南,包含面试题集与简历模板。 面试题集 面试题集里的答案大部分来源于我的博客,因此这个题集也相当于是我的博客的精华版,希望对需要面试的Android同学有所...

郭孝星
04/08
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
投稿006期| 回忆一次美团Android校招

写在前面 今天和一同学吃饭,互相诉了一波苦。他吐槽了一下这周五去美团面试不是很顺利,我吐槽了一下,业务大改版。这一个月恐怕要疯狂加班... 他提到美团的时候,这让我想起来了2017年10月...

挚爱灬丶
07/17
0
0
阿里腾讯百度头条美团iOS面试总结

阿里腾讯百度头条美团iOS面试总结 2018-05-30 15:24编辑: garace分类:程序人生来源:代码湾 互联网面试iOS 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS开发工...

garace
05/30
0
0
BATJ等大厂最全经典面试题分享

金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、蚂蚁金服、小米、乐视、美团、58、...

老道士
09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列(2):图层基础操作

//图层相关demo layerFun: function () { //获取地图的所有图层(不包括的图层类型:底图图层(basemaps)) let layers = this.map.layers; ...

canneljls
1分钟前
0
0
MySQL忘记root密码--不重启mysqd重置root密码

先提个问题:如何不重启mysqld,且没有权限修改用户账号和权限的情况下,如何重新设置root密码?不知道没关系,在此之前我也是不知道如何操作的,先看看下面的几种重置root密码的方法。 1、s...

IT--小哥
3分钟前
0
0
php7不再支持HTTP_RAW_POST_DATA,微信支付$GLOBALS[‘HTTP_RAW_POST_DATA’]获取不到数据,

升级到php7后, 发现旧的web系统有些问题, 查看后才发现原来是php7不再支持HTTP_RAW_POST_DATA 原来系统一些地方, 使用$GLOBALS[‘HTTP_RAW_POST_DATA’]来获取数据, 在php7里无法获取了 ...

15834278076
4分钟前
0
0
Android--拨打电话功能

Intent callIntent = new Intent(); callIntent.setAction(Intent.ACTION_DIAL); callIntent.setData(Uri.parse("tel:" + "4008823823")......

lanyu96
10分钟前
0
0
iOS多种刷新样式、音乐播放器、仿抖音视频、旅游App等源码

iOS精选源码 企业级开源项目,模仿艺龙旅行App 3D立体相册,可以旋转的立方体 横竖屏切换工具,使用陀螺仪检测手机设备方向,锁屏状... Swift版Refresh(可以自定义多种样式)架构方面有所优化...

Android爱开源
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部