面试大全

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对象,这样不仅效率低下,而且大量浪费有限的内存空间。 

值传递,是对于基本数据类型的变量而言的。传递的是该变量的一个副本,改变副本并不影响原变量

引用传递,是对于对象型变量而言的。传递的是该变量地址的一个副本,并不是该对象本身


面试大全_第1张图片

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,用数组模拟栈,进栈,出栈

你可能感兴趣的:(面试大全)