美团面试,360面试 ,滴滴面试,阿里面试,百度面试,京东面试,搜狗面试:

一、基础知识:
    1、CurrentHashMap的数据结构,Java1.8 与 java 1.7的区别,增加了那些特性
  这个其实是考了一下编程思路,hashMap(链表+数组)==》1.8之后变成了 链表+数组+红黑树,   

  参考:ConcurrentHashMap原理分析(1.7与1.8) 

        遍历Map的方法有四种:

       参考:Java中如何遍历Map对象的4种方法    

    HashMap,HashTable的数据结构,不同点, HashTable线程安全,HashMap线程不安全;

       参考:HashMap的实现原理--链表散列

      参考:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 

      参考:HashMap, HashTable,HashSet,TreeMap 的时间复杂度   

      参考:HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 

      参考:ConcurrentHashMap原理分析(1.7与1.8)-put和 get 两次Hash到达指定的HashEntry

 

   2、TreeMap 如何实现快速排序的?

    TreeMap其实是二叉排序树的红黑树实现,:对于 TreeMap 而言,由于它底层采用一棵“红黑树”来保存集合中的 Entry,这意味这 TreeMap 添加元素、取出元素的性能都比 HashMap 低:当 TreeMap 添加元素时,需要通过循环找到新增 Entry 的插入位置,因此比较耗性能;当从 TreeMap 中取出元素时,需要通过循环才能找到合适的 Entry,也比较耗性能。 

但 TreeMap、TreeSet 比 HashMap、HashSet 的优势在于:TreeMap 中的所有 Entry 总是按 key 根据指定排序规则保持有序状态,TreeSet 中所有元素总是根据指定排序规则保持有序状态。

         参考 红黑树与AVL树

  2、设计模式有哪些,关键是;举例在项目中如何使用,它的优缺点,我竟然语塞了。 

  参考:Java设计模式 - 单例模式

  参考:Java设计模式之代理模式(Proxy)

  参考:设计模式-代理模式(Proxy)

  参考:设计模式-抽象工厂模式

  参考:设计模式-工厂模式-场景以及优缺点-目的就是应对变化 (国江面试回答的) 

  参考:23种设计模式介绍(三)---- 行为型模式

  参考:23种设计模式介绍(二)---- 结构型模式

  参考:23种设计模式介绍(一)---- 创建型模式 

    3、介绍JVM内存模型,垃圾回收机制,新生代垃圾回收用Copying算法,老年代用标记清理(Mark-Compact)

  参考:jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)

  美团面试官问:JVM的公有区和私有区有啥区别,为啥叫私有区,把我给问住了,

  后来查了一下:私有区指的是,这个区域的随着线程的开始而开始,结束而结束,生命周期与线程的生命周期一样,

         公有区:即使线程结束了,也可以访问,不会回收;

   那么寄存器为什么设计为线程私有?

   我们知道所谓的多线程在一个指定的时间段里只会执行某一个线程的方法,CPU不停切换任务,那么为了能够准备的记录各个线程正在执行的当前的字节码指令的地址,那么就设计为线程私有每个线程都分配一个寄    存器,这样各个线程独自记录不会干扰。这是java虚拟机唯一一个没有声明OutOfMemoryError的内存区。;

  参考:java虚拟机学习之线程共享内存区和线程私有区

      4、 G1会stop-the-world吗,

  答:会,不管选择哪种算法,都会stop-the-world ,GC调优通常就是为了改善stop-the-world的时间

  参考:CMS收集器和G1收集器优缺点

      5、美团的面试问的太细了,标记-清理法是如何整理的,copying 是如何 划分两部分的。为什么年轻代的划分是8:1:1,具体是如何进行清理内存的。

   6、什么是代理,反射,以及如何使用?

  参考:深入理解Java反射+动态代理

  7、一个Tomcat 接收请求 到DB 然后返回到用户;

  Serverlet是单例的吗?

  答:Servlet容器默认是采用单实例多线程

  Servlet生命周期,大致分为4部:Servlet类加载-->实例化-->服务-->销毁        

