2019年_BATJ大厂面试题总结-腾讯篇

1.hashmap和hashtable的区别?

答案:https://blog.csdn.net/xuhuaabc/article/details/91475761

2.JVM的内存模型,回收机制?

博客园答案:https://www.cnblogs.com/leiblog/p/10517668.html
CSDN答案:https://blog.csdn.net/qq228112142/article/details/88744773

3.Linux进程间通信的方式?

Linux下进程通信的八种方法:
(1) 管道(pipe):
管道允许一个进程和另一个与它有共同祖先的进程之间进行通信;

(2) 命名管道(FIFO):
类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建;

(3) 信号(signal):
信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能);

(4) 内存映射(mapped memory):
内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它;

(5) 消息队列(message queue):
消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能成该无格式字节流以及缓冲区大小受限等缺点;

(6) 信号量(semaphore):
信号量主要作为进程间以及同进程不同线程之间的同步手段;

(7) 共享内存 (shared memory):
它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥;

(8) 套接字(Socket):
它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字。
详解:https://www.cnblogs.com/wuyepeng/p/9748889.html

4.Linux里用来查看CPU状态都有哪些指令?

CSDN答案:https://blog.csdn.net/z1134145881/article/details/52089698
博客园答案:https://www.cnblogs.com/zengkefu/p/5480689.html

5.python会吗?c语言会吗?前端会吗?ios会吗?

参考:https://blog.csdn.net/zc639143029/article/details/47011861

6.redis单线程多线程、原因有什么好处、如何实现高效?

答案:https://blog.csdn.net/xlgen157387/article/details/79470556

7.redis能否当消息队列,用过哪些中间件消息队列,有什么不同?

RabbitMQ
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

Redis
是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。

具体对比

可靠消费
Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费

可靠发布
Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器

高可用
Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作

持久化
Redis:将整个Redis实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化

消费者负载均衡
Redis:不提供,需自行实现
RabbitMQ:根据消费者情况,进行消息的均衡分发

队列监控
Redis:不提供,需自行实现
RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)

流量控制
Redis:不提供,需自行实现
RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性

出入队性能
对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。
测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。
在这里插入图片描述

应用场景分析
Redis:轻量级,高并发,延迟敏感
即时数据分析、秒杀计数器、缓存等

RabbitMQ:重量级,高并发,异步
批量数据异步处理、并行任务串行化,高负载任务的负载均衡等

8.redis中的哈希槽你知道吧?

答案:https://blog.csdn.net/ck784101777/article/details/101367821

9.TCP三次握手和四次挥手,挥手时各个时刻的状态是什么?

答案:https://blog.csdn.net/qq_38950316/article/details/81087809

10.讲讲java容器(吹了半天HashMap和ConcurrentHashMap)?

答案:https://blog.csdn.net/u010771890/article/details/73732648

11.讲讲jvm的内存管理机制(对比着c和java讲了下,主要详细说了下对象的创建过程,说了下如何判别对象该被回收了(可达性分析算法)、垃圾回收算法、垃圾收集器)?

答案:https://blog.csdn.net/u012440687/article/details/52020537

12.讲一下你的项目吧,画一下架构。你使用redis做缓存,那现在假设你是一个测试,你能提出多少redis可能存在的坑?(留下了不熟悉redis的泪水)?

参考:https://www.jianshu.com/p/ebca78731137

13.链表和数组有什么区别?

区别一:物理地址存储的连续性
数组的元素在内存中是连续存放的。
链表的元素在内存中不一定是连续存放的,通常是不连续的。
区别二:访问速度
数组的访问速度很快,因为数组可以根据数组可以根据下标进行快速定位。
链表的访问速度较慢,因为链表访问元素需要移动指针。
区别三:添加、删减元素速度
数组的元素增删速度较慢,因为需要移动大量的元素。
链表的元素增删速度较快,因为只需要修改指针即可。
在这里插入图片描述
详解:https://cloud.tencent.com/developer/article/1444059

14.你用了分布式锁,那分布式锁有哪些实现方式?都有哪些优缺点?

答案:https://my.oschina.net/yangjianzhou/blog/1930493
https://blog.csdn.net/C18298182575/article/details/89642236

15.你知道Redis都有哪些坑吗?

参考:https://blog.csdn.net/jasonhui512/article/details/53195959/
简书:https://www.jianshu.com/p/47c2116b8141

16.让我写测试用例来测试算法题,并根据所写的测试用例找出你写的程序有哪些bug?

参考:https://blog.csdn.net/xionghuixionghui/article/details/69053416

17.算法题:给一个数组,找出出现次数大于数组长度一半的那个数?

答案:c实现

#include<stdio.h>
#include<stdlib.h>
int Search(int A[],int len)
    {
        if(NULL==A || len<=0)
        {
            return -1;
        }

        int k, j=0;
        for(int i=0;i<len;++i)
        {
            if(j==0)
            {
                k=A[i];
            }
            if(k==A[i])
            {
                ++j;
            }else
            {
                --j;
            }
        }

        return k;
    }
void main(){
    int len=10;
    int a[10]={4,5,5,2,3,5,2,5,5,5};
    int result=Search(a,len);
    printf("%d\n",result);
}

java实现

package test;

public class Search {
    public static void main(String[] args) {
    //System.out.println("Hello World!");
        Integer []a={4,5,5,2,3,5,2,5,5,5};
        Integer len= a.length;
        Integer result = search(a,len);
        System.out.println(result);
    }
    public static Integer search(Integer A[],Integer len){
        if(A==null || len<=0)
        {
            return -1;
        }

        Integer k=null, j=0;
        for(Integer i=0;i<len;++i)
        {
            if(j==0)
            {
                k=A[i];
            }
            if(k==A[i])
            {
                ++j;
            }else
            {
                --j;
            }
        }

        return k;
    }
}

详细:https://blog.csdn.net/wei_cheng18/article/details/80458478

18.为什么MySQL不能支撑高并发,你有做过测试吗?

腾讯云社区:https://cloud.tencent.com/developer/article/1164944
https://cloud.tencent.com/developer/article/1067290

19.项目中为什么要用redis来缓存赞和踩?数据不一致怎么办?如何保证数据的持久性?

答案:https://blog.csdn.net/hukaijun/article/details/81010475

20.怎么设置一个key的过期时间?

Redis:https://blog.csdn.net/An1090239782/article/details/102570409
HashMap:https://cloud.tencent.com/developer/article/1521405

21.知道多线程和多进程的区别吗?有什么优点呢

答案:https://blog.csdn.net/qq_25408423/article/details/81979072
博客园:https://www.cnblogs.com/x_wukong/p/10106214.html

22.重载和重写。为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你是怎么理解的。

参考答案:https://blog.csdn.net/nblife0000/article/details/53073026

发布了54 篇原创文章 · 获赞 90 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43107323/article/details/104712033