该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所须要掌握的核心知识)。地址:github.com/Snailclimb/….php
腾讯云热门云产品1折起,送13000元续费/升级大礼包:cloud.tencent.com/redirect.ph…前端
腾讯云新用户大额代金券:cloud.tencent.com/redirect.ph…java
系列文章:git
这是我总结的美团面经的基础篇,后面还有进阶和终结篇哦!下面只是我从不少份美团面经中总结的在面试中一些常见的问题。不一样于我的面经,这份面经具备普适性。每次面试必备的自我介绍、项目介绍这些东西,你们能够本身私下好好思考。我在前面的文章中也提到了应该怎么作自我介绍与项目介绍,详情能够查看这篇文章:【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试?。程序员
System.out.println(3 | 9);
输出什么?正确答案:11.github
考察知识点:逻辑运算符与(&和&&)或(|和||)面试
&和&&:spring
共同点:它们都表示运算符的两边都是true时,结果为true;sql
不一样点: & 表示在运算时两边都会计算,而后再判断;&&表示先运算符号左边的东西,而后判断是否为true,是true就继续运算右边的而后判断并输出,是false就停下来直接输出不会再运行后面的东西。数据库
|和||:
共同点:它们都表示运算符的两边任意一边为true,结果为true,两边都不是true,结果就为false;
不一样点:| 表示两边都会运算,而后再判断结果;|| 表示先运算符号左边的东西,而后判断是否为true,是true就停下来直接输出不会再运行后面的东西,是false就继续运算右边的而后判断并输出。
回到本题:
3 | 9=0011(二进制) | 1001(二进制)=1011(二进制)=11(十进制)
转发是服务器行为,重定向是客户端行为。
转发(Forword) 经过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)
方法实现的。RequestDispatcher
能够经过HttpServletRequest
的 getRequestDispatcher()
方法得到。例以下面的代码就是跳转到 login_success.jsp 页面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
复制代码
重定向(Redirect) 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器经过HttpServletRequestResponse的setStatus(int status)方法设置状态码。若是服务器返回301或者302,则浏览器会到新的网址从新请求该资源。
图解(图片来源:《图解HTTP》):
整体来讲分为如下几个过程:
具体能够参考下面这篇文章:
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
漫画图解:
图片来源:《图解HTTP》
简单示意图:
三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,本身接收正常。
第二次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身接收正常,对方发送正常
第三次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身发送、接收正常,对方发送接收正常
因此三次握手就能确认双发收发功能都正常,缺一不可。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
SYN 是 TCP/IP 创建链接时使用的握手信号。在客户机和服务器之间创建正常的 TCP 网络链接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通讯传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能创建起可靠的TCP链接,数据才能够在客户机和服务器之间传递。
双方通讯无误必须是二者互相发送信息都无误。传了 SYN,证实发送方(主动关闭方)到接收方(被动关闭方)的通道没有问题,可是接收方到发送方的通道还须要 ACK 信号来进行验证。
断开一个 TCP 链接则须要“四次挥手”:
任何一方均可以在数据传送结束后发出链接释放的通知,待对方确认后进入半关闭状态。当另外一方也没有数据再发送的时候,则发出链接释放通知,对方确认后就彻底关闭了TCP链接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,可是 B 可能还会有要说的话,A 不能要求 B 跟着本身的节奏结束通话,因而 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
上面讲的比较归纳,推荐一篇讲的比较细致的文章:blog.csdn.net/qzcsu/artic…
IP地址是指互联网协议地址(Internet Protocol Address)IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差别。
MAC 地址又称为物理地址、硬件地址,用来定义网络设备的位置。网卡的物理地址一般是由网卡生产厂家写入网卡的,具备全球惟一性。MAC地址用于在网络中惟一标示一个网卡,一台电脑会有一或多个网卡,每一个网卡都须要有一个惟一的MAC地址。
HTTP请求报文主要由请求行、请求头部、请求正文3部分组成
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成
详细内容能够参考:blog.csdn.net/a19881029/a…
为何要使用索引?
索引这么多优势,为何不对表中的每个列建立一个索引呢?
索引是如何提升查询速度的?
将无序的数据变成相对有序的数据(就像查目录同样)
说一下使用索引的注意事项
Mysql索引主要使用的哪两种数据结构?
更多关于索引的内容能够查看个人这篇文章:【思惟导图-索引篇】搞定数据库索引就是这么简单
什么是覆盖索引?
若是一个索引包含(或者说覆盖)全部须要查询的字段的值,咱们就称 之为“覆盖索引”。咱们知道在InnoDB存储引擎中,若是不是主键索引,叶子节点存储的是主键+列值。最终仍是要“回表”,也就是要经过主键再查找一次,这样就会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不作回表操做!
进程与线程的区别是什么?
线程与进程类似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程当中能够产生多个线程。与进程不一样的是同类的多个线程共享同一块内存空间和一组系统资源,因此系统在产生一个线程,或是在各个线程之间做切换工做时,负担要比进程小得多,也正由于如此,线程也被称为轻量级进程。另外,也正是由于共享资源,因此线程中执行时通常都要进行同步和互斥。总的来讲,进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。
进程间的几种通讯方式说一下?
线程间的几种通讯方式知道不?
一、锁机制
二、信号量机制:包括无名线程信号量与有名线程信号量
三、信号机制:相似于进程间的信号处理。
线程间通讯的主要目的是用于线程同步,因此线程没有象进程通讯中用于数据交换的通讯机制。
简单来讲使用单例模式能够带来下面几个好处:
懒汉式(双重检查加锁版本)
public class Singleton {
//volatile保证,当uniqueInstance变量被初始化成Singleton实例时,多个线程能够正确处理uniqueInstance变量
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
//检查实例,若是不存在,就进入同步代码块
if (uniqueInstance == null) {
//只有第一次才完全执行这里的代码
synchronized(Singleton.class) {
//进入同步代码块后,再检查一次,若是还是null,才建立实例
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
复制代码
静态内部类方式
静态内部实现的单例是懒加载的且线程安全。
只有经过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance(只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题)。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
复制代码
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此以外,bean 就与应用程序中的其余对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将经过配置元数据来描述。
Spring中的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢? 例如对于Web应用来讲,Web容器对于每一个用户请求都建立一个单独的Sevlet线程来处理请求,引入Spring框架以后,每一个Action都是单例的,那么对于Spring托管的单例Service Bean,如何保证其安全呢? Spring的单例是基于BeanFactory也就是Spring容器的,单例Bean在此容器内只有一个,Java的单例是基于 JVM,每一个 JVM 内只有一个实例。
Spring的bean的生命周期以及更多内容能够查看:一文轻松搞懂Spring中bean的做用域与生命周期
事务传播行为(为了解决业务层方法之间互相调用的事务问题): 当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在本身的事务中运行。在TransactionDefinition定义中包括了以下几个表示传播行为的常量:
支持当前事务的状况:
不支持当前事务的状况:
其余状况:
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找处处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将获得视图对象返回给用户
关于 SpringMVC 原理更多内容能够查看个人这篇文章:SpringMVC 工做原理详解
过了秋招挺长一段时间了,说实话我本身也忘了如何简要归纳 Spring AOP IOC 实现原理,就在网上找了一个较为简洁的答案,下面分享给各位。
IOC: 控制反转也叫依赖注入。IOC利用java反射机制,AOP利用代理模式。IOC 概念看似很抽象,可是很容易理解。说简单点就是将对象交给容器管理,你只须要在spring配置文件中配置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,而后在你须要调用的时候,就把它已经初始化好的那些bean分配给你须要调用这些bean的类。
AOP: 面向切面编程。(Aspect-Oriented Programming) 。AOP能够说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来创建一种对象层次结构,用以模拟公共行为的一个集合。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法建立“方面”,从而使得编译器能够在编译期间织入有关“方面”的代码,属于静态代理。
你若怒放,清风自来。 欢迎关注个人微信公众号:“Java面试通关手册”,一个有温度的微信公众号。公众号后台回复关键字“1”,能够免费获取一份我精心准备的小礼物哦!