1、Web Client向Servlet容器(Tomcat)发出Http请求。

2、Servlet容器接收Client端的请求。

3、Servlet容器创建一个HttpRequest对象,将Client的请求信息封装到这个对象中。

4、Servlet创建一个HttpResponse对象。

5、Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象作为参数传递给HttpServlet对象中。

6、HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。

7、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。

8、Servlet容器把HttpServlet的响应结果传回客户端。

 

        参考:servlet单实例多线程模式

  参考:Servlet 生命周期、工作原理-是单实例多线程

        8、ThreadLocal 变量 的用处,以及 如果想跟踪一个请求,从接收,处理到返回结果。threadlocal可以在线程的任何位置传递参数,获取这个参数,

             参考:Threadlocal 传递参数(百度二面)

       9、String x="ABC";String y=new String(“ABC”); (a)==,(b) equals是否相等,如果使用HashSet添加是否能把两个都加上;

      答:   x ,y的内存地址不同;因此 (a) x==y的判断为false;但是String重写了equals(),判断值是否相等,因此(b) a.equals(b)的判断为true; HashSet 只能加上一个;

            参考: Java中String直接赋字符串和new String的区别 如String str=new String("a")和String str = "a"有什么区别?

  

       10、Java 有哪8中基本的数据类型:

  (a)四种整数类型(byte、short、int、long):   

    byte:8 位,用于表示最小数据单位,如文件中数据,-128~127   

    short:16 位,很少用,-32768 ~ 32767   

    int:32 位、最常用,-2^31-1~2^31  (21 亿)   

    long:64 位、次常用    注意事项:    int i=5; // 5 叫直接量(或字面量),即 直接写出的常数。   

    整数字面量默认都为 int 类型,所以在定义的 long 型数据后面加 L或 l。    小于 32 位数的变量,都按 int 结果计算。    强转符比数学运算符优先级高。见常量与变量中的例子。 

  (b)两种浮点数类型(float、double):   

    float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。   

    double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾    

  (c)一种字符类型(char):    char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1(65535) 。 

  (d)一种布尔类型(boolean):true 真  和 false 假。

 

二、SPRING知识:

  1、Spring 中的BeanFactory和FactoryBean的区别;,Spring的好处。

    参考:BeanFactory 和FactoryBean的区别

  2、spring MVC 原理,AOP,IOC, 请求如何使用DispatchSolove转发请求。
  3、Spring Cloud的五大神兽,zookeeper的服务发现,数据移植性。

          zookeeper 如何管理集群服务的;如何实现高可用性的

    参考:SpringCloud分布式开发五大神兽

    参考:Spring Cloud 架构 五大神兽的功能

          参考:zookeeper 负载均衡 核心机制 包含ZAB协议(滴滴,阿里面试)

          参考:zookeeper如何实现负载均衡的?(具体连接哪一个zookeeper服务器的选择?)阿里面试

       参考:Zookeeper 3、Zookeeper工作原理(详细)

  4、百度的面试官问我,IOC,AOP的原理,如果让你自己设计IOC功能如何设计

    其实IOC,AOP都是基于反射的机制的,

    AOP更高级一点,用了动态代理

     参考:Spring IOC AOP的原理(百度二面) 如果让你自己设计IOC,AOP如何处理

    Spring 的Bean的生命周期(阿里的人问过)

      参考:Spring学习10- bean的生命周期(阿里面试题目两次面试均提到)

 

三、struct2掌握

  参考:Struts2 入门

  参考:三大框架(struct、spring、hibernate)的优缺点

