技术面试题目收集

面试题收集

数据库

  1. 查看查询是否使用了索引

    mark

  2. sql like与索引(后模糊匹配才能让索引有效)

  3. 全文索引与contains函数

  4. 索引的缺点:空间换时间,插入删除索引需要代价,因此需要合理设置索引

  5. Mongodb的数据库优化、MongoDB建立索引

  6. 查询语句优化

  7. 建立索引

    基础索引,单个field索引,组合索引,

  8. 聚集索引和非聚集索引?

  9. 索引类型,哈希,B+树的应用

  10. SVN和Git的区别

    SVN的优点:

    1、采用集中式,易于权限管理,保证安全性;

    2、代码的一致性高;

    3、适合人数不多的项目开发;

    SVN的缺点:

    1、服务器压力太大,

    2、必须连接在服务器上,否则基本不能工作、提交、对比、还原等;

    3、不适合开源开发。

    ===========================

    Git的优点:

    1、适合分布式开发,公共的服务器压力小;

    2、速度快, 成熟的架构,开发灵活;

    3、任意两个开发者之间可以很容易的解决冲突,可以方便的版本回退;

    4、离线工作开发,部署方便。

    5、良好的分支机制,可以让主干代码保持干净。

    Git的缺点:

    1、学习成本比较大,学习周期比较长,要求人员素质比较高;

    2、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

Linux:

  1. 十个常用的Linux命令

    查看磁盘空间 df -h

    查看内存free -h cat /proc/meminfo

  2. awk文本分割、查找

阿里面试题:

  1. 视频点播网站文件下载接口

  2. 基础变量/数组写出模拟maven导入包过程

  3. 50个白球50个红球,两个盒子,怎么放让人随机在一个盒子里抽到红球概率最高

  4. 有5个强盗分100枚金币,从1号开始进行分配,必须有半数服从分配才通过,否则1被毙掉,由2号开始分,问1号要怎样分才能使自己利益最大化? 要从后向前看。

  5. n个数里取两个和为s的数

  6. HashMap原理,自定义类型可以作为key吗? rehash过程

  7. HashMap和TreeMap、HashTable的区别

  8. java内存模型 , 垃圾回收算法,GC中可达性分析法,和引用计数法有什么不同?引用计数法有什么问题

  9. JVM类加载机制

  10. 排序算法种类,以及快排的优化 , Array.sort的排序方法,快速排序和堆排序的优缺点

  11. Java多线程实现方式,多线程的同步措施,线程与进程的区别

  12. 操作系统同步方式、通信方式

  13. 计算机网络三次握手四次分手, wait_time的三种差别

  14. Http Get和Post差别

  15. https原理和加密过程,验证证书有效性

  16. Java 64位指针的压缩

  17. Java中锁的实现机制,种类

  18. Java线程池达到提交上限的具体情况

  19. Java如何定位内存泄露?

  20. 如何分析算法的时间复杂度?

  21. 如何判断链表是否有环路

  22. 数组中Arrays.sort的排序方法是什么?

  23. 快速排序和堆排序的优缺点

  24. 二分查找

  25. 堆排序

  26. 说一说GC算法。

  27. 怎么检测死锁。

  28. 说一说ThreadLocal关键字。

  29. 聚簇索引和非聚簇索引的区别。

  30. 线程池

JAVA

集合

  1. Java集合有哪些?

  2. ArrayList、Vector 以及 LinkedList的区别

    ArrayList的默认初始长度是10

  3. map, Hashmap和HashTable的区别

  4. hashMap的底层数据结构,原理实现,如何扩容?

  5. String的内存模型

  6. Collection框架的结果

设计模式

  1. 有哪些设计模式
  2. 实现单例模式的几种方式
  3. 实现代理模式、工厂模式
  4. 观察者模式

线程和并发

  • sleep让出cpu时间,但不放弃同步锁。wait放弃锁,线程进入等待notify唤醒。

  • volatile修饰的list是否是线程安全的?

    不安全,修饰的是引用的可见性。

    Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类。

  • 创建线程的几种方法

  • 线程同步的方式有哪些

  • Executor线程池用法

  • 同步和异步的区别

  • 线程安全的单例模式

  • 如何实现Java线程池

  • ThreadLocal,ThreadLocalMap和HashMap的区别

  • ConcurrentHashMap的源码实现

  • Java进程间通信

  • 对项目中的高并发如何解决?

虚拟机

  • JVM分区

  • Myclass = new Myclass()在jvm中的内存分配

  • 堆分区,新生代的GC动作如何触发?

  • 垃圾回收时,哪些可以对象作为GCRoot?

  • 单例模式

  • OOM的例子,如何导致OOM

    堆上的OOM

    mark

  • 如何导致持久代内存溢出

  • 如何避免内存泄露

  • Java内存泄露和垃圾回收机制

  • Tomcat默认的GC回收方式?

框架

  1. Mybatis或Hibernate的原理

  2. Servlet生命周期

  3. Spring依赖注入的原理

  4. Spring AOP是如何实现的

  5. Spring的启动初始化流程和依赖注入流程, 互相依赖是怎么处理的?

  6. SpringMVC的工作流程

    mark

  7. Spring的线程池

  8. Spring的事务隔离和传播机制

  9. Maven的作用

  10. Tomcat的架构和请求处理流程

  11. redis源码阅读

  12. 负载均衡解决方案

  13. 缓存解决方案

  14. memcache的一致性hash

