天天看点

2020秋招头条百度阿里腾讯面试题

头条

一面

  1. 算法题:二分搜索相关

    二分搜索:又叫二分查找,即折半查找

    关键代码:

方法一:递归调用
public int search1(int num[],int target,int left,int right){
        int mid = (left+right)/2;
        if(num[mid]==target){
            return mid;
        } else if(num[mid]>target){
            search(num,target,left,mid-1);
        }else{
            search(num,target,mid+1,right);
        }
        return -1;
    }
方法二:while循环
public int search2(int num[],int target){
        int left=0;
        int right=num.length-1;
        while(left <= right){
            int mid = (left + right)/2;
            if(num[mid] == target){
                return mid;
            }else if(num[mid]<target){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
        return -1;
    }
           
  1. 概念题:解释 分布式、微服务、负载均衡、高可用

    分布式:就是将一个系统的各个组件分布在网络上的各台主机,并且各组件之间仅通过消息传递通信并协调工作。

    分布式与集群的区别:分布式是指将不同的子业务分布在不同的地方,集群是指将几台服务器完成同一个业务。分布式的每一个节点都可以做集群,可是集群不一定是分布式。若分布式的某一节点垮了,则该节点的业务无法访问,因为分布式不同的节点完成不同的业务。若集群的某一节点垮了,则其他服务器顶上,该业务继续正常被访问。

    微服务:单个服务的设计,所以参与人从设计、开发、测试、运维所有人加起来只需要两个人。服务一个或者一组相对较小且独立的功能单元。

    负载均衡:就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

    链接:https://www.cnblogs.com/xzwblog/p/7255364.html

    高可用:描述一个系统经过专门的设计,,从而减少停工时间,而保持其服务的高度可用性。百度百科解释

  2. http是有状态还是无状态? TCP是有状态还是无状态?

    http是无状态的,tcp是有状态的。

    无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。

    http无状态带来的问题:用户登录后,切换到其他界面,进行操作,服务器端是无法判断是哪个用户登录的。 每次进行页面跳转的时候,得重新登录。

    怎样让http变成有状态的?Cookie 和 Session 两种保持http状态的技术。

    详细解析https://blog.csdn.net/H_Expect/article/details/99967490

  3. 客户端禁用cookie怎么办? 你说的实现方式安全吗?

    还有URL重写技术和Session。

  4. SSL,http和https,https是有状态还是无状态?

    https是有状态的,用为https=http+ssl,而ssl是面向连接的。

  5. String为什么设计成final不可变? 是怎么实现不可变的?
  6. 自己能实现一个不可变的类吗?
package cn.lsy.test;

public class FINAL_CLASS {
    private final String name;
    private final int id;
    public FINAL_CLASS(String name,int id){
        this.name=name;
        this.id=id;
    }

    public final String getName() {
        return name;
    }

    public final int getId() {
        return id;
    }
}

           
  1. equals 和 hashcode 为什么要一起重写?如果不重写hashcode会出现什么问题?

    现有两个对象

    Student s1 = new Student(“小明”,18);

    Student s2 = new Student(“小明”,18);

    假如只重写了equals 没有重写hashcode,那么student类的hashcode方法就是Object里默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经过哈希算法得来的,显然此时s1!=s2,故两者的hashcode不一定相等。

    然而重写了equals,且s1.equals(s2)返回true,根据hashcode的规则,两个对象相等则hashcode则一定相等。于是矛盾产生了,所以重写equals一定要重写hashcode。

  2. hashmap插入的时候,哈希冲突解决? 查找的时候,哈希冲突怎么解决?

    源码

static final int MAXIMUM_CAPACITY = 1 << 30;
//为什么是2的30次方,因为Integer.MAX_VALUE == 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;//负载因子。当前容量大于整个容量的75%,开始扩容。
void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }
           

1.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?

默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为<原下标+原容量>的位置

2.重新调整HashMap大小存在什么问题吗?

当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。(多线程的环境下不使用HashMap)

扩容步骤:

1.扩容:创建一个新的Entry空数组,长度是原数组的2倍。

2.ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。为什么要重新Hash呢?因为长度扩大以后,Hash的规则也随之改变。

hash公式:index = HashCode(Key) & (Length - 1)

  1. hashset是怎么实现的? hashmap是怎么实现hashset的?
通过new HashMap()实现的,底层数据结构是哈希表,cun存取比较方便,线程不安全。
private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }
     public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
           
  1. 多线程:并发和并行,原子类,CAS操作
  2. mysql的索引:B+树底层实现?B树的底层实现?为什么要用B+树而不用B树?
  3. 最左前缀匹配具体是怎么实现查找的?最左前缀匹配用了B+树的哪些特性?
  4. (a,b,c)联合索引,为什么不能单用(b),而一定要用(a,b)?B+树是怎么实现的?
  5. 什么是幻读,不可重复读?这些概念是在事务内还是事务外? 事务内
  6. mysql怎么实现可重复读?设置了可重复读隔离级别底层是怎么实现的? (MVCC)
  7. 了解MVCC吗?怎么实现的?什么是快照读?快照读能读取到最新的吗?快照读和当前读的区别?
  8. synchronized和reentrentlock哪个效率高?

