结束秋招,所有面试的面经总结,回馈牛客~
自三月份以来,经历了阿里的四次已回绝,网易的两次笔试没消息,功夫不负有心人,终于在今天! 还是没能拿到这两家的offer。
其中也经历了 招银网络科技提前批,海康提前批,搜狗,美团,华为优招,瓜子二手车等家公司的面试,目前拿到了其中五家的offer。
在找工作的过程中,十分感谢牛客网讨论群以big为代表的大佬,孜孜不倦的晒着各个大厂的offer,给予我动力。(哈哈哈 just kidding) 感谢牛客网的各种牛友的面经,和各个学长的内推信息。从实习以来经历了也算几十次面试,下面是每次面试中遇到不懂得问题的总结,希望对大家有所帮助。
最后希望每位同学都能找到理想的工作。
有志者事竟成,破釜沉舟,百二秦关终属楚
苦心人天不负,卧薪尝胆,三千越甲可吞吴
1、要区分线程控制 线程同步和线程通信
线程控制是sleep() yield()和join()等操作
线程同步是volatile和synchronized
线程通信是wait() notify() 阻塞队列等.
某种意义上,线程同步也是线程通信的一种。
2、每个线程拥有自己的栈空间,所有线程共享堆空间.
栈是线程私有的,堆是线程共享的.
3、线程和进程的区别
进程是系统资源分配的基本单位,线程是CPU调度的基本单位.
每个进程具有自己独立的地址空间,进程之间是相互独立的。
所有线程之间共享父进程的地址空间。
进程上下文切换比线程开销大得多。
4、进程间通信的方法
共享内存:将一块公共的物理内存映射到多个进程的私有地址空间。
socket通信
消息队列:对消息队列有写权限的进程可以向消息队列中添加新的消息,对消息队列有读权限的进程可以从消息队列中读走新的消息。
5、线程通信问题要考虑同步监视器的锁池和等待池。
锁池和等待池中的线程都处于阻塞状态。
不同线程竞争CPU时间片问题。
6、接口和抽象类的区别
1.抽象类是单一继承,接口是多重实现【子类只能有一个父类,而子类可以实现多个接口,继承
抽象类表示“从属”,是对种类的抽象,实现接口表示“组合”关系,是对行为的抽象】
--2.接口中全是抽象方法,抽象类中可以有抽象方法,也可有方法体的方法
--3.接口中无构造方法,抽象类可有构造方法
--4.接口中的不可以有private方法和变量,接口中的变量只能为public static final的,方法必须是 public abstract的(注意不能是static类型的),抽象类中可以有private方法和变量。
抽象类是允许有private变量和private方法的,因为抽象类中可以有具体的方法实现,在这些具体方法实现中可以用自己定义为private的变量和private方法。
它不同于接口,因为接口中不能有方法的具体实现,其所有的方法都要求实现它的类来具体实现,所以,接口中的私有变量和私有方法就永远不会用到,所以接口中不会有private变量和private方法。
7、TCP 三次握手 四次挥手
SYN→
←ACK SYN
ACK→
FIN→
←ACK
←FIN
ACK→
8、产生死锁的四个必要条件:
(1) 互斥条件:使用的资源是不能共享的。
(2) 请求与保持条件(hold and wait):线程持有一个资源并等待获取一个被其他线程持有的资源。
(3) 不剥夺条件:线程正在持有的资源不能被其他线程强行剥夺。
(4) 循环等待条件:线程之间形成一种首尾相连的等待资源的关系。
这四个条件是死锁的必要条件 ,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
9、JAVA7之前 switch括号中只能放int类型,之后可以放String和枚举类型。(其中byte short char可以自动提升为int类型,因此也可以放到括号里)。
10、类加载过程,即通过class文件创建相应的Class对象的过程。
一、装载(以二进制的形式读入class文件到方法区中,并在堆中实例化Class类的对象)
二、链接 (包括验证 准备 和 解析)
三、初始化
11、JAVA静态内部类和非静态内部类的区别:
非静态内部类看做外部类的非静态成员,静态内部类可以看做外部类的静态成员。
(1)非静态内部类实例化必须有关联的外部类的实例化对象,静态内部类不需要。
(2)非静态内部类对象中隐式保存了指向外部类对象的引用,因此可以访问外部类的所有成员(方法和字段,无论静态还是非静态)。而静态内部类只能访问外部类的静态成员。
(3)非静态内部类中不能有静态的成员(方法或字段),静态内部类中可以有。
静态内部类只是嵌套在外部类里面,仅此而已,外部类对象和静态内部类对象之间并没有什么关系。
12、单例模式 工厂模式 策略模式 适配器模式 生产者消费者模式 观察者模式
13、TCP 三次握手 四次挥手 的本质,交换了什么,如何保证建立连接?????
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
14、HTTP状态码
2XX 成功
3XX 重定向
4XX 请求错误
5XX 6XX 服务器错误
15、数据库索引分为 聚集索引 和 辅助索引,聚集索引决定数据的物理存储顺序,辅助索引是和数据分离出来的。
数据库索引从另一方面又分为B+树索引和哈希索引,B+树索引为传统意义上的索引是主要索引,3哈希索引是自适应的不能人为控制。
16、数据库引擎MySQL有两种InnoDB和MyISAM区别有:
1、InnoDB支持事务,MyISAM不支持
2、InooDB支持行级锁,MyISAM不支持
3、InnoDB有聚集索引(聚集索引以主键为索引),索引决定数据的物理存储顺序,辅助索引的叶节点里存储的是主键值。而MyISAM数据和索引分开,索引中叶节点里存储的是行号。
17、synchronized和lock区别
1、synchronized是在JVM层面上实现的,而ReentrantLock是在代码层面上实现的。
2、lock比起synchronized增加了 响应中断锁等候 和 定时锁等候
3、synchronized(重量级锁)是悲观锁,lock为乐观锁。
4、lock可以设置为公平锁,即每次等待时间最长的线程获得锁。
18、事务是一条或者多条数据库操作的集合,具有ACID四个特性。即 原子性 一致性 隔离性 和持久性。
19、四种事务隔离级别
四种mysql默认为 可重复读~
读取已提交内容 和 可重复读 两种隔离级别通过MCVV(多版本并发控制)实现.
读取已提交内容:MVCC 读不加锁 写加锁
(读取历史版本)相对于可重复读,是最近的历史版本。
可重复读:MVCC+Read View +Gap锁 读不加锁写加锁(读取历史版本)
Read View保证事务过程中读取的一致性,即可重复读
Gap锁(解决当前读)+Read View(解决快照读) 解决幻读问题
MySQL的可重复读模式下,不会出现幻读。
在读取提交内容 和 可重复读 模式下,读操作都不加锁, 在串行化模式下读加锁
20、SpringMVC
24、遍历Set set过程中删除元素不可使用set.remove() 而应使用迭代器删除iterator.remove()
25、GC Root
系统类加载器加载进来的class对象
活着的线程
虚拟机栈里面的对象
26、线程池参数
核心线程池大小
最大线程池大小
最长等待时间
任务队列大小
拒绝处理任务的处理器
核心工作线程是否超时退出
如何解决死锁?
有三个方法:
1.进程在申请资源时,一次性得请求他所需要的所有资源。若无法满足则不能执行。
2.进程在申请新的资源时,释放已占有的资源。后面若还需要它们,则需要重新申请。
3.将系统中的资源顺序编号,规定进程只能依次申请资源。