面试准备android
Posted 酷叮喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试准备android相关的知识,希望对你有一定的参考价值。
在牛客(一个很多笔试面试交流的平台,感觉每天一套可以萌萌哒(☆_☆))上看到一个大神,简直是offer收割机TAT,其面经中好多东西都是基础,觉得自己有必要总结并学习我不懂的模块,趁我还有时间,加油!!
ps:大部分内容都是网上查找的,有侵权的话,立删(m(_ _)m)
------------------------------
1、Volley 是 Google 推出的 android 异步网络请求框架和图片加载框架。Volley 的特点:特别适合数据量小,通信频繁的网络操作,防止OOM发生,listview,每行都是从网络上获取的一个图片和几行文本,使用Volley
StringRequest、JsonRequest、ImageRequest
为了发送一个请求,你可以通过构造方法new出来一个Request,然后调用add()把请求添加进RequestQueue中,当调用add方法时,Volley会运行一个缓存处理线程和一个网络调度线程池.如果请求被缓存线程已经缓存的话,请求将不会放进请求队列,也就是说不会发出Http请求。而会直接复用请求,并将数据返回到主线程。如果缓存线程中没有缓存到请求的话,请求将会放进请求队列,网络请求成功后, 请求将会被缓存进cache,接着网络调度线程将处理该请求,并解析数据。
http://blog.csdn.net/guolin_blog/article/details/17482095 其他的,未看
2、九种基本数据类型的大小,以及他们的封装类。
3、Switch能否用string做参数?(整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int所以可以,而long、float、double类型不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。注意:String类型是Java7开始支持的。)
4、equals与==的区别
==可以用来比较基本类型和引用类型,判断内容和内存地址;
equals只能用来比较引用类型,它只判断内容。
5、Object有哪些公用方法?
方法equals测试的是两个对象是否相等,
方法clone进行对象拷贝,
方法getClass返回和当前对象相关的Class对象,
方法notify,notifyall,wait都是用来对给定对象进行线程同步的.
6、 Java的四种引用,强弱软虚,用到的场景。
强引用就是我们平常使用对象的方式,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。当方法运行完之后,变量不存在了,所以它们指向的对象都会被JVM回收。
但如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
软引用通过 SoftReference 创建,在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。软引用的这种特性使得它很适合用来解决 OOM 问题,实现缓存机制,例如:图片缓存、网页缓存等等……软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。
弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个弱引用就会被加入到与之关联的引用队列中。
虚引用并不会影响对象的生命周期。如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
假设你现在持有一个 String——”hello” 的虚引用 pr,那么当垃圾回收器回收 hello 的时候,就会把虚引用放入引用队列 queue 之中,然后完成回收。简单来说,就是让你知道对象被回收了。
7、 Hashcode的作用。
Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以 直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了;不相同,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。所以这里存在一个冲突解决的问题(很少出现)。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相等,那么它们的hashCode值一定要相等;
2、如果两个对象的hashCode相等,它们并不一定相等。
8、ArrayList、LinkedList、Vector的区别。
ArrayList内部是通过数组实现的。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
Vector数组实现的,线程安全级别。它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。同时Vector查询数据有迭代器,有枚举,有get(int index),有indexOf(int index)四种方式,而ArrayList却没有枚举。
LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
9、String、StringBuffer与StringBuilder的区别。 http://hualang.iteye.com/blog/1181469
StringBuffer(缓存)线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中
1.如果要操作少量的数据用 = String ,字符+成一句话,用string快
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder (不安全)
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer (线程安全)
10、Map、Set、List、Queue、Stack的特点与用法。(用法:http://www.cnblogs.com/LittleHann/p/3690187.html )
1) Collection:每个位置只能保存一个元素(对象)
1.1) List必须保持元素特定的顺序,有序可重复,顺序索引
1.2) Set不能有重复元素,用equals判断
1.3) Queue保持一个队列(先进先出)的顺序
2) Map:一组成对的”键值对”对象,像一个小型数据库。我们可以通过”键”找到该键对应的”值”
用于保存具有”映射关系”的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。key和value都可以是任何引用类型的数据。Map的key不允
许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
关于Map,我们要从代码复用的角度去理解,java是先实现了Map,然后通过包装了一个所有value都为null的Map就实现了Set集合
11、HashMap和HashTable和ConcurrentHashMap的区别
HashMap是非同步,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行);不能保证随着时间的推移Map中的元素次序是不变的。
而Hashtable是同步,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。;单线程环境下它比HashMap要慢。与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
ConcurrentHashMap是使用了锁分段技术技术来保证线程安全的。
锁分段技术:首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
12、TreeMap、HashMap、LindedHashMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。
13、Collection包结构,与Collections的区别
Collection是集合类的上级接口,子接口主要有Set 和List、Map。
Collections是针对集合类的一个帮助类,各种有关集合操作的静态多态方法,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
14、 try catch finally,try里有return,finally还执行么?(执行)
finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。除非调用system.exit()让程序退出或断电等因素致使程序中止,否则,无论任何因素,finally块都一定会执行!!
15、 Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
Java将可抛出(Throwable)的结构分为三种类型: 被检查的异常(Checked Exception),运行时异常(RuntimeException)和错误(Error)。
http://www.cnblogs.com/yumo/p/4909617.html
Out Of Memory(OOM):引起OOM主要有2个原因,分别是内存泄漏和内存溢出(即堆溢出和栈溢出)。
Stack Over Flow(SOF):(堆)栈溢出主要发生在递归的调用中 。
OOM和SOF:递归调用可以导致栈溢出,不断创建对象可以导致堆溢出。
16、Java面向对象的三个特征与含义。
封装性:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter()和setter()间接访问。
继承性:子类通过一种方式来接受父类所有的公有的,受保护的成员变量和成员方法。
多态性:程序在运行的过程中,同一种类型在不同的条件下表现不同的结果,这种不定状态的表现形式称为多态性。
17、Override和Overload的含义和区别
区别:重写(Override)是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。如果在子类中定义某方法与其
重写(Override):父类有相同的名称和参数,我们说该方法被重写 (Override)。子类的对象使用这个方法时,将调用子类中的定义,而父类中的定义如同被屏蔽了。
重载(Overload):如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overload)。
18. interface与abstract类的区别。
19. Static class 与non static class的区别 [23]。
解析:在Java中可以有静态实例变量、静态方法、静态块,当然也可以有静态类,但是用static不能修饰顶级类,只能修饰内部类。
静态内部类和非静态内部类究竟有什么区别呢?
内部静态类不需要有指向外部类的引用,因为用static声明的静态内部类变成了外部类,但是非静态内部类需要持有对外部类的引用;
非静态内部类能够访问外部类的静态和非静态成员(数据成员和成员函数),但是静态内部类只能访问外部类的静态成员(数据成员和成员函数);
非静态内部类不能脱离外部类实体被创建,但是非静态内部类可以访问外部类的数据和函数,因为它就在外部类里面;
如果在方法中定义的内部类要想访问方法中的参数,那么必须在参数前加上final关键字。
20. Java多态的实现原理 [24]。
解析:
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
以上是关于面试准备android的主要内容,如果未能解决你的问题,请参考以下文章
Android 岗社招面试该怎么准备?这份面试指南你一定要看看
Android 岗社招面试该怎么准备?这份面试指南你一定要看看
Android 岗社招面试该怎么准备?这份面试指南你一定要看看