二面

23. 算法:实现一个缓存队列 ,二叉树的镜像

24. 进程和线程的区别?内存管理说一下你的了解。进程调度算法。

25. 为啥B+树最后叶子节点需要用链表相连接? 便于区间查找

26. TCP状态转换图,画一下。

27. 操作系统I/O模型了解吗?epoll模型了解吗?

28. CopyOnWriteArrayList的相关特性?

29. ArrayList遍历的时候能删除元素吗? 删除的时候会报什么异常?

三面

30. 算法题: (1)树的节点最大距离(2)区间覆盖 例 [1 3] [2 5] [3 6]能否覆盖[2 6]

31. Linux相关命令。

32. 手写SQL,join

百度

信息中心

一面

算法:字符串反转 、 倒着打印链表(为什么用递归比用栈差?) 、 单例模式

线程start 、 run方法区别

可以不通过构造函数创建对象吗? object.clone() 反序列化

volatile关键字

Spring AOP原理(cglib 和 JDK的动态***实现有什么区别?)

重写equals方法,为什么一定要重写hashcode方法?

字符串 == 比较。输出true还是false;

看了七八个程序,然后问输出什么?

HashMap 能不能存储 null 能,放在第一个格子里?concurrentHashMap 能不能存储 null?

分布式系统设计:现在有一个方法,可以给10台服务器调用,如何统计一天内10台电脑调用的次数和?

分布式锁的设计:每天早上8:00输出前一天的业务报表发到老板邮箱。如果现在有10台服务器,如果设计这个定时任务?

法1:分布式锁。法2:通过外部发来一个http请求,传给ngnix,通过ngnix自动进行分配到某一台服务器上。

二面

你对哪方面知识比较自信?

HashMap初始容量多少?(16)为啥要设计初始为16?如果传入容量10会怎么样?(还是会构建16容量的);

知道什么异常?(说几个)

http的状态码说几个。403是什么状态?

String有什么方法?

list,set集合在iterator输出的时候能删去值吗?

SimpleDateFormat是线程安全的吗?

手写左连接。

聚合函数有哪些?

三面

算法题:数组A和数组B,求 A并B - A交B;(说了几种,好像不满意不是最优解)

算法题:矩阵搜索(说完之后问优化,没想到,提示二分搜索);

SSM的运作流程,说说你做的项目难点。

GET POST请求,url里面的参数

说说索引,如果对每一列都建索引有什么不好?

白盒测试、黑盒测试

Linux会吗?

凤巢

一面

算法题:手写堆排序

Spring IOC原理 AOP原理,如何利用AOP实现日志,写过吗?

Spring bean创建的方法 注解 @Service xml配置 @bean

Java反射原理?

SpringBoot 里面 @bean 解释一下

Java内存模型和运行时数据区

Spring 中事务@Tranctional,出现异常回滚是怎么实现的

数据库MVCC原理

乐观锁和悲观锁概念

悲观锁的实际例子。 select * from table for update …

乐观锁实际上有没有加锁?

用两个线程去操作数据库,乐观锁具体是什么实现的?演示一遍,画一画

数据库常用存储引擎,区别,锁范围。

写过单纯的非web项目的 Spring工程, 用main实现的吗?例子。

SSM 三层技术架构的总体流程

@component @service @controller 三个区别

mybatis中 # 和 $ 的区别?哪个会出现SQL注入?

JVM 新生代,老年代。survival是不是在任意时刻都只有一块有对象?

JVM 垃圾收集器了解哪些?

二面

算法题: 实现一个四则运算计算器(两个栈 + 优先级) , 冒泡排序

输入一个网站的全过程。从计算机网络到服务器内部技术实现流程。

日常怎么学习。

阿里

