那些年安卓面试我遇到的坑

回想起几次安卓面试的场景,小编真是一脸懵逼,随后掩面痛哭。。。特地分享一下,互相伤害吧,哈哈哈哈。

Java中会存在内存泄露吗?(腾讯面试题)

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。

但是,java也会存在内存泄露的情况,长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况。例如:

  • 缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。

  • 一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。

代码案例:

public class Stack { 
    private Object[] elements = new Object[10]; 
    private int size = 0; 

    public void push(Object e){ 
         ensureCapacity();
         elements[size++] = e; 
    } 

    public Object pop(){ 
         if( size == 0) throw new EmptyStackException(); 
         return elements[--size]; 
    }

    private void ensureCapacity(){ 
         if(elements.length == size){ 
               Object[] oldElements = elements; 
               elements = new Object[2 * elements.length+1];
               System.arraycopy(oldElements,0, elements, 0, size); 
         }
    } 
}
public class Bad{ 
     public static Stack s=Stack(); 
     static{ 
         s.push(new Object()); 
         s.pop(); //这里有一个对象发生内存泄露 
         s.push(new Object()); //上面的对象可以被回收了,等于是自愈了 
     } 
}

上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用无法回收

因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!

如果让你在Java拼接数以万计的字符串,你会选择哪种方式?(ModChat面试题)

这个问题当时问得小编就真的是一脸懵逼,然后我就轻声问道:不是直接用+号吗,然后接下来的事情你们就懂了。。。(不可描述)

字符串拼接的方式有:

  • Concatenation Operator (+)
  • String concat method – concat(String str)
  • StringBuffer append method – append(String str)
  • StringBuilder append method – append(String str)

有人曾经做过这样测试,执行20个拼接 ' * ' 50,000次的测试,经过20次迭代后,得到如下的数据

method Avg Min Max
Operator (+) 6583.8 6392 6819
String concat 2.3 1 9
String Buffer 1.8 1 2
String Builder 3.3 3 5

然后。。。然后也不用小编说什么了(感觉好丢人。。。)

对于三者使用的总结:

  • 如果要操作少量的数据用 = String
  • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
  • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

谈谈对Android四大组件的理解吧

  • Activity
  • BroadcastReceiver
  • **Service **
  • Content Provider
    这四大组件小编就不啰嗦了,自己看书去。。。(给你们两个图体会一下)
Activity生命周期
Service生命周期

有兴趣的同学可以看看这篇博文
http://blog.csdn.net/ican87/article/details/21874321

说说List和Set的区别

  • List,Set都是继承自Collection接口
  • List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
  • List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

当然也可以对Set定义排序规则,需要定义一个排序规则类实现Comparator接口,如:

public class TreeSetTest2 {  
  
    public static void main(String[] args) {  
        Set<Person> set = new TreeSet<Person>(new PersonComparator());  
          
        Person p1 =  new Person(10);  
        Person p2 =  new Person(20);  
        Person p3 =  new Person(30);  
        Person p4 =  new Person(40);  
          
        set.add(p1);  
        set.add(p2);  
        set.add(p3);  
        set.add(p4);  
          
        for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){  
            System.out.print(iterator.next().score+" ");  
        }  
    }  
}  
  
class Person{  
    int score;  
      
    public Person(int score){  
        this.score = score;  
    }  
      
    public String toString(){  
        return String.valueOf(this.score);  
    }  
}  
  
class PersonComparator implements Comparator<Person>{  
  
    @Override  
    public int compare(Person o1, Person o2) {  
          
        return o1.score - o2.score;  
    }  
      
}  

你能说出java的根类Object的哪些常用方法?

当时主编听到这问题是想到的就只是eclipse的自动补全功能。。。

  • clone()
    clone方法主要用于克隆当前对象,制作本地对象,这肯定需要在所有对象中所拥有。

  • equals()、toString()和hashCode()
    这两个方法主要用于比较两个对象是否相等,查看Object源代码(要多查看源代码便于自己理解)知道,默认的equals()是

boolean equals(Object obj){  
       return this == obj;  
}  

==只有当两个对象地址相同时才返回true,所以默认的equals()方法根本没什么用,因为对象在内存中的地址(基本类型不同)肯定不同的;所以我们编写类时最好覆盖默认的equals()、hashCode()和toString()方法(查看JDK中的类也大部分覆盖了这些方法),默认的hashCode()返回的值就是对象在内存中的地址,而默认的toString()方法就是打印出对象的地址,toString()和equals()方法内部是通过hashCode()的返回值来实现的,hashCode()是本地(native)方法,所谓本地方法就是使用其他语言(C或C++)编写的,我们可以通过本地接口(JNI)编写本地方法。

  • finalize()
    这是GC清理对象之前所调用的清理方法,是回调方法,我们可以覆盖这个方法写一些清理的代码,GC会自动扫描没有引用的对象,即对象赋值为null;可以通过调用System.runFinalization()或System.runFinalizersOnExit()强制GC清理该对象前调用finalize()方法,GC有时不会调用对象的finalize()方法(由JVM决定)

  • getClass()
    返回当前对象的Class类的对象引用,用于取得类名等(方法查看API)。

  • notify()、notifyAll()和wait()
    这三个方法主要用于多线程中,wait方法会导致当前的线程等待,直到其他线程调用此对象的 notify方法或 notifyAll 方法。

Activity的启动模式有哪四种

  • standard:标准模式,系统的默认模式
  • singleTop:栈顶复用模式,Activity如果在栈顶就不会被重新创建
  • singleTask:栈内复用模式,Activity如果在某个栈中存在就不会被重新创建
  • singleInstance:单实例模式,是加强版的singleTask,当实例创建后,系统会建一个新的任务栈(独立存在)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,663评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,275评论 11 349
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,164评论 0 16
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,709评论 0 11
  • 视觉要求实现一个有弹性的冒泡动画(由小变大),结果调用系统的api出问题了,跟预想的不一样 大致看代码是没什么问题...
    哲逗年阅读 114评论 0 0