稽核知识点:逻辑运算符与(&和&&)或(|和||)
&和&&:
共同点:它们都表示运算符的两边都是true时,结果为true;
不同点: & 表示在运算时两边都会打算,然后再判断;&&表示先运算符号左边的东西,然后判断是否为true,是true就连续运算右边的然后判断并输出,是false就停下来直接输出不会再运行后面的东西。
|和||:
共同点:它们都表示运算符的两边任意一边为true,结果为true,两边都不是true,结果就为false;
不同点:| 表示两边都会运算,然后再判断结果;|| 表示先运算符号左边的东西,然后判断是否为true,是true就停下来直接输出不会再运行后面的东西,是false就连续运算右边的然后判断并输出。
回到本题:
3 | 9=0011(二进制) | 1001(二进制)=1011(二进制)=11(十进制)
2. 说一下转发(Forward)和重定向(Redirect)的差异转发是做事器行为,重定向是客户端行为。
转发(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,则浏览器会到新的网址重新要求该资源。
从地址栏显示来说: forward是做事器要求资源,做事器直接访问目标地址的URL,把那个URL的相应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道做事器发送的内容从哪里来的,以是它的地址栏还是原来的地址. redirect是做事端根据逻辑,发送一个状态码,见告浏览看重新去要求那个地址.以是地址栏显示的是新的URL.从数据共享来说: forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据.从利用地方来说: forward:一样平常用于用户上岸的时候,根据角色转发到相应的模块. redirect:一样平常用于用户注销上岸时返回主页面和跳转到其它的网站等从效率来说: forward:高. redirect:低.3. 在浏览器中输入url地址 ->> 显示主页的过程,全体过程会利用哪些协议图解(图片来源:《图解HTTP》):
状态码
总体来说分为以下几个过程:
DNS解析TCP连接发送HTTP要求做事器处理要求并返回HTTP报文浏览器解析渲染页面连接结束详细可以参考下面这篇文章:
https://segmentfault.com/a/11900000068797004. TCP 三次握手和四次挥手为了准确无误地把数据投递目标处,TCP协议采取了三次握手策略。
漫画图解:
图片来源:《图解HTTP》
TCP三次握手
大略示意图:
TCP三次握手
客户端–发送带有 SYN 标志的数据包–一次握手–做事端做事端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端客户端–发送带有带有 ACK 标志的数据包–三次握手–做事端为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,大略来说便是数据的发送与吸收,而三次握手最紧张的目的便是双方确认自己与对方的发送与吸收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己吸收正常。
第二次握手:Client 确认了:自己发送、吸收正常,对方发送、吸收正常;Server 确认了:自己吸收正常,对方发送正常
第三次握手:Client 确认了:自己发送、吸收正常,对方发送、吸收正常;Server 确认了:自己发送、吸收正常,对方发送吸收正常
以是三次握手就能确认双发收发功能都正常,缺一不可。
为什么要传回 SYN
吸收端传回发送端所发送的 SYN 是为了见告发送端,我吸收到的信息确实便是你所发送的旗子暗记了。
SYN 是 TCP/IP 建立连接时利用的握手旗子暗记。在客户机和做事器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN ,做事器利用 SYN-ACK 应答表示吸收到了这个,末了客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,吸收站发给发送站的一种传输掌握字符。它表示确认发来的数据已经接管无误。 ])相应。这样在客户机和做事器之间才能建立起可靠的TCP连接,数据才可以在客户机和做事器之间通报。传了 SYN,为啥还要传 ACK
双方通信无误必须是两者相互发送信息都无误。传了 SYN,证明发送方(主动关闭方)到吸收方(被动关闭方)的通道没有问题,但是吸收方到发送方的通道还须要 ACK 旗子暗记来进行验证。
TCP四次挥手
断开一个 TCP 连接则须要“四次挥手”:
客户端-发送一个 FIN,用来关闭客户端到做事器的数据传送做事器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号做事器-关闭与客户真个连接,发送一个FIN给客户端客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1为什么要四次挥手
任何一方都可以在数据传送结束后发出连接开释的关照,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接开释关照,对方确认后就完备关闭了TCP连接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能哀求 B 随着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,末了 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
上面讲的比较概括,推举一篇讲的比较细致的文章:https://blog.csdn.net/qzcsu/article/details/72861891
5. IP地址与MAC地址的差异参考:https://blog.csdn.net/guoweimelon/article/details/50858597
IP地址是指互联网协议地址(Internet Protocol Address)IP Address的缩写。IP地址是IP协议供应的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
MAC 地址又称为物理地址、硬件地址,用来定义网络设备的位置。网卡的物理地址常日是由网卡生产厂家写入网卡的,具有环球唯一性。MAC地址用于在网络中唯一标示一个网卡,一台电脑会有一或多个网卡,每个网卡都须要有一个唯一的MAC地址。
6. HTTP要求、相应报文格式HTTP要求报文紧张由要求行、要求头部、要求正文3部分组成
HTTP相应报文紧张由状态行、相应头部、相应正文3部分组成
详细内容可以参考:https://blog.csdn.net/a19881029/article/details/14002273
7. 为什么要利用索引?索引这么多优点,为什么不对表中的每一个列创建一个索引呢?索引是如何提高查询速率的?说一下利用索引的把稳事变?Mysql索引紧张利用的两种数据构造?什么是覆盖索引?为什么要利用索引?
通过创建唯一性索引,可以担保数据库表中每一行数据的唯一性。可以大大加快 数据的检索速率(大大减少的检索的数据量), 这也是创建索引的最紧张的缘故原由。帮助做事器避免排序和临时表将随机IO变为顺序IO可以加速表和表之间的连接,特殊是在实现数据的参考完全性方面特殊故意义。索引这么多优点,为什么不对表中的每一个列创建一个索引呢?
当对表中的数据进行增加、删除和修正的时候,索引也要动态的掩护,这样就降落了数据的掩护速率。索引须要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么须要的空间就会更大。创建索引和掩护索引要耗费韶光,这种韶光随着数据量的增加而增加。索引是如何提高查询速率的?
将无序的数据变成相对有序的数据(就像查目录一样)
说一下利用索引的把稳事变
避免 where 子句中对宇段施加函数,这会造成无法命中索引。在利用InnoDB时利用与业务无关的自增主键作为主键,即利用逻辑主键,而不要利用业务主键。将打算加索引的列设置为 NOT NULL ,否则将导致引擎放弃利用索引而进行全表扫描删除长期未利用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 可以通过查询 sys 库的 chema_unused_indexes 视图来查询哪些索引从未被利用在利用 limit offset 查询缓慢时,可以借助索引来提高性能Mysql索引紧张利用的哪两种数据构造?
哈希索引:对付哈希索引来说,底层的数据构培养是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;别的大部分场景,建议选择BTree索引。BTree索引:Mysql的BTree索引利用的是B树中的B+Tree。但对付紧张的两种存储引擎(MyISAM和InnoDB)的实现办法是不同的。什么是覆盖索引?
如果一个索引包含(或者说覆盖)所有须要查询的字段的值,我们就称
之为“覆盖索引”。我们知道在InnoDB存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值。终极还是要“回表”,也便是要通过主键再查找一次,这样就会比较慢。覆盖索引便是把要查询出的列和索引是对应的,不做回表操作!
更多关于索引的内容可以查看我的这篇文章:【思维导图-索引篇】搞天命据库索引便是这么大略
8. 进程与线程的差异是什么?进程间的几种通信办法说一下?线程间的几种通信办法知道不?进程与线程的差异是什么?
线程与进程相似,但线程是一个比进程更小的实行单位。一个进程在其实行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,以是系统在产生一个线程,或是在各个线程之间作切换事情时,包袱要比进程小得多,也正由于如此,线程也被称为轻量级进程。其余,也正是由于共享资源,以是线程中实行时一样平常都要进行同步和互斥。总的来说,进程和线程的紧张差别在于它们是不同的操作系统资源管理办法。
进程间的几种通信办法说一下?
管道(pipe):管道是一种半双工的通信办法,数据只能单向流动,而且只能在具有血缘关系的进程间利用。进程的血缘关系常日指父子进程关系。管道分为pipe(无名管道)和fifo(命名管道)两种,有名管道也是半双工的通信办法,但是它许可无亲缘关系进程间通信。旗子暗记量(semophore):旗子暗记量是一个计数器,可以用来掌握多个进程对共享资源的访问。它常日作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,紧张作为进程间以及同一进程内不同线程之间的同步手段。行列步队(message queue):行列步队是由组成的链表,存放在内核中 并由行列步队标识符标识。行列步队战胜了旗子暗记通报信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺陷。行列步队与管道通信比较,其上风是对每个指定特定的类型,吸收的时候不须要按照行列步队次序,而是可以根据自定义条件吸收特定类型的。旗子暗记(signal):旗子暗记是一种比较繁芜的通信办法,用于关照吸收进程某一事宜已经发生。共享内存(shared memory):共享内存便是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC办法,它是针对其他进程间的通信办法运行效率低而专门设计的。它每每与其他通信机制,如旗子暗记量合营利用,来实现进程间的同步和通信。套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。线程间的几种通信办法知道不?
1、锁机制
互斥锁:供应了以排它办法阻挡数据构造被并发修正的方法。读写锁:许可多个线程同时读共享数据,而对写操作互斥。条件变量:可以以原子的办法壅塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起利用。2、旗子暗记量机制:包括无名线程旗子暗记量与有名线程旗子暗记量
3、旗子暗记机制:类似于进程间的旗子暗记处理。
线程间通信的紧张目的是用于线程同步,以是线程没有象进程通信中用于数据交流的通信机制。
9. 为什么要用单例模式?手写几种线程安全的单例模式?大略来说利用单例模式可以带来下面几个好处:
对付频繁利用的工具,可以省略创建工具所花费的韶光,这对付那些重量级工具而言,是非常可不雅观的一笔系统开销;由于 new 操作的次数减少,因而对系统内存的利用频率也会降落,这将减轻 GC 压力,缩短 GC 停顿韶光。静态内部类办法
静态内部实现的单例是
只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance(只有第一次利用这个单例的实例的时候才加载,同时不会有线程安全问题)。
10. 大略先容一下bean。知道Spring的bean的浸染域与生命周期吗?
在 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 内只有一个实例。
pring的bean的浸染域
Spring的bean的生命周期以及更多内容可以查看:一文轻松搞懂Spring中bean的浸染域与生命周期
11. Spring 中的事务传播行为理解吗?TransactionDefinition 接口中哪五个表示隔离级别的常量?事务传播行为
事务传播行为(为理解决业务层方法之间相互调用的事务问题):
当事务方法被另一个事务方法调用时,必须指定事务该当如何传播。例如:方法可能连续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
支持当前事务的情形:
TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的办法连续运行。TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出非常。(mandatory:逼迫性)不支持当前事务的情形:
TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务办法运行,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NEVER: 以非事务办法运行,如果当前存在事务,则抛出非常。其他情形:
TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。隔离级别
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
TransactionDefinition.ISOLATION_DEFAULT: 利用后端数据库默认的隔离级别,Mysql 默认采取的 REPEATABLE_READ隔离级别 Oracle 默认采取的 READ_COMMITTED隔离级别.TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,许可读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读TransactionDefinition.ISOLATION_READ_COMMITTED: 许可读取并发事务已经提交的数据,可以阻挡脏读,但是幻读或不可重复读仍有可能发生TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是同等的,除非数据是被本身事务自己所修正,可以阻挡脏读和不可重复读,但幻读仍有可能发生。TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完备服从ACID的隔离级别。所有的事务依次逐个实行,这样事务之间就完备不可能产生滋扰,也便是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。常日情形下也不会用到该级别。12. SpringMVC 事理理解吗?SpringMVC 事理
客户端发送要求-> 前端掌握器 DispatcherServlet 接管客户端要求 -> 找到处理器映射 HandlerMapping 解析要求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理要求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图工具->前端掌握器 DispatcherServlet 渲染数据(Moder)->将得到视图工具返回给用户
关于 SpringMVC 事理更多内容可以查看我的这篇文章:SpringMVC 事情事理详解
13. Spring AOP IOC 实现事理过了秋招挺长一段韶光了,说实话我自己也忘了如何简要概括 Spring AOP IOC 实现事理,就在网上找了一个较为简洁的答案,下面分享给各位。
IOC: 掌握反转也叫依赖注入。IOC利用java反射机制,AOP利用代理模式。IOC 观点看似很抽象,但是很随意马虎理解。说大略点便是将工具交给容器管理,你只须要在spring配置文件中配置对应的bean以及设置干系的属性,让spring容器来天生类的实例工具以及管理工具。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你须要调用的时候,就把它已经初始化好的那些bean分配给你须要调用这些bean的类。
AOP: 面向切面编程。(Aspect-Oriented Programming) 。AOP可以说是对OOP的补充和完善。OOP引入封装、继续和多态性等观点来建立一种工具层次构造,用以仿照公共行为的一个凑集。实现AOP的技能,紧张分为两大类:一是采取动态代理技能,利用截取消息的办法,对该进行装饰,以取代原有工具行为的实行;二是采取静态织入的办法,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理。
原文:https://mp.weixin.qq.com/s/HDFzbAHP2bXCl1iOxa5wDg