各部门简历面

  1. volatile的底层如何实现,怎么就能保住可见性了?
  2. 三个线程如何实现交替打印ABC
  3. 线程池有哪些创建方式和安全性问题
  4. 有哪些线程池的类型
  5. 线程池中LinkedBlockingQueue满了的话,线程会怎么样
  6. 线程池的底层原理和实现方法
  7. 线程之间的交互方式有哪些?有没有线程交互的封装类 (join)
  8. 算法:堆排序、栈实现队列、反转链表
  9. Java锁机制,都说一下~
  10. 除了@ResponseBody,controller层如何标准返回给前端所要的数据类型?你会怎么实现?
  11. 异常捕获处理
  12. Spring MVC的原理和流程
  13. HashMap和ConcurrentHashMap哪个效率更高?为什么?
  14. Redis的缓存淘汰策略有哪些?
  15. Java内存模型说一下
  16. mybatis如何进行类型转换
  17. mybatis的xml有什么标签
  18. MySQL锁机制
  19. 如何修改linux的文件权限
  20. jvm的回收算法
  21. 你会怎么设计数据库表结构
  22. 数据库有哪些索引?
  23. 如何防止sql注入
  24. 抽象类和接口有什么不同
  25. myql间歇锁的实现原理
  26. future的底层实现异步原理
  27. SpringBoot Starter原理
  28. rpc原理
  29. 多个服务端上下线怎么感知
  30. 缓存和数据一致性,怎么处理。流式计算
  31. 多线程讲一下,FutureTask
  32. Java和mysql的锁介绍,乐观锁和悲观锁
  33. 分布式一致性讲一讲
  34. 分布式锁的实现方式,zk实现和redis实现哪个比较好
  35. 多点登陆怎么实现
  36. 把乐观锁加在数据库上面,怎么实现
  37. 项目介绍
  38. 降级处理hystrix了解过么
  39. 两次点击,怎么防止重复下订单
  40. ioc原理详细讲讲,源码看过么
  41. 静态***和动态***的区别
  42. JUC说说你知道的东西
  43. B+树的叶子节点

菜鸟

一面

  1. Java内存模型
  2. full gc怎么触发
  3. gc算法
  4. 高吞吐量的话用哪种gc算法
  5. ConcurrentHashMap和HashMap
  6. JDK8的stream的操作
  7. volatile原理
  8. 有参与过开源的项目
  9. 项目介绍
  10. 线程池原理,拒绝策略,核心线程数
  11. 1亿个手机号码,判断重复
  12. 是否有写过小工具
  13. 单元测试介绍一下,多模块依赖怎么单元测试。Mockito

二面

  1. 项目介绍
  2. dubbo、netty介绍原理
  3. 限流算法
  4. zk挂了怎么办
  5. 秒杀场景设计,应付突然的爆发流量
  6. redis的热点key问题
  7. redis的更新策略(先操作数据库还是先操作缓存)
  8. 分布式数据一致性
  9. 一致性哈希
  10. 消息队列原理介绍(不太会)
  11. full gc问题,怎么排查
  12. jvm的回收策略
  13. ClassLoader原理和应用
  14. 注解的原理
  15. 数据库原理,数据库中间件,索引优化
  16. aop原理和应用
  17. 大数据相关,MapReduce
  18. 机器学习有了解么?
  19. Java的新技术,以及技术最新进展
  20. Docker的原理

三面

1、全程项目

2、讨论了一下数据库表设计

四面

1、项目介绍

2、分布式事务

3、Java三大特性

4、数据库表设计

5、RPC原理

6、netty原理

7、降级策略和降级框架

腾讯

一面(电话)(50分钟)

  1. 算法题:六七道,都是剑指offer难度
  2. 半小时项目介绍 & 问答
  3. 分布式相关:rpc原理、微服务架构
  4. 海量数据问题:套路题
  5. 计网:传输层、网络层(必须要非常熟,ping的原理,tcp的三次握手、四次挥手、拥塞控制。UDP的不可靠、一对一、一对多)
  6. 操作系统:虚拟内存、段式、页式、进程调度算法
  7. 数据一致性: 分布式数据一致性、缓存数据一致性
  8. Java相关:线程池、HashMap、CopyOnWriteArrayList
  9. Redis相关:复制原理、持久化原理
  10. 杂谈:最近看什么书,实习地点。

二面(牛客视频)(85分钟)

  1. 算法题:最长不重复字串
  2. 半小时钟项目介绍 & 问答
  3. 操作系统:Linux的namespace(不会)、进程线程、线程通信方式、进程通信方式
  4. 计算机网络:传输层和网络层,因为我项目做了链路层,也讲了一下。
  5. Java相关: 线程池
  6. 数据库相关: 一条连表查询语句。数据库索引原理
  7. 海量数据问题: 套路题
  8. 杂谈:介绍了部门业务

三面(电话) (20分钟)

  1. 应该是大老板面试了,问的都很哲学:技术背景、学习方法、项目介绍
  2. 问了一些简单技术问题。主要考察逻辑表达和整体的素质。
  3. 杂谈:介绍了部门业务

hr(电话)(15分钟)

  1. 家庭情况
  2. 面腾讯原因,还有面其他公司么
  3. 兴趣爱好
  4. 业务介绍
  5. 口头offer

继续阅读