阿里+百度+CVTE面试集

来源:互联网 发布:java集合框架中抽象类 编辑:程序博客网 时间:2024/05/01 06:10
1.在N个数中求前M大个数
使用快速排序的思想,每一次当把一个数字放在正确的位置上的时候跟M进行比较,时间复杂度为O(n)。

   privatestaticvoid findM(int[]arr,intleft ,intright,intM){

  if(left<right){

    intmid = partation(arr,left,right);

    if(mid==M-1){

    for(inti =mid+1;i<arr.length;i++)

    System.out.println(arr[i]);

    }

    if(mid>M-1){

    findM(arr,left,mid+1,M);

    }

    if(mid<M-1)

    findM(arr,mid+1,right,M);

  }

  }

  private static int partation(int[]arr,intleft,intright){

  intval =arr[left];

  while(left<right){

  while(left<right&&arr[right]>val)

  right--;

  arr[left] =arr[right];

  while(left<right&&arr[left]<val)

  left++;

  arr[right] =arr[left];

  }

  arr[left] =val;

  returnleft;

  }


2.struts2和SpringMVC的区别
①struts2拦截粒度是类,而springMVC拦截粒度是方法
②struts2框架入口是filter,springMVC入口是servlet
③struts2虽然方法之间是独立的,但是不同方法共享Action变量。springMVC方法之间是独立的,每个方法独享request和response数据。
④springMVC使用注解后基本不需要配置,而struts2还需要较多配置。

3.是否了解动态规划
动归,本质上是一种划分子问题的算法,站在任何一个子问题的处理上看,当前子问题的提出都要依据现有的类似结论,而当前问题的结论是后 面问题求解的铺垫。任何DP都是基于存储的算法,核心是状态转移方程。

4. 职责链模式(设计模式)
GoF经典设计模式的一种

5. 实践中如何优化MySQL
他们四条从效果上第一条影响最大,后面越来越小。
① SQL语句及索引的优化
② 数据库表结构的优化
③ 系统配置的优化
④ 硬件的优化

6. 什么情况下设置了索引但无法使用
① 以“%”开头的LIKE语句,模糊匹配
② OR语句前后没有同时使用索引
③ 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

7. SQL语句的优化

alter尽量将多次合并为一次
insert和delete也需要合并
select 语句中不要出现大小写混用
尽量使用索引,避免索引无效的情况
1SELECT子句中避免使用 *
2使用DECODE函数来减少处理时间
(3删除重复记录
(4Where子句替换HAVING子句
(5尽量多使用COMMIT
(6TRUNCATE替代DELETE
(7避免在索引列上使用计算
(8>=替代>
(9优化GROUP BY: 提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉.
8. 索引的底层实现原理和优化
B树,经过优化的B+树
主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。
以Mysql innoDB为例讲解索引 http://blog.csdn.net/u012978884/article/details/52416997

9. HTTP和HTTPS的主要区别
Http协议是超文本传输协议,用于在web浏览器和网站服务器之间传递信息,是一种TCP协议。而Http协议是不加密的,在此基础上Https添加SSL协议进行加密。
两者区别:
①所使用端口不同,Http协议使用80端口,而Https协议使用443端口。
②Https需要安全证书,一般需要收取费用。
③Http连接是简单的,无状态的。而Https可进行信息加密,身份认证。

10. Cookie和Session的区别

cookie存储在客户端(浏览器)中,用于保存用户的用户名密码等个人信息,是session的一种实现形式。

session存储在服务器中,用于跟踪用户状态。

11. 如何设计一个高并发的系统
① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化
② 使用缓存,尽量减少数据库 IO
③ 分布式数据库、分布式缓存
④ 服务器的负载均衡

12. linux中如何查看进程等命令

ps -ef | grep tomcat查看名为tomcat的进程

kill - +进程编号

13. 两条相交的单向链表,如何求他们的第一个公共节点
很简单的链表题目,博客上的做法一搜一大把,我记得当时答在兴头上,又给面试官解释了一下如何求单向局部循环链表的入口,链表中很经典的问题(其实链表也就那几个常用算法,比如逆制、求倒数第K个节点,判断是否有环等)

14.设计模式

单例模式、简单工厂模式、工厂模式、抽象工厂模式、策略模式、观察者模式、组合模式、适配器模式、装饰模式、代理模式、外观模式


15. 二叉树的遍历方式,前序、中序、后序和层序
二叉树本身就是一个递归的产物,那前序举例,访问根节点,然后左节点,再右节点,如果左节点是一棵子树,那么就先访问左子树的根节点,再访问左子树的左节点,依次递归;而层序,使用队列进行辅助,实现广度优先搜索

16. volatile关键字
volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障
作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)
但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。

17. synchronized
锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁
锁的膨胀模型,以及锁的优化原理,为什么要这样设计
与Concurrent包下的Lock的区别和联系
Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中

18. concurrentHashMap
两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。
hashTable通过synchronized锁住整张hash表,每次供一个线程使用。concurrentHashMap通过锁分离技术,分别对hashmap的不同部分进行加锁。
concurrentHashMap内部使用不同的段(segment),每个段其实是一个hashtable,他们有各自的锁,只要修改发生在不同的段上就可以同步进行。
而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。

19. 锁的优化策略
① 读写分离
② 分段加锁
③ 减少锁持有的时间
④ 多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久

20.缓存的使用,如果现在需要实现一个简单的缓存,供搜索框中的ajax异步请求调用,使用什么结构?
ConcurrentHashMap,可是内存中的缓存不能一直存在,用什么算法定期将搜索权重较低的entry去掉?我说先按热度递减放进一个CopyOnWriteArrayList中,保留前多少个然后再存回ConcurrentHashMap中。

21.TCP如何保证安全性
三次握手、四次回收、超时重传、保序性、奇偶校验、去重、拥塞控制。还讲了滑动窗口模型。

22.还有JDK1.8中对HashMap的增强
如果一个桶上的节点数量过多,链表+数组的结构就会转换为红黑树。

23.手写一个线程安全的单例模式
单例模式具有以下特点:
①类只能有一个实例
②可自动实例化
③这个实例对整个系统可见
java实现
饿汉模式:
public class Single{
        public static final Single single = new Single();
        private Single(){
       
        }
        public Single getInstance(){
        return single;       
        }
}
懒汉模式:
public class Single{
        public static final Single single;
        private Single(){
       
        }
        public Single getInstance(){
        if(single==null){
        single = new Single();
        }
        return single;       
        }
}


原创粉丝点击