滴滴历年面经

1.数组和链表的区别

数组数据是连续存储的,内存地址连续,随机查找效率高,使用的时候要提前申请一块空间,如果空间不够还需要进行扩容;由于空间连续,所以在插入删除的时候,效率比较低;

链表是动态申请空间,需要使用的时候在申请即可,空间可以不连续,所以插入删除过程比较快,但是随机访问的效率不高。

但是在大数据量的情况下,大概是70万条数据的时候,对于数组和链表的随机插入,会是数组快,因为链表的过程,先找到插入位置,然后进行插入,当数据量大的时候在查找插入位置过程会耗费很长的时间。

2堆排序算法过程 –小顶对

①构建初始对,给定无序序列存放到指定数组里

②从最后一个非叶子节点开始调整,找到左右子节点的较小的,与该节点进行交换,一个一个往前调整,每次调整完的时候还得往下调整,因为存在交换后的子节点并不是子节点的子节点的最小值。

③构建成小顶堆后,输出对顶元素,让最后一个元素与其交换然后调整

3重载和重写的区别

重写:发生在父子类中,要求两同两小一大,方法名和参数列表一样,返回值和异常类型相同或相容,访问权限要比父类大或相等

重载:发生在同一个类中,或者父子类中,要求方法名相同,参数列表不同,其他返回值、权限、异常不作为重载的标准。

4.数据库 有哪些锁

Mysql:

如果Myisam(不支持事务)引擎,表锁,加锁快,锁的粒度大,并发度低,不会出现死锁;

分为表共享读锁,表独占写锁,表共享读锁,可以多个线程进行读,但是不能进行写;表独占写锁,其他线程不能读也不能写;Lock tables 表名 read|write;默认情况下查询加读锁,更新加写锁。

如果InnoDB(支持事务)引擎,行锁,加锁慢,锁的粒度小,并发度高,会出现死锁;

分为共享锁Lock in share mode和排他锁 for update,意向共享锁和意向排它锁(表锁),使用间隙锁;mysql默认隔离级别是repeatable_read,间隙锁通过对条件内未出现的数据进行加锁的方式,来防止幻读。

什么时候使用表锁

①事务需要更新大部分或者全部数据,使用行锁会让执行效率低下,并且冲突和等待增多。

②事务涉及多个表,容易引起死锁,造成事务回滚

5分布式数据库是什么,了解分布式数据库事务么

 

6.线程进程区别

进程是一段正在运行的程序,系统进行资源分配和调度的一个独立单位.;

线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

进程间相互独立进程进程之间不能共享资源,一个进程至少有一个线程,同一进程的各线程共享整个进程的资源

线程的创建和切换开销比进程小。

 

怎么建立线程,怎么开启

继承Thread或者实现Runnable接口,使用ExecutorService的execute或者submit方法传入runnable实现类,使用FutureTask包装callable实现类,作为Thread参数,启动

 

7.抽象类接口区别

如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract修饰,但是抽象类不一定要包含抽象方法,抽象类的创建就是为了继承,如果不去继承那么这个抽象类没有必要声明为抽象类;

接口:对行为的抽象,可以含有变量和方法,变量默认用public static final修饰;方法时public abstract方法,1.8多了default和static方法,这两个方法必须有方法体

区别:

语法层面:抽象类中可以含有普通变量和普通方法,接口中不能有普通方法,除了default和static,只能有抽象方法。一个类只能继承一个抽象类,但是可以实现多个接口

 

8.Final.finally.finanize区别

Final修饰成员,表示成员的值或者地址不可变,修饰方法,表示方法不可重写,修饰类,表示类不可继承

Finally在异常处理中的关键字,可用于资源的回收,一些流的关闭,表示就是一定会执行的语句

Finalize:在gc之前会调用Object的finalize方法,可用于一个可恢复状态的对象变为可达状态。

 

9.死锁,线程间有死锁吗

互斥,持有等待,不可剥夺,循环等待

按照指定顺序,持有一定时间,不满足就释放,设置优先级剥夺资源

银行家算法:可利用资源数,最大需求矩阵,已分配矩阵,需求矩阵;求出还有多少需要分配的资源,然后假设分配了会不会有资源不够的问题。只要找到一个满足所有资源请求的情况就是安全的序列,可以分配资源。

