网易有道 一面凉经
网易有道 Android 一面挂
2020/2/25
- 自我介绍,项目中有什么Android比较熟悉的。(okhttp)
- 使用到了线程池,怎么用的。
- int与Integer int a=1; Integer b=1; Integer c = new Integer(1); a == b? a == c? b == c?(答案true,true,false。b与c不同是因为new了一个对象。其他相同是因为自动装箱拆箱Integer内部还是int value,equals()里面就是判断this.value == ((Integer)obj).intValue())(https://www.jianshu.com/p/2d2b5b35410c)
- 另一个介绍堆内存、栈内存:(https://blog.csdn.net/sinat_41144773/article/details/89742329)
- Integer a = 128; Integer b = 128; 为什么不相等(https://www.jianshu.com/p/5b2837e063fd)
- JVM内存机制。
- 怎样创建线程(继承Thread,实现runnable,Callble、future,线程池)先看深入理解java虚拟机(讲hotspot jvm) 再看这个链接https://www.cnblogs.com/UncleWang001/articles/10422289.html
- 多线程 wait与sleep
- 怎样退出一个线程?(老版的stop已经被废弃(由于stop强制停止的特性(立刻释放所有monitors),可能会导致一系列难以处理的问题)interrupt()是一个“很软”的操作,也就是提醒线程应该结束了,至于如何结束,什么时候结束,以及是否需要结束,都是由线程自行处理。所以,interrupt()的使用,会让开发做更多的事,但这是有必要的,因为只有线程自己判断(isInterrupted),才知道如何合适的结束自己。)(https://www.cnblogs.com/alimayun/p/10928573.html)
- hashMap说一下(https://blog.csdn.net/l18848956739/article/details/85998121)
- 接上一个(https://blog.csdn.net/striveb/article/details/84657326)
- 设计模式讲一下;建造者模式特点,有什么优点(一个复杂对象的建立,一些基本部件不会变,而其组合经常变化。
优点:建造者独立,易扩展。 便于控制细节风险。
缺点:产品必须有共同点,范围有限制。 如果内部变化复杂,会有很多的建造类。
使用场景:需要生成的对象具有复杂的内部结构,需要生成的对象内部属性本身相互依赖) - 单例模式有哪些实现方法(饿汉式、懒汉式、双检索、内部类、枚举) 饿汉式与懒汉式有什么区别,用在什么场景。(https://blog.csdn.net/nsw911439370/article/details/50456231)
- Activity启动模式。 说一下SingleTask; A是standard模式,用它启动B(SingleTask)发生什么;(如果B需要的任务栈是A所在的,那么B进入A的任务栈。否则新建一个任务栈)
- ActivityA启动B的生命周期改变(A.onPause-B.onCreate-B.onStart-B.onResume-A.onStop-A.onDestroy)
- handler说一下,它的post与send区别(区别就是调用post方法的消息是在post传递的Runnable对象的run方法中处理,而调用sendMessage方法需要重写handleMessage方法或者给handler设置callback,在callback的handleMessage中处理并返回true)
https://www.jianshu.com/p/43d6cd7b06f1 - 还使用过什么多线程通信(runOnUithread、AsyncTask)
- 事件分发机制讲一下。
- RecyclerView和ListView区别。(提到了ViewHolder那么说一下他是干什么的)(ViewHolder造成图片加载混乱(https://blog.csdn.net/lililijunwhy/article/details/79869491))
- 算法:链表找环怎么实现?(快慢指针实现)
- 写算法:判断树的子树。(递归实现。有一些边界判断瑕疵,函数定义忘写返回值,main函数写了返回值。。。)
//== 基本数据类型判断值相等 引用类型判断引用相等(内存地址) //equals() Integer重写了Object的equals()方法,直接比较的具体值是否相等 public static void main(String[] args) { int a = 1;//存在常量池中 Integer b = 1;//也是在常量池,因为拆箱所以和a是同一个东西。 // 内存分析:首先从常量池找有没有该数据,有则返回引用,无则在常量池中创建该数据再返回引用 Integer c = new Integer(1); //内存分析:首先找常量池有没有该数据,如果没有则先在栈内存创建该引用c //然后在堆内存创建具体对象(new Integer(1)),并且在常量池中创建该对象,返回栈内存的引用;如果有则直接返回栈内存地址的引用 System.out.println(a==b); //true 非new Integer拆箱后是基本数据类型(Integer里面是一个int),都存在常量池,值相等 System.out.println(a==c); //true new Integer与int比较,这个特殊需要注意。他会强制把new Integer拆箱成为int再进行比较 //所以这里还是从常量池中比较 System.out.println(b==c); //false 非new Integer与new Integer比较。 因为常量池引用与栈内存引用不同 } //jvm 1.7之前常量池存在方法区,1.7存在永久代,1.7以后存在元空间,就是pc直接内存(因为1.8删除了永久代) //object的equals方法默认是==,String重写了equals判断值是否相等 public boolean equals(Object obj) { return (this == obj); } //默认的,Object 类的hashCode()方法返回这个对象存储的内存地址的 hash 值。#网易有道##面经##校招##安卓工程师#