==和equals的区别?
AS:基本讲:==比较地址,equals比较内容;
==,一边用于基本类型的比较,所有基本类型都被映射到这些缓存对象上,所以做出==相等的假象,因为实际上的确是同一个缓存对象,地址相同。 string 的equals其实是复写了equals方法,源码:
int n = count;
if (n == anotherString.count) {
char v1[] = value; char v2[] =anotherString.value;
int i = offset; int j =anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])return false;
}
return true;
}
}
return false;
}
方法锁和锁代码块有什么区别?
private static byte[] lock = new byte[0];
public synchronized void methodA(){
System.out.println(this);
}
public void methodB(){
synchronized(this){
System.out.println(this);
}
}
public void methodC(){
synchronized(lock){
System.out.println(lock);
}
}
方法锁是锁对象,如果new 一个A1对象,那么A1对象两次两用
methodA 方法就产生了同步,但是不局限于其他new的 A2 A3 对象。
栈和堆的概念以及优缺点?
堆,堆内存用于存放由new创建的对象和数组,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如 果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。(程序结束之后回收,自动回收,对象都存在堆内存中,当新的对象实例化,申请内存失败,自动GC) 优缺点:堆得优点就是可以动态分配内存大小,生存期也不必告诉编译器,因为它是在运行中动态分配内存的;缺点就是由于是在 运行时动态分配内存的,所以读取速度较慢。 栈的优点就是读取速度快,而且数据可以共享;缺点就是存在于栈中的数据大小及周期必须是确定的,缺乏灵活性。
ArrayList和LinkedList的区别?
As:通俗理解就是:ArrayList就是一个一个拿着号码排队的人,linkedList就是拴着链子的一队人。
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 。 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始。
abstract class和interface的使用场景分别是什么?
As:表面上看是可选可必选的关系,其实abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
abstract的优点是代码后期维护方便,基本方法修改只要改用到的地方即可,符合低耦合标准。其次可选的方法继承降低代码的繁冗重复。 interface定义的变量都是static final的,其实现类都可以用,而抽象类则不是,不会共享其变量。抽象类可以有构造方法,而接口没有。当然接口实现多继承的功能很重要,但更重要的是面向接口编程思想的体现.
android 加载图片所占用的内存跟什么有关系,不压缩怎么加载超大图片?
As:1、一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数.
2、 BitmapRegionDecoder,主要用于显示图片的某一块矩形区域,
BitmapRegionDecoder bitmapRegionDecoder =BitmapRegionDecoder.newInstance(inputStream, false);
bitmapRegionDecoder.decodeRegion(rect, options);
ContentProvider实现数据共享?
As:ContentProvidence 可以实现多进程之间的数据共享(详见:http://blog.csdn.net/faith_boys/article/details/8917395),将共享数据存入系统表中,生成uri路径,使用时候根据uri路径获取数据。
String+ 和StirngBuilder.append之间的差别?
As:String+每添加一个String就生成了一个新对象,StringBuilder.append是最后toString的时候才会生成String对象,后者更有效率。
Map集合的四种遍历方式?
As:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class TestMap {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "ab");
map.put(4, "ab");
map.put(4, "ab");// 和上面相同 , 会自己筛选
System.out.println(map.size());
// 第一种:
/*
* Set<Integer> set = map.keySet(); //得到所有key的集合
*
* for (Integer in : set) { String str = map.get(in);
* System.out.println(in + " " + str); }
*/
System.out.println("第一种:通过Map.keySet遍历key和value:");
for (Integer in : map.keySet()) {
//map.keySet()返回的是所有key的值
String str = map.get(in);//得到每个key多对用value的值
System.out.println(in + " " + str);
}
// 第二种:
System.out.println("第二种:通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
// 第三种:推荐,尤其是容量大时
System.out.println("第三种:通过Map.entrySet遍历key和value");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//Map.entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry
//entry.getKey() ;entry.getValue(); entry.setValue();
//map.entrySet() 返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
// 第四种:
System.out.println("第四种:通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}
Activity启动方式有四种?
As: standard:每次生成一个activity
singleTop:如果在栈顶,直接利用,不生成
singleTask:如果在栈顶,直接利用,不生成,不在栈顶,删掉中间的activity
singleInstance:如果在栈顶,直接利用,不在栈顶,调到栈顶利用。
几个比较重要的接口和类简介,collection
1、List接口
List 关心的是索引,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
ArrayList 可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。
LinkedList 中的元素之间是双链接的,当需要快速插入和删除时LinkedList成为List中的不二选择。
Vector 是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用
2、Set接口
Set关心唯一性,它不允许重复。
HashSet 当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类。
LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。
TreeSet 当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,譬如“abc”排在“abd”前面。)
3、Queue接口
Queue用于保存将要执行的任务列表。
LinkedList 同样实现了Queue接口,可以实现先进先出的队列。
PriorityQueue 用来创建自然排序的优先级队列。番外篇中有个例子http://android.yaohuiji.com/archives/3454你可以看一下。
4、Map接口
Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。
HashMap 当需要键值对表示,又不关心顺序时可采用HashMap。
Hashtable 注意Hashtable中的t是小写的,它是HashMap的线程安全版本,现在已经很少使用。
LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。
TreeMap 当需要键值对,并关心元素的自然排序时可采用它。