一些面经上的问题汇总

  1. 一条长度为l的线段,随机在其上选2个点,将线段分为3段,问这3个子段能组成一个三角形的概率是多少?

    假设我们选择的两个点的坐标是x和y(先假设x < y),那么由三角形两边和大于第三边的性质,有:

         x+y-x>1-y 
         x+1-y>y-x 
         1-y+y-x>x
    

    由上述不等式得到:x < 0.5, 0.5 < y < x+0.5,然后画个图就能得到联合概率为1/8,不要忘了这个结果是在假设x < y时得来的,所以再乘以2,得到1/4。

  2. 正向代理和反向代理

    正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

    反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了

  3. ArrayList 是要插入的元素没地方插了再扩容, HashMap 是达到负载因子了就扩容

  4. C++ 虚函数的实现原理

    参考 https://www.cnblogs.com/malecrab/p/5572730.html

    大致思想:

    1. 在内存布局中,每个含有虚函数的对象都有一个虚函数表,对象内存中有个指针指向这个虚函数表,虚函数表中中存放了各个虚函数的函数指针

    2. 如果出现了多继承的情况,对象里会出现多个虚函数表(这么做的原因是为了3)

    3. 虚函数的作用是运行时绑定,例如一个基类指针 pBase -> func(),如何确定该调用哪个函数呢?

      原理是编译期知道了调用的是 func() 函数以后,就确定了偏移量;而对于虚函数表中的所有函数,基类和派生类中的偏移量是一致的。所以运行时,一旦确定了使用哪个虚函数表的指针以后,叠加偏移量就知道了该使用哪个虚函数(这也就是2的道理)

  5. chrome 是多进程

  6. 数据库访问慢怎么解决?

    1. 缓存
    2. 索引
  7. 身份认证数字证书去数字机构认证那你通过网络找吗?还不是可能有伪造的?

    验证证书是否真实的任务完成了,那么证书是否可靠如何验证呢?一句话,只要根证书可靠,整个证书链就可靠,而根证书是否可靠要看这个根证书是否在操作系统或浏览器内置的可信根证书内,在的话就可信。

  8. 线程池的组成

    参考 https://www.cnblogs.com/kuoAT/p/6714762.html

    1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

    2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

    3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

    4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制

  9. CAS造成的ABA问题怎么解决?

    java 1.5 后 jdk 的 Atomic 包里提供了一个类 AtomicStamedReference 来解决 ABA ,这个类的 compareAndSet 方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

     public boolean compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)
    
  10. 爬虫应该用多线程、多进程、多协程?

    1. 多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。

      缺陷:多个进程之间通信成本高,切换开销大。

    2. 多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。

      缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。

    3. 多协程:又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。

      多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的。

      缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,性能较低。处理网络I/O性能还是比较高.

    总体来看,大概多线程可能是最佳人选,爬虫毕竟大部分操作都是密集I/O操作

  11. top命令怎么查看线程?

    参考 https://blog.csdn.net/inuyashaw/article/details/55095545

    1. top -H -p <pid>

    2. ps -T -p <pid>

  12. 触发 Full GC 的条件

    参考 https://blog.csdn.net/scugxl/article/details/50935863

    1. 调用 System.gc()

    2. 老年代空间不足

    3. 方法区空间不足

    4. 新生代空间分配担保失败

    5. CMS 收集器的 Concurrent Mode Failure

      发生在cms的清理sweep阶段,发现有新的垃圾产生,而且老年代没有足够空间导致的.

      关于cms:

       初始标记(STW) - >并发标记 ->重新标记(STW) ->并发清除.
      
       STW = stop the world.
      
  13. C++ 空类占 1 byte

    class Empty {
    };
    
    int main() {
        Empty empty = Empty();
        std::cout << sizeof(empty) << std::endl;   // 1
        return 0;
    }
    

    道理是:C++要确保不同的对象有不同的地址,所以不能是0字节;但是占多了又不好,那就占1个字节标识一下

  14. AVL 树:平衡树

    红黑树:针对黑结点的完全平衡树

  15. Dijkstra算法:求图的单源最短路径

猜你喜欢

转载自blog.csdn.net/captxb/article/details/102654075