算法

  1. 有哪些排序算法?复杂度和稳定性

    • 快排

      mark

  2. 红黑树和平衡二叉树

编程题

  1. 连续子数组的最大和

    包含负数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class findMaxSum {
    public int FindGreatestSumOfSubArray(int[] array) {
    if(array == null || (array.length == 1 && array[0] <= 0))
    return 0;
    int cur = array[0];
    int sum = array[0];
    for(int i = 1;i < array.length;i++){
    if(cur < 0)
    cur = 0;
    cur = cur + array[i];
    if(sum <= cur)
    sum = cur;
    }
    return sum;
    }
    //用动态规划
    public int FindGreatestSumOfSubArray2(int[] arr,int n){
    int sum = arr[0];
    int max = arr[0];
    for(int i = 1; i < n; i++){
    sum = getMax(sum+arr[i],arr[i]);
    if(sum >= max)
    max = sum;
    }
    return max;
    }
    public int getMax(int a,int b){
    return a > b ? a: b;
    }
    }

  2. 反转链表

  3. 用两个栈实现队列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
    * 入队只进stack1, 出队只从stack2 pop
    * stack2为空时,从stack1 取出数据压入 stack2。
    **/
    public class StackQueue {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    public void push(int node){
    stack1.push(node);
    }
    public int pop(){
    if(stack2.empty()){
    while(!stack1.empty())
    stack2.push(stack1.pop());
    }
    return stack2.pop();
    }

  4. 字符的集合
    题目描述:输入一个字符串,求出该字符串包含的字符集合

    输入描述:每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。

    输出描述:每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

    1
    2
    3
    4
    /**
    * 1. 使用字典判断是否重复出现
    * 2. 使用列表记录第一次出现的key值顺序
    **/

  5. (美团)二维数组打印 题目描述:

    有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。

    给定一个二位数组arr及题目中的参数n,请返回结果数组。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /**
     *  题意很简单,主要是边界的处理:
     *   1. 沿着主对角线打印,所以每次打印之后x与y都要加1,直到x或y超出边界。
     *   2. 每轮遍历的起始点,是遵循(0,n-1)...(0,0)...(n-1,0)。
      *           也就是y先减小到0,然后x增加到n-1。所以遍历的终止条件是startX>=n。 *
     **/
    import java.util.*;
     
    public class Printer {
        public int[] arrayPrint(int[][] arr, int n) {
            // write code here
            int[] res = new int[n*n];
            int index = 0;
            int startX = 0;
            int startY = n-1;
            while(startX<n){
                int x = startX;
                int y = startY;
                while(x<n&&y<n)
                    res[index++]=arr[x++][y++];
                if(startY>0)
                    startY--;
                else
                    startX++;
            }
            return res;
        }
    }

  6. (去哪儿)表达式合法判断

    题目描述:
    写一段代码,判断一个包括’{‘,’[‘,’(‘,’)’,’]’,’}’的表达式是否合法(注意看样例的合法规则。)
    给定一个表达式A,请返回一个bool值,代表它是否合法。

  7. (奇虎360)挑选镇长

    题目描述:
    360员工桂最近申请了一个长假,一个人背着包出去自助游了。
    路上,他经过了一个小镇,发现小镇的人们都围在一棵树下争吵。桂上前询问情况,得知小镇的人们正缺一个镇长,他们希望能选一个知名又公正的镇长,即,大家希望能选出一个人,所有人都认识他,但同时他不认识镇上除自己以外的其他人(在此,我们默认每个人自己认识自己)。可是小镇里的人太多了,一下子大家谁也说服不了谁。
    “这简单啊。”桂表示。于是他一下子统计出来了镇上人们相互之间的认识关系,并且一下子找到了合适的镇长人选。
    现在你手上也拿到了这样一份认识关系的清单。其中上面给出的认识关系是单向的,即,A认识B与B认识A是相互独立的,只给出A认识B就不能认为B认识A,例如,我认识你,你不一定认识我。而且,这里的认识关系也不具有传递性,即,A认识B,B认识C,但这不代表A认识C。同时,为了方便处理,这份清单中,镇上的N个人依次编号为1到N。你能否像桂一样快速找到合适的镇长人选呢?

    输入描述:
    首先一个正整数T(T≤20),表示数据组数。
    之后每组数据的第一行有2个整数n 和m (1≤n≤105 ,0≤m≤3×105 ),依次表示镇上的人数和相互之间的认识关系数。
    之后m行,第 i 行每行两个数Ai和Bi (1≤Ai ,Bi ≤n ),表示Ai认识Bi。(保证没有重复的认识关系,但可能存在自己认识自己的认识关系)
    保证所有数据中80%的数据满足n≤1000,m≤10000

    输出描述:
    一共2T 行,每组数据对应2行。
    第一行,一个整数,表示你所找出来的合适的镇长人选人数num i 。
    第二行,num i 个整数,每两个数中间用空格隔开,表示你所选的合适的镇长的编号。
    特别的,如果并没有找到合适的镇长,第一行输出一个数0,第二行留空即可(参见样例)。

  8. (华为)字符集合

    题目描述:
    输入一个字符串,求出该字符串包含的字符集合

    输入描述:
    每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。

    输出描述:
    每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

  9. 1 1 1 2 3的所有组合

  10. m以内的素数

  11. 递归求阶乘

标签云