10.404 500 304等代表啥

1XX Informational(信息性状态码)接收的请求正在处理

2XX Success(成功状态码) 请求正常处理完毕

3XX Redirection(重定向状态码) 需要进行附加操作以完成请求

4XX Client Error(客户端错误状态码)服务器无法处理请求

5XX Server Error(服务器错误状态码)服务器处理请求出错

 

200请求成功,浏览器会把响应体内容显示在浏览器中

404 请求的资源没有找到,说明客户端错误地请求了不存在的资源

500请求资源找到了,但是服务器内部出现了故障

302重定向,当响应码为302是,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头location,它指定了新请求的url地址

304当用户第一次请求index.html时,服务器会添加一个名为last-Modified响应头,这个头说明了index.html的最后修改时间,浏览器会把index.html内容,以及最后的响应时间缓存下来。当用户第二次请求index.html时,在请求中包含一个if-modified-since请求头,它的值就是第一次请求时服务器通过last-modified响应头发送给浏览器的值,即index.html最后的修改时间,if-modified-since请求头就是在告诉服务器,我这里浏览器缓存的index.html最后的修改时间是这个,您看看现在的index.html最后修改的时间是不是这个,如果是,那就不用响应这个请求,我直接把缓存中的内容显示出来即可。服务器获取if-modified-since值,与index.html的当前最后修改时间比对,如果相同,服务器发送响应码304,表示index.html与上次浏览器缓存的相同,无需再次发送,浏览器显示自己的缓存页面,如果不同,那么说明index.html已经进行了修改,服务器响应200

11.Int integer区别以及等于10等于1000返回值

Int是基本数据类型,不是类型,Integer是引用类型的final类,Integer中有个cache数组,存放着-128-127之间的整数,如果使用valueOf方法,如果在-128-127之间的数,直接从cache里面拿,如果不是在区间内,那么就使用new Integer;当使用Integer i= 120时,这时会使用自动装箱,使用cache数组,而Integer i= 1000时,便是使用new Integer方法;

关于==

如果两个变量都是基本类型变量,且是数值类型,则只要两个变量值相等(不论类型),则==的结果为true;例如65 == 65.0f == 65.0

如果是两个引用类型的变量,只有当两个引用变量的类型是父子类型或者同个类型才能进行比较,否则返回false;只有他们指向同一个对象的的地址时,才会true;

如果一个是引用,一个是数组类型,那么先把引用类型拆箱成数值类型再比较值是否相等。

 

 

12.StringBuffer的append方法怎么实现?

为什么String是不可变的,因为它里面的char数组时final类型;StringBuffer中其实是用数组保存每个字符,char数组保存的字符串的值,append就是将要添加的内容str,调用System. Arraycopy将要添加strchar数组,添加到原来的StringBufferchar数组中,从而实现可变的功能。

 

13.Mysql怎么分页

Limit基本实现方式:pageNo页码表示从哪里开始显示;pagesize表示每页显示的条数;

select * from table limit (pageNo-1)*pageSize, pageSize;

 

14.如何判断一个链表有环

两个指针,a指针走一步,b指针走两步,某个时候p == q,存在环。

While(q!= null&&q->next !=null){

P = p ->next;

Q = q->next->next;

If(p==q){

       Return 1;

}

 

15.如何取到链表倒数第k个数

两个指针,一个先走k步,然后另一个开始走,等到第一个到末尾,那么第二个就是第k个数;

 

 

 

 

 

16.二分查找找出有序数组某个数第一次出现的位置(这个要手撕代码,没写出来)

int find(int *a, int len, int key)

{

    if (a == NULL || len < 1)

        return - 1;

    int low = 0;

    int high = len - 1;

    while(low <= high)

    {

        int mid = (low + high)/2;

        if (a[mid] == key && a[mid - 1] != key)

        {

            return mid;

        }

        else if (a[mid] >= key)

        {

            high = mid - 1;

        }

        else

        {

            low = mid + 1;

        }

    }

}

17.知道cookie么?讲一下(cookie是重要考点,一定要可以讲的超级清楚)

答:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

猜你喜欢

转载自blog.csdn.net/huangwei18351/article/details/83443299
今日推荐