一些面试问题(更新中)

==和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;

     }

方法锁和锁代码块有什么区别?

  AS:  先看一下代码:
    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 对象。
       锁代码块,同步该对象,同样是约束调用该方法的当前对象,效果跟methodA 一样,如果同步的是lock,那么就约束所有new出来的该类对象。
   

栈和堆的概念以及优缺点?

AS:首先就是存入方式的不一样,一个先进后出,一个先进先出:
    栈,一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。(当存在栈内存的引用释放掉了,存在堆内存的对象和数组就成了垃圾)
  堆,堆内存用于存放由new创建的对象和数组,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如    果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。(程序结束之后回收,自动回收,对象都存在堆内存中,当新的对象实例化,申请内存失败,自动GC)
  优缺点:堆得优点就是可以动态分配内存大小,生存期也不必告诉编译器,因为它是在运行中动态分配内存的;缺点就是由于是在  运行时动态分配内存的,所以读取速度较慢。
栈的优点就是读取速度快,而且数据可以共享;缺点就是存在于栈中的数据大小及周期必须是确定的,缺乏灵活性。

ArrayList和LinkedList的区别?

As:通俗理解就是:ArrayList就是一个一个拿着号码排队的人,linkedList就是拴着链子的一队人。
 ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 。                                                                                LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引  但是缺点就是查找非常麻烦 要丛第一个索引开始
 abstract class和interface的使用场景分别是什么?            
As:表面上看是可选可必选的关系,其实abstract classJava语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个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 当需要键值对,并关心元素的自然排序时可采用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值