四、服务器搭建部署:

  1、什么是Docker,Docker常用的命令,Docker的优点,

    参考下面的文章,注意多看看后面的总结,阿里抓着常用命令和优点不放,好好看

    参考:Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点)

    参考:Docker 入门 到部署Web 程序

  2、Dubble,SOAP,重点就是Dubbo,Dubbo不了解,这是硬伤,一定要好好看看,很多企业都用Dubbo一定要好好看看

    参考:Dubbo:来自于阿里巴巴的分布式服务框架

  3、SOA 架构面向服务,那么他如何提供服务,Web Servcie 包含了三种主流的Web实现方式,他们彼此的区别和联系,: 

         (a) REST:表征状态转变 (基于HTTP协议),主要在分布式框架中使用
      (b) SOAP:简单对象访问协议(基于任何传输协议,TCP,HTTP,SMTP,MSMQ)
      (c) XML-RPC:远程过程调用协议 (已经慢慢被SOAP取代)RPC(跨越了传输层和应用层,基于HTTP和TCP)

          面试人员问:REST协议与RPC协议的区别和联系(sougou ,等等:

    参考:SOA,SOAP,RPC,以及 RPC协议与 REST 协议之间的关系(搜狗)

  4、互联网分布式事务,微服务,比如现在有个系统很大,很多不同的部门进行开发,语言也很多,就使用微服务。用户管理之类的;

  5、RPC(是否使用过,这个京东,美团,360 的面试多次提及)

    参考:RPC-原理及RPC实例分析

    参考:RPC架构-美团,京东面试题目

    参考:Java实现简单的RPC框架(美团面试)

  6、对高并发的限流措施类似于CDN转发,反向代理之类的

            限流措施考虑漏桶算法,令牌桶算法,参考:互联网应对高峰流量控制- 漏桶算法和令牌桶算法(滴滴面试)

           分布式锁,参考:分布式锁简单入门以及三种实现方式介绍(滴滴)

  7、LVS如何实现负载均衡的,

     (a)NAT(Virtual Server via Network Address Translation NAT(VS/NAT) 大名鼎鼎的IP负载均衡,工作在传输层

       (b)TUN (Virtual Server via IP Tunneling(VS/TUN)

       (c) DR Virtual Server via Direct Routing(VS/DR)  直接修改报文的MAC地址,工作在数据链路层

       下面的文章感觉不太清楚,但是大体介绍了方向:

       参考:LVS:三种负载均衡方式比较+另三种负载均衡方式

             这个文章更清楚:六大Web负载均衡原理与实现

  8、Zookeeper 如何实现负载均衡的,与kakfa的数据一致性有何区别

    比如两个IP同时去注册中心注册服务,考虑数据移植性的问题。

       参考:zookeeper 负载均衡 核心机制 包含ZAB协议

          参考:zookeeper如何实现负载均衡的?(具体连接哪一个zookeeper服务器的选择?)阿里面试

       参考:六大Web负载均衡原理与实现

        与kafka的区别和联系:

      参考:kafka 数据一致性-leader,follower机制与zookeeper的区别;

  9、Tomcat,Jboss,Apache,Weblogic的区别,Tomcat,Jboss,Weblogic都可以部署包,有区别吗?

    参考:Tomcat Jboss Apache WebLogic区别与比较(阿里面试)

   10、Web容器,Servlet容器、SpringMVC容器的区别:

          我们平时所说的J2EE包含了 标准版:Web容器 (JSF java标准版)和 EJB容器(Java企业版)

         Web容器 里面包含了JSP和 Servlet容器,Servlet用来处理请求;

         比如Tomcat 是Web容器,只能做JSP和Servlet的Container,不支持EJB

                Jboss  它不但是Servlet容器,而且是EJB容器(同时支持EJB的优化版tomcat)

             WebLogic Server是专门为企业电子商务应用系统开发的它不但是Servlet容器,而且是EJB容器

         具体Web容器与Servlet容器的区别联系:Tomcat Jboss Apache WebLogic区别与比较(阿里面试)

         SpringMVC原理:参考:Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

  11、自己定义了一个HashMap,按照tomcat的类加载顺序,如果别人写了个hashmap.jar包,你引用了,会不会有问题呢; 

    答,一定不会,webappclassloader类加载器是相互隔离的,tomcat虽然不遵循类加载机制但是上层的还是遵循类加载机制

    参考:图解Tomcat类加载机制(阿里面试题)

       12、Tomcat 的组成,包含几部分,如何处理并发数的;

           默认的连接是200个 

 

五、数据结构知识:

        1、 ArrayList 和LinkedList 的区别,另外请说明 ArrayList 的数组的默认大小,以及当超出默认大笑之后,内存如何处理;               

  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    还有个 ArrayList 如何默认  List<String> abc=new ArrayList<String>(); 

    这个默认是10,现在有个问题,如果我们往下面添加的数据大于10,数组如何存储:

    这样,数组会从新拷贝一个新的数组,这个数组的长度如下:

    那么容量变化的规则是什么呢?请看下面的公式:
    ((旧容量 * 3) / 2) + 1  
  注:这点与C#语言是不同的,C#当中的算法很简单,是翻倍。

  然后把之前的元素拷贝进来,然后,原来的回收掉,变成现在的数组,如果后续继续大于现在的新size;则还会按照这个模式进行递增;


  1、目前数据库有10亿数据,如何设计
    使用单组多读也就是说,一个主数据库负责读写, 其他的从数据库负责读,不负责写,不然延迟太高了。
    然后使用BinLog将主数据库的数据进行实时同步到从数据库;

  2、红黑树,查找树,二叉遍历树概念 ,红黑树的树高是多少?

    答:红黑树高是2log(n+1)

    (1)  红黑树的树高度是2log(n+1)

    (2) 左旋,将“x的右孩子”设为“x的父亲节点”;即,将 x变成了一个左节点(x成了为z的左孩子)!

    (3)右旋:将“x的左孩子”设为“x的父亲节点”;即,将 x变成了一个右节点(x成了为y的右孩子)!

    (4)红黑树的特性:

     R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
  (1)每个节点或者是黑色,或者是红色。
  (2)根节点是黑色。
  (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  (4)如果一个节点是红色的,则它的子节点必须是黑色的。
  (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。   

     参考:红黑树(一)之 原理和算法详细介绍

    参考:红黑树与AVL树

    参考:二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离

    参考:平衡二叉树,AVL树之图解篇

     6、单链表反转,两种方式,迭代和递归

       参考:链表翻转的图文讲解(递归与迭代两种实现)

 

六、多线程知识:

       1、什么是线程池,为什么要用,如何实现的,多线程runnable thread 的区别和联系 

  关于runnable和 thread: 参考:Java 多线程 -Thread 和Runnable 的区别和联系

  多线程专题:参考:Java-线程池专题 (美团面试题)

  数据库的连接池专题:MySql数据库连接池专题

  1、线程的五个状态,

    参考:Java线程的5种状态及切换(透彻讲解)-京东面试

  2、如何解决多线程的安全问题,无非两个方法:synchronized 和 lock,它的如何实现的,

    lock使用了AQS(AbstractQueueSynchronzied)队列实现,

    reentracelock可重入指的是什么?  

    答:可重入的意思是某一个线程是否可多次获得一个锁,比如synchronized就是可重入的,ReentrantLock也是可重入的,如何实现的,

    参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度)

       3、如何用lock 实现一个synchronized方法体;(lock很简单,拿到锁之后,做什么。之类的;)

    参考:使用synchronized实现一个Lock-美团面试题目

    4、线程池的workQueue的拒绝策略是什么?   

       当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略: 

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

     参考:深入理解Java之线程池(爱奇艺面试) 

 5、多线程的线程池中,如果是无界队列那么MaxPoolSize就没有意义了;

    6、   线程池如何停止线程的?以及interrupt()函数的理解

  ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown()和shutdownNow(),其中:

               (a) shutdown():调用了Interrupt(); 不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务

               (b) shutdownNow():调用了不安全的stop()函数,强行停止了线程池,类似于断电关电脑,立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务  

     参考:深入理解Java之线程池(爱奇艺面试)

     参考:Java结束线程的三种方法(爱奇艺面试)

  

  7、sleep 和wait()区别:

    参考:sleep、yield、wait、join的区别(阿里面试)

     8、 乐观锁,悲观锁,的使用场景?

    先说乐观锁和悲观锁的机制:
    1. 乐观锁是一种思想,具体实现是,表中有一个版本字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。之所以叫乐观,因为这个模式没有从数据库加锁。
    2. 悲观锁是读取的时候为后面的更新加锁,之后再来的读操作都会等待。这种是数据库锁

乐观锁优点程序实现,不会存在死锁等问题。它解决不了脏读的问题,他的适用场景也相对乐观。阻止不了除了程序之外的数据库操作。

悲观锁是数据库实现,他阻止一切数据库操作。

  应用场景:

    悲观锁:Synchroinzed 和ReentrantLock 都是悲观锁,传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 

    乐观锁:数据库的多版本并发控制,MVCC,就是典型的乐观锁。

    参考:Mysql 的InnoDB事务方面的 多版本并发控制如何实现 MVCC

    MVCC注意:

  只有read-committed和 repeatable-read 两种事务隔离级别才能使用mVcc

  read-uncommited由于是读到未提交的,所以不存在版本的问题

  而serializable 则会对所有读取的行加锁。  

  再来说更新数据丢失,所有的读锁都是为了保持数据一致性。乐观锁如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户从新操作。悲观锁则会等待前一个更新完成。这也是区别。具体业务具体分析 

  参考:Mysql 的InnoDB事务方面的 多版本并发控制如何实现 MVCC

      9、分布式锁,比如如何高效率的处理秒杀的业务

   参考:分布式锁简单入门以及三种实现方式介绍(滴滴)

七、数据库知识:

  1、redis与memeched的区别:

    redis 和 memeched 都可以做集群,但是redis 可以master-slave备份。(阿里面试)

    参考:Redis和Memcache的区别总结-京东阿里面试

   2、Redis中的Set的时间复杂度是多少,数据结构是什么样的,Redis的优点和缺点,支持哪五种类型。

    时间复杂度是O(1) 因为Set是value为null的HashMap而已,参考:

  参考:redis 数据类型详解 以及 redis适用场景场合 

  3、索引掌握,关键是啥叫聚簇索引,聚集索引,非聚集索引都是啥啊

    参考:主键就是聚集索引吗?

    参考:索引-数据库 索引创建默认是非聚集索引

    参考:数据库-索引 (聚集索引和非聚集索引)

    参考:数据库索引- 复合索引(多列索引)

    参考: 索引都有哪些类型

    参考:什么时候用索引

    参考:sql-索引的作用(超详细)

    参考:SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复

  4、SQL 后面有个加号,(+)含义是什么

    参考:oracle的SQL语句中的(+)是干什么用的?

  5、SQL优化一个很大的SQL很慢,如何处理;用profile分析;

    参考:MySQL专题3 SQL 优化 

  6、DB连接池,常用的是两个:DBCP,C3P0

     DBCP的常用参数包含了

    MaxActive:最大连接数

    MaxIdle 最大空闲数

    MinIdle 最小空闲数

    InitSize初始化连接数

    MaxWait 接池中连接用完时,新的请求等待时间,毫秒 MaxWait是最大等待秒钟数

      参考:MySql数据库连接池专题  

     7、Mysql中InnoDB与MyIsam的区别,以及InnoDB支持的三种锁,行锁,间隙锁,next-key锁;

           最大的区别是:InnoDB支持事务,MyIsam不支持事务。 

           Mysql的MVCC不能解决幻读的问题,但是Mysql有间隙锁功能,Mysql的间隙锁工作在Repeatable Read隔离级别下面,可以防止幻读, 

      参考:Mysql 间隙锁原理,以及Repeatable Read隔离级别下可以防止幻读原理(百度)

    参考:MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)

          8、mysql多版本控制

        原子性(Atomicity), 一致性(Consistency),隔离性(Isolation),持久性(Durability)

       参考:MySql中启用InnoDB数据引擎简介 以及 InnoDB与 MYISAM的区别和联系

              参考MySql的多存储引擎架构

           参考:数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别

           参考:Mysql 的InnoDB事务方面的 多版本并发控制如何实现 MVCC

          数据库连接池专题:MySql数据库连接池专题

八、编程技巧知识:

  JVM调优:jstate查看内存使用,jmap的dump导出日志等

  参考:Jvm dump介绍与使用(内存与线程)

  参考:如何在Windows下查看JAVA端口占用情况(阿里面试)

   参考:jvm调优-从eclipse开始

  参考:Java JVM- jstat查看jvm的GC情况[转]

九、Maven

  1、如何解决Maven的版本冲突问题

  参考:Maven 3-Maven依赖版本冲突的分析及解决小结 (阿里,美团,京东面试)

      2、关于MAVEN的问题:Release 版本与SNAPSHOT之间的区别

   参考:maven snapshot和release版本的区别

    参考:Maven学习——1、安装与修改Maven的本地仓库路径

 

十、ELK日志收集系统:

  参考:通过ELK快速搭建一个你可能需要的集中化日志平台

十一、对Hadoop的理解

   hadoop中的HBase,Hive,

十二、Hibernate的理解

      1、Hibernate的延迟加载是如何实现的:使用了动态代理

          参考:Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面) 

十三、协议 SOCKET,IO,HTTP ,TCP部分:

     1、 七层架构模型 +和四层架构模型(网络接口层-->网络层-->传输层 -->应用层)

            TCP三次握手,四次挥手,具体的SYN,ACK指代的含义 

           参考:TCP协议详解7层和4层解析(美团面试,阿里面试) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握

    2、BIO,NIO(Non-blocked IO),AIO的区别

    参考:IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别(百度)

   3、select,poll,epoll的区别: 

       select,poll,epoll都是IO多路复用的机制   

        (1)select==>时间复杂度O(n)

       它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进     行  操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

       (2)poll==>时间复杂度O(n)

       poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样      有一个缺点:

        (3)epoll==>时间复杂度O(1)

        epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时        我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

    参考:select、poll、epoll之间的区别(搜狗面试)

   4、IO 与NIO(New IO)的区别

        参考:Java NIO:IO与NIO的区别 -阿里面试题

     5、Http的数据结构,包含了两类;response,request;分别是

          (a) Request:请求行,请求头,空行,请求体

       (b) Response 状态行,相应头,空行,相应体

          参考:HTTP协议 结构,get post 区别(阿里面试)

     6、 cookie 和session的区别, session是无状态的吗?那如何知道是谁访问的,怎么过来的,AppSession;

          参考:Session, Cookie区别

十四、即时问题:

  微信如何做到,用手机的微信扫码就可以登录电脑客户端的:

  分析:

    现在有三方,服务器,微信手机端,微信电脑端,

  在电脑端点击使用微信扫码登录,会弹出二维码,这时候,电脑端会跟服务器端建立长连接。等待服务器指令。

  微信手机端扫码后,如果手机端登陆了会将登陆的唯一标识传给服务器,服务器收到唯一标识后,发送报文给微信电脑端,可以登陆了。(一定是微信电脑端先去连接服务器,不能反过来)

 

十五、框架部署知识:

  1、现在我有mysql 3台 Master +2 slave; 我想这样 请求 Master 承担20% 两个 Slave 各自承担40%如何处理:

  使用:DBProxy(),可以做到这样,不用改源码,直接分配请求;

  参考:LVS+Keepalived实现DBProxy的高可用

  我们知道 主从mysql数据库,通过BinLog进行同步,到底是如何同步的

  答:有个IO线程,一个负责拉取log,另一个负责SQL写日志,

  2、Spring Cloud 如何处理服务熔断的,A->B->C 出了问题,如何处理使用Hystrix,目前C服务 是C1,C2,C3三个服务器提供的负载均衡,C1坏了,请求直接发送到C2,C3如何实现负载均衡的?

   通过长连接,心跳的方式,健康检查,每隔一段时间就发信息如果收不到请求,认为服务器宕机了。

  3、Spring Cloud 和 Dubble的区别; 

    参考:Dubbo和Spring Cloud微服务架构比较

  4、Dubble支持异步吗? 是长链接吗

    答: Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

    参考:Dubbo和Spring Cloud微服务架构比较

  5、目前有个服务器我希望 请求每分钟3万次,如果超了自动拒绝,如何处理

    使用漏桶算法算法,令牌桶算法,

    参考:互联网应对高峰流量控制- 漏桶算法和令牌桶算法(滴滴面试)

  6、我现在想服务器每分钟接收一个用户的请求小于60个,如何处理:

    使用Redis 缓存服务器,可以设置key=用户ID value不停地加一到了60就停止,然后把 redis的缓存时间设置为1分钟,过了一分钟就 失效;

  7、现在A->B->C 三个服务相互依赖,有个用户请求访问了A->B->C,如何跟踪,使用隐式传参的方法,传递了上下文。 taskmasterid 

使用ThreadLocal参数隐式传参

 

十六、Java 缓存知识Ehcache,redis

  参考:Hibernate性能优化之EHCache缓存

  参考:ehcache详细解读

  参考:5个强大的Java分布式缓存框架推荐

  参考:ehcache、redis应用场景比较

十七、 Java调度任务:

  可以使用Quartz 包含了两部分:JobDetails 和Trigger,它可以持久化到硬盘,

  Quartz源码:

  SchedulerFactory schedFact=new StdSchedulerFactory();
        Scheduler sched=schedFact.getScheduler();
        sched.start();
        //创建一个JobDetail,指明 name,groupname,以及具体的Job类名,该Job负责定义具体的执行任务;
        JobDetail jobDetail=new JobDetail("myJob","myJobGroup",QuartzTest.class);
        jobDetail.getJobDataMap().put("type","FULL"); 
//         定义调度触发规则,比如每1秒运行一次,共运行8次
           SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");
//         马上启动
           simpleTrigger.setStartTime(new Date());
//         间隔时间
           simpleTrigger.setRepeatInterval(1000);
//         运行次数
           simpleTrigger.setRepeatCount(8);           
        //用scheduler将JobDetail与Trigger关联在一起,开始调度任务;
        sched.scheduleJob(jobDetail,simpleTrigger);

  参考:深入解读Quartz的原理

  参考:Quartz集成springMVC 的方案二(持久化任务、集群和分布式)

  阿里的面试官问,如果现在很多调度任务,如何优化,可以使用调度池,Java1.5之后,引入了ScheduledExecutor,参考:ScheduledExecutor,

  源码:

 ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

  参考:Java 几种调度任务的Timer、ScheduledExecutor、 开源工具包 Quartz、开源工具包 JCronTab

   十八、消息队列知识MQ:

       1、Kafka的消息队列的特征,kafka实现的原理: 

       参考:Kafka 简介

       参考:kafka 数据一致性-leader,follower机制与zookeeper的区别;

  十九、Linux知识

     1、Linux 如何查询上下五行 

    如果在只是想匹配模式的上下几行,grep可以实现。      
$grep -5 'parttern' inputfile //打印匹配行的前后5行 
 
$grep -C 5 'parttern' inputfile //打印匹配行的前后5行

$grep -A 5 'parttern' inputfile //打印匹配行的后5行 

$grep -B 5 'parttern' inputfile //打印匹配行的前5行

 查看mysql慢日志中ip地址为192.168.0.10发送过来的SQL语句的后面三行

tail -50 /usr/local/mysql/data/sql-slow.log |grep -3 '192.168.0.10'  

匹配PHP错误日志中某一个字段  

tail -100 /data/logs/php/php_error_5.3.log  | grep  "Memcache::get()";

查看某一个文件第5行和第10行

 sed -n '5,10p' filename 这样你就可以只查看文件的第5行到第10行。

 

 

 动手题目: 

       (1) 让两个有序队列 合并成一个有序队列;

 

  

 其他 

1、修改简历,把hadoop去掉;Android去掉;  

2、搜索引擎的架构,如何做到搜素的,原理是什么?

Mysql索引结构及常见索引的区别

Mybatis的理解;

 

posted @ 2018-03-15 19:17  aspirant  阅读(3992)  评论(2编辑  收藏  举报