Android面试题及其答案(三)
Android面试题及其答案(三)
abcijkxyz 发表于1年前
Android面试题及其答案(三)
  • 发表于 1年前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 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数据库文件。



共有 人打赏支持
粉丝 58
博文 6068
码字总数 1876
×
abcijkxyz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: