面试大全
android
1,listview和RecyclerView的区别,为啥不放弃listview,RecyclerView拖曳怎么实现
2,线程池和四类线程池,AsyncTask原理,HandlerThread,IntentService
3,android打包过程,release和debug区别,类加载器,activity启动流程,dvm和jvm
4,listview内点击buttom并移动的事件流完整拦截过程:
5,activity子线程是否能执行view
6,jvm和dvm的区别
2,HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式,优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理。处理效率较低。感觉可以当做一个轻量级的线程池来用。继承自Thread,它有个Looper,在这里可以执行耗时操作
IntentService是继承并处理异步请求的一个类HandlerThread,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
AsyncTask是Handler+单线程池,一个对象只能执行一次,可以设置异步和串行
3,.dvm执行的是dex格式文件,jvm执行的是class文件
1.流程1.aapt生成R文件 2.aidl生成java文件 3.将全部java文件编译成class文件 4.将全部class文件和第三方包合并成dex文件 5.将资源、so文件、dex文件整合成apk 6.apk签名 7.apk字节对齐 内容:so、dex、asset、资源文件
4,1.点下按钮的时候:
1.产生了一个down事件,activity-->phoneWindow-->ViewGroup-->ListView-->botton,中间如果有重写了拦截方法,则事件被该view拦截可能消耗。2.没拦截,事件到达了button,这个过程中建立了一条事件传递的view链表3.到button的dispatch方法-->onTouch-->view是否可用-->Touch代理
2.移动点击按钮的时候:1.产生move事件,listView中会对move事件做拦截2.此时listView会将该滑动事件消费掉3.后续的滑动事件都会被listView消费掉3.手指抬起来时候:前面建立了一个view链表,listView的父view在获取事件的时候,会直接取链表中的listView让其进行事件消耗。
5,ViewRootImpl的创建在onResume方法回调之后,而我们一开篇是在onCreate方法中创建了子线程并访问UI,在那个时刻,ViewRootImpl是没有创建的,无法检测当前线程是否是UI线程,所以程序没有崩溃一样能跑起来,而之后修改了程序,让线程休眠了200毫秒后,程序就崩了。很明显200毫秒后ViewRootImpl已经创建了,可以执行checkThread方法检查当前线程。
6,https://www.jianshu.com/p/6a58f4472066
java
1,HashMap的原理同步问题以及和HashSet,HashTable的区别 https://blog.csdn.net/haiyang497661292/article/details/79550715 https://blog.csdn.net/visant/article/details/80045154 https://blog.csdn.net/lovewebeye/article/details/79573702
2,String,StringBuilder,StringBuffer,区别,值传递和引用传递 https://blog.csdn.net/zl_StepByStep/article/details/82709750
3,GC是什么,为什么要有
4,静态变量和非静态变量的区别,https://blog.csdn.net/fanxiaobin577328725/article/details/54755378 https://www.cnblogs.com/liuhuijie/p/9175167.html
5, String的存储方式 https://blog.csdn.net/u013825231/article/details/51920159 https://blog.csdn.net/gyaod/article/details/52761184
6,equals() 和 hashCode() 的区别 两个obj,如果equals()相等,hashCode()一定相等。两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;a: Map、Set等集合类型存放的对象必须是唯一的;b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。
java中的数据类型,可分为两类:
2.引用类型(类、接口、数组)
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
https://www.cnblogs.com/kexianting/p/8508207.html https://www.cnblogs.com/yaobolove/p/5086510.html
7,ThreadLocal 那么ThreadLocal是如何做到为每一个线程维护一份独立的变量副本的呢
8,数组和链表的区别 https://blog.csdn.net/qq_25806863/article/details/70607204 http://www.cnblogs.com/lemongirl/p/7906357.html
1,csdn java集合的使用
2,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。
值传递,是对于基本数据类型的变量而言的。传递的是该变量的一个副本,改变副本并不影响原变量
引用传递,是对于对象型变量而言的。传递的是该变量地址的一个副本,并不是该对象本身

3,GC相关
面试常考的算法
1.快排、堆排序为首的各种排序算法
2.链表的各种操作:判断成环、判断相交、合并链表、倒数K个节点、寻找成环节点
3.二叉树排序、遍历,反转左右,红黑树、B树定义以及时间复杂度计算方式
先序遍历, publicvoidtheFirstTraversal(Node root) {
//先序遍历 System.out.print(root.getData());
if(root.getLeftNode() !=null) {//使用递归进行遍历左孩子
theFirstTraversal(root.getLeftNode()); }
if(root.getRightNode() !=null) {//递归遍历右孩子
theFirstTraversal(root.getRightNode()); }
}
4.动态规划、贪心算法、简单的图论
5,用数组模拟栈,进栈,出栈