java后台开发岗实习面试准备(字节跳动)(长文警告)

基础知识


计算机网络相关

HTTP

关于HTTP协议,一篇就够了 http://www.cnblogs.com/ranyonsue/p/5984001.htmlhtml

  • HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。java

  • HTTP是一个基于TCP/IP通讯协议来传递数据(HTML 文件, 图片文件, 查询结果等)。web

  • HTTP是一个属于应用层的面向对象的协议。面试

  • HTTP协议工做于客户端-服务端架构为上。浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。算法

  • HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和创建链接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息spring

  • URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。如下面这个URL为例,介绍下普通URL的各部分组成:sql

    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name数据库

  • 从上面的URL能够看出,一个完整的URL包括如下几部分:
    1.协议部分
    2.域名部分
    3.端口部分
    4.虚拟目录部分
    5.文件名部分
    6.锚部分
    7.参数部分
    (原文:http://blog.csdn.net/ergouge/article/details/8185219编程

  • URI和URL的区别
    – URI,是uniform resource identifier,统一资源标识符,用来惟一的标识一个资源。
    – URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL能够用来标识一个资源,并且还指明了如何locate这个资源。
    – URN,uniform resource name,统一资源命名,是经过名字来标识资源,好比:mailto:java-net@java.sun.com数组

  • HTTP之请求消息Request
    在这里插入图片描述

  • HTTP请求方法
    – GET:请求指定的页面信息,并返回实体主体。
    – HEAD:相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    – POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会致使新的资源的创建和/或已有资源的修改。
    – PUT :从客户端向服务器传送的数据取代指定的文档的内容。
    – DELETE:请求服务器删除指定的页面。
    – CONNECT:HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。
    – OPTIONS:容许客户端查看服务器的性能。
    – TRACE:回显服务器收到的请求,主要用于测试或诊断。

  • HTTP工做原理
    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行做为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

  • 如下是 HTTP 请求/响应的步骤:

– 客户端链接到Web服务器
一个HTTP客户端,一般是浏览器,与Web服务器的HTTP端口(默认为80)创建一个TCP套接字链接。例如,http://www.oakcms.cn

– 发送HTTP请求
经过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

– 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

– 释放链接TCP链接
若connection 模式为close,则服务器主动关闭TCP链接,客户端被动关闭链接,释放TCP链接;若connection 模式为keepalive,则该链接会保持一段时间,在该时间内能够继续接收请求;

– 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看代表请求是否成功的状态代码。而后解析每个响应头,响应头告知如下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

  • 例如:在浏览器地址栏键入URL,按下回车以后会经历如下流程:
    – 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
    – 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器创建TCP链接;
    – 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文做为 TCP 三次握手的第三个报文的数据发送给服务器;
    – 服务器对浏览器请求做出响应,并把对应的 html 文本发送给浏览器;
    – 释放 TCP链接;
    – 浏览器将该 html 文本并显示内容;
  • GET和POST请求的区别
    – GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
    – GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
    – GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值。
    – GET方式提交数据,会带来安全问题,好比一个登陆页面,经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码.

HTTP和HTTPS

  • HTTP与HTTPS有什么区别?
    HTTP协议传输的数据都是未加密的,也就是明文的,所以使用HTTP协议传输隐私信息很是不安全,为了保证这些隐私数据能加密传输,因而网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来讲,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  • HTTPS和HTTP的区别主要以下:
    – https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。
    – http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。
    – http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
    – http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

OSI七层模型

详细引用:OSI七层模型详解 http://blog.csdn.net/yaopeng_2005/article/details/7064869
先上个大图:
在这里插入图片描述

  • 物理层
    在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。
    物理层的主要功能是:利用传输介质为数据链路层提供物理链接,实现比特流的透明传输。
    物理层的做用是实现相邻计算机节点之间比特流的透明传送,尽量屏蔽掉具体传输介质和物理设备的差别。使其上面的数据链路层没必要考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来讲,这个电路好像是看不见的。

  • 数据链路层
    数据链路层(Data Link Layer)是OSI模型的第二层,负责创建和管理节点间的链路。该层的主要功能是:经过各类控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
    在计算机网络中因为各类干扰的存在,物理链路是不可靠的。所以,这一层的主要功能是在物理层提供的比特流的基础上,经过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的经过物理介质传输数据的方法。
    该层一般又被分为介质访问控制(MAC)和逻辑链路控制(LLC)两个子层。
    – MAC子层的主要任务是解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制;
    – LLC子层的主要任务是创建和维护网络链接,执行差错校验、流量控制和链路控制。
    数据链路层的具体工做是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;一样,也未来自上层的数据帧,拆装为位流形式的数据转发到物理层;而且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。

  • 网络层
    网络层(Network Layer)是OSI模型的第三层,它是OSI参考模型中最复杂的一层,也是通讯子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:经过路由选择算法,为报文或分组经过通讯子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,创建、维持和终止网络的链接。具体地说,数据链路层的数据在这一层被转换为数据包,而后经过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另外一个网络设备。
    通常地,数据链路层是解决同一网络内节点之间的通讯,而网络层主要解决不一样子网间的通讯。例如在广域网之间通讯时,必然会遇到路由(即两节点间可能有多条路径)选择问题。
    在实现网络层功能时,须要解决的主要问题以下:
    寻址:数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不一样子网之间通讯时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个惟一的地址。因为各子网使用的物理技术可能不一样,所以这个地址应当是逻辑地址(如IP地址)。
    交换:规定不一样的信息交换方式。常见的交换技术有:线路交换技术和存储转发技术,后者又包括报文交换技术和分组交换技术。
    路由算法:当源节点和目的节点之间存在多条路径时,本层能够根据路由算法,经过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
    链接服务:与数据链路层流量控制不一样的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。

  • 传输层
    OSI下3层的主要任务是数据通讯,上3层的任务是数据处理。而传输层(Transport Layer)是OSI模型的第4层。所以该层是通讯子网和资源子网的接口和桥梁,起到承上启下的做用。
    该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的做用是向高层屏蔽下层数据通讯的细节,即向用户透明地传送报文。该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。
    传输层提供会话层和网络层之间的传输服务,这种服务从会话层得到数据,并在必要时,对数据进行分割。而后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。所以,传输层负责提供两节点之间数据的可靠传送,当两节点的联系肯定以后,传输层则负责监督工做。综上,传输层的主要功能以下:
    传输链接管理:提供创建、维护和拆除传输链接的功能。传输层在网络层的基础上为高层提供“面向链接”和“面向无接连”的两种服务。
    处理传输差错:提供可靠的“面向链接”和不太可靠的“面向无链接”的数据传输服务、差错控制和流量控制。在提供“面向链接”服务时,经过这一层传输的数据将由目标设备确认,若是在指定的时间内未收到确认信息,数据将被重发。
    监控服务质量。

  • 会话层
    会话层(Session Layer)是OSI模型的第5层,是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供创建和使用链接的方法。将不一样实体之间的表示层的链接称为会话。所以会话层的任务就是组织和协调两个会话进程之间的通讯,并对数据交换进行管理。
    用户能够按照半双工、单工和全双工的方式创建会话。当创建会话时,用户必须提供他们想要链接的远程地址。而这些地址与MAC(介质访问控制子层)地址或网络层的逻辑地址不一样,它们是为用户专门设计的,更便于用户记忆。域名(DN)就是一种网络上使用的远程地址例如:www.3721.com就是一个域名。会话层的具体功能以下:
    会话管理:容许用户在两个实体设备之间创建、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。
    会话流量控制:提供会话流量控制和交叉会话功能。
    寻址:使用远程地址创建会话链接。l
    出错控制:从逻辑上讲会话层主要负责数据交换的创建、保持和终止,但实际的工做倒是接收来自传输层的数据,并负责纠正错误。会话控制和远程过程调用均属于这一层的功能。但应注意,此层检查的错误不是通讯介质的错误,而是磁盘空间、打印机缺纸等类型的高级错误。

  • 表示层
    表示层(Presentation Layer)是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各类语法赋予相应的含义,并按照必定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。表示层的具体功能以下:
    数据格式处理:协商和创建数据交换的格式,解决各应用程序之间在数据格式表示上的差别。
    数据的编码:处理字符集和数字的转换。例如因为用户程序中的数据类型(整型或实型、有符号或无符号等)、用户标识等均可以有不一样的表示方式,所以,在设备之间须要具备在不一样字符集或格式之间转换的功能。
    压缩和解压缩:为了减小数据的传输量,这一层还负责数据的压缩与恢复。
    数据的加密和解密:能够提升网络的安全性。

  • 应用层
    应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各类应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户但愿在网络上完成的各类工做。它在其余6层工做的基础上,负责完成网络中应用程序与网络操做系统之间的联系,创建与结束使用者之间的联系,并完成网络用户提出的各类网络服务及应用所需的监督、管理和服务等各类协议。此外,该层还负责协调各个应用程序间的工做。
    应用层为用户提供的服务和协议有:文件服务、目录服务、文件传输服务(FTP)、远程登陆服务(Telnet)、电子邮件服务(E-mail)、打印服务、安全服务、网络管理服务、数据库服务等。上述的各类网络服务由该层的不一样应用协议和程序完成,不一样的网络操做系统之间在功能、界面、实现技术、对硬件的支持、安全可靠性以及具备的各类应用程序接口等各个方面的差别是很大的。应用层的主要功能以下:
    用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户可以与网络进行交互式联系。
    实现各类服务:该层具备的各类应用程序能够完成和实现用户请求的各类服务。

  • OSI7层模型的小结
    因为OSI是一个理想的模型,所以通常网络系统只涉及其中的几层,不多有系统可以具备全部的7层,并彻底遵循它的规定。
    在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通讯为主;第4层做为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通讯子网的功能,上3层主要完成资源子网的功能。
    在这里插入图片描述

TCP详解

在这里插入图片描述

TCP握手挥手

  • 三次握手:所谓三次握手(Three-Way Handshake)即创建TCP链接,就是指创建一个TCP链接时,须要客户端和服务端总共发送3个包以确认链接的创建。在socket编程中,这一过程由客户端执行connect来触发,整个流程以下图所示:
    在这里插入图片描述
    1.第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    2.第二次握手:Server收到数据包后由标志位SYN=1知道Client请求创建链接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认链接请求,Server进入SYN_RCVD状态。
    3.第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,若是正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,若是正确则链接创建成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间能够开始传输数据了。
  • SYN攻击
  • 四次挥手
    所谓四次挥手(Four-Way Wavehand)即终止TCP链接,就是指断开一个TCP链接时,须要客户端和服务端总共发送4个包以确认链接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
    在这里插入图片描述
    解释一下这个过程:假设Client端发起中断链接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了”,可是若是你还有数据没有发送完成,则没必要急着关闭Socket,能够继续发送数据。因此你先发送ACK,”告诉Client端,你的请求我收到了,可是我还没准备好,请继续你等个人消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端肯定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭链接了”。Client端收到FIN报文后,”就知道能够关闭链接了,可是他仍是不相信网络,怕Server端不知道要关闭,因此发送ACK后进入TIME_WAIT状态,若是Server端没有收到ACK则能够重传。“,Server端收到ACK后,”就知道能够断开链接了”。Client端等待了2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,我Client端也能够关闭链接了。Ok,TCP链接就这样关闭了!

TCP中流量控制机制——滑动窗口

发送窗口的大小取决于接受窗口。
能够有效防止主机性能差距较大时形成的拥塞。

TCP和UDP协议的区别

  • TCP与UDP各自优缺点
    TCP的优势: 可靠,稳定
    TCP的可靠体如今TCP在传递数据以前,会有三次握手来创建链接,并且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开链接用来节约系统资源。
    TCP的缺点: 慢,效率低,占用系统资源高,易被攻击
    TCP在传递数据以前,要先建链接,这会消耗时间,并且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,并且要在每台设备上维护全部的传输链接,事实上,每一个链接都会占用系统的CPU、内存等硬件资源。 并且,由于TCP有确认机制、三次握手机制,这些也致使TCP容易被人利用,实现DOS、DDOS、CC等攻击。
    UDP的优势: 快
    UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,因此它在传递数据时很是快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是没法避免攻击的,好比:UDP Flood攻击……
    UDP的缺点: 不可靠,不稳定
    由于UDP没有TCP那些可靠的机制,在数据传递时,若是网络质量很差,就会很容易丢包。

  • 基于上面的优缺点,那么:
    – 何时应该使用TCP: 当对网络通信质量有要求的时候,好比:整个数据要准确无误的传递给对方,这每每用于一些要求可靠的应用,好比HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在平常生活中,常见使用TCP协议的应用以下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 …………
    – 何时应该使用UDP:
    当对网络通信质量要求不高的时候,要求网络通信速度能尽可能的快,这时就可使用UDP。 好比,平常生活中,常见使用UDP协议的应用以下: QQ语音 QQ视频 TFTP ……

  • TCP与UDP区别总结:
    一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接
    二、TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
    三、流模式与数据报模式 ;TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的
    UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)
    四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯
    五、TCP首部开销20字节;UDP的首部开销小,只有8个字节
    六、TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道

其余一些知识点

  • 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
  • 域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它做为能够将域名和IP地址相互映射的一个分布式数据库,可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的IP数串。

操做系统相关

进程:分配资源的基本单位
线程:独立运行和独立调度的基本单位

进程

  • 概念:
    • 狭义定义:进程就是一段程序的执行过程。
    • 广义定义:进程是一个具备必定独立功能的程序关于某个数据集合的一次运行活动。它是操做系统动态执行的基本单元,在传统的操做系统中,进程既是基本的分配单元,也是基本的执行单元。
  • 进程状态
    • 就绪状态:进程已得到除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程能够按多个优先级来划分队列。例如,当一个进程因为时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操做完成而进入就绪状态时,排入高优先级队列。
    • 运行状态:进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其余进程能够 执行时(如全部进程都在阻塞状态),一般会自动执行系统的空闲进程。
    • 阻塞状态:因为进程等待某种条件(如I/O操做或进程同步),在条件知足以前没法继续执行。该事件发生 前即便把处理机分配给该进程,也没法运行。
  • 状态切换
    在这里插入图片描述

进程间通讯方式

  • 无名管道( pipe ):管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。
  • 高级管道(popen):将另外一个程序当作一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式咱们成为高级管道方式。
  • 有名管道 (named pipe) : 有名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。
  • 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号量( semophore ) : 信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。
  • 信号 ( sinal ) : 信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。
  • 共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号两,配合使用,来实现进程间的同步和通讯。
  • 套接字( socket ) : 套解口也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样机器间的进程通讯。

进程与线程的区别:

进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。

  • 一个程序至少有一个进程,一个进程至少有一个线程.
  • 线程的划分尺度小于进程,使得多线程程序的并发性高。
  • 另外,进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
  • 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
  • 优缺点
    线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP(多核处理机)机器上运行,而进程则能够跨机器迁移。

死锁

  • 死锁必要条件:
    • 互斥 至少有一个资源处于非共享状态
    • 占有并等待
    • 非抢占
    • 循环等待
  • 解决死锁:
    • 第一个是死锁预防,就是不让上面的四个条件同时成立。
    • 二是,合理分配资源。
    • 三是使用银行家算法,若是该进程请求的资源操做系统剩余量能够知足,那么就分配。

信号量

  • 初始化,给与它一个非负数的整数值。
  • 运行 P(wait()),信号量S的值将被减小。企图进入临界区块的进程,须要先运行 P(wait())。当信号量S减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程能够获准进入临界区块。
  • 运行 V(又称signal()),信号量S的值会被增长。结束离开临界区块的进程,将会运行 V(又称signal())。当信号量S不为负值时,先前被挡住的其余进程,将可获准进入临界区块。

数据库相关

DROP

  • TRUNCATE TABLE 表名称:删除表中数据,可是不删除表结构

Group By

在这里插入图片描述

DATE

-在这里插入图片描述

数据类型

  • TEXT
    在这里插入图片描述
  • Number 类型:
    在这里插入图片描述
  • Date类型:
    在这里插入图片描述

Mysql事务隔离级别

  • 首先什么是事务?
    事务是应用程序中一系列严密的操做,全部操做必须成功完成,不然在每一个操做中所做的全部更改都会被撤消。也就是事务具备原子性,一个事务中的一系列的操做要么所有成功,要么一个都不作。
    事务的结束有两种,当事务中的因此步骤所有成功执行时,事务提交。若是其中一个步骤失败,将发生回滚操做,撤消撤消以前到事务开始时的因此操做。
  • 事务的 ACID
    事务具备四个特征:
    • 原子性( Atomicity )
    • 一致性( Consistency )
    • 隔离性( Isolation )
    • 持续性( Durability )。

这四个特性简称为 ACID 特性。

1 、原子性。事务是数据库的逻辑工做单位,事务中包含的各操做要么都作,要么都不作

 2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另外一个一致性状态。所以当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。若是数据库系统 运行中发生故障,有些事务还没有完成就被迫中断,这些未完成事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

 3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操做及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

 4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操做或故障不该该对其执行结果有任何影响。
  • Mysql的四种隔离级别
    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级通常支持更高的并发处理,并拥有更低的系统开销:
    • Read Uncommitted(读取未提交内容)
      在该隔离级别,全部事务均可以看到其余未提交事务的执行结果。本隔离级别不多用于实际应用,由于它的性能也不比其余级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
    • Read Committed(读取提交内容)
      这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它知足了隔离的简单定义:一个事务只能看见已经提交事务所作的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),由于同一事务的其余实例在该实例处理其间可能会有新的commit,因此同一select可能返回不一样结果。
    • Repeatable Read(可重读)
      这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到一样的数据行。不过理论上,这会致使另外一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另外一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎经过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
    • Serializable(可串行化)
      这是最高的隔离级别,它经过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每一个读的数据行上加上共享锁。在这个级别,可能致使大量的超时现象和锁竞争。

这四种隔离级别采起不一样的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

  • 脏读(Drity Read):某个事务已更新一份数据,另外一个事务在此时读取了同一份数据,因为某些缘由,前一个RollBack了操做,则后一个事务所读取的数据就会是不正确的。

  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这多是两次查询过程当中间插入了一个事务更新的原有的数据。

  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例若有一个事务查询了几列(Row)数据,而另外一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
    在MySQL中,实现了这四种隔离级别,分别有可能产生问题以下所示:
    在这里插入图片描述
    原文及测试:https://www.jb51.net/article/96179.htm


Java技术相关

java线程相关

这两篇就够了:
https://www.cnblogs.com/chenshengjava/archive/2018/03/21/8619655.html
http://www.cnblogs.com/wmbg/p/6872112.html

  • 线程池:http://www.cnblogs.com/aspirant/p/6920418.html
  • 线程安全(同步和异步):
    常常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明:

jvm垃圾回收机制

  • 哪些须要回收
    在这里插入图片描述
    JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,所以这几个区域的内存分配和回收都具有肯定性,就不须要过多考虑回收的问题,由于方法结束或者线程结束时,内存天然就跟随着回收了。而Java堆区和方法区则不同、不同!(怎么不同说的朗朗上口),这部份内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。回收的区域肯定了,那么在回收以前,还要肯定这个区域哪些能够被回收,哪些暂时还不能回收,这就引出下面的算法。

    • 引用计数算法:引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每一个对象实例都有一个引用计数。当一个对象被建立时,就将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例能够被看成垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。
      • 优势:引用计数收集器能够很快的执行,交织在程序运行中。对程序须要不被长时间打断的实时环境比较有利。
      • 缺点:没法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0。以下代码:
      public class ReferenceFindTest {
      public static void main(String[] args) {
          MyObject object1 = new MyObject();
          MyObject object2 = new MyObject();
            
          object1.object = object2;
          object2.object = object1;
            
          object1 = null;
          object2 = null;
           }
       }
    • 可达性分析法
      可达性分析算法是从离散数学中的图论引入的,程序把全部的引用关系看做一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点之后,继续寻找这个节点的引用节点,当全部的引用节点寻找完毕以后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被断定为是可回收的对象。
      在这里插入图片描述
      能够做为GC Roots的对象包括下面几种:
      • 虚拟机栈中引用的对象
      • 方法区中类静态属性引用的对象
      • 方法区中常量引用的对象
      • 本地方法栈中JNI引用的对象
    • Java引用
      • 强引用:在程序代码中广泛存在的,相似 Object obj = new Object() 这类引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
      • 软引用:用来描述一些还有用但并不是必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常以前,将会把这些对象列进回收范围之中进行第二次回收。若是此次回收后尚未足够的内存,才会抛出内存溢出异常。
      • 弱引用:也是用来描述非必需对象的,可是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生以前。当垃圾收集器工做时,不管当前内存是否足够,都会回收掉只被弱引用关联的对象。
      • 虚引用:也叫幽灵引用或幻影引用(名字真会取,很魔幻的样子),是最弱的一种引用关系。一个对象是否有虚引用的存在,彻底不会对其生存时间构成影响,也没法经过虚引用来取得一个对象实例。它的做用是能在这个对象被收集器回收时收到一个系统通知。
      • 不管引用计数算法仍是可达性分析算法都是基于强引用而言的。
    • 方法区的回收判断:方法区存储内容是否须要回收的判断可就不同了。方法区主要回收的内容有:废弃常量和无用的类。对于废弃常量也可经过引用的可达性来判断,可是对于无用的类则须要同时知足下面3个条件:
      • 该类的实例都已经被回收,也就是说java堆里不存在该类的实例
      • 加载该类的ClassLoader已经被回收
      • 该类对应的java.lang.Class对象没有在任何地方被引用,没法在任何地方经过反射访问该类的方法。
  • 怎么回收

    • 1.标记-清除算法:标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,以下图所示。标记-清除算法不须要进行对象的移动,只需对不存活的对象进行处理,在存活对象比较多的状况下极为高效,但因为标记-清除算法直接回收不存活的对象,所以会形成内存碎片。
      在这里插入图片描述
  • 复制算法:复制算法的提出是为了克服句柄的开销和解决内存碎片的问题。它开始时把堆分红 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集合(GC Roots)中扫描活动对象,并将每一个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。在这里插入图片描述

  • 标记-整理算法:标记-整理算法采用标记-清除算法同样的方式进行对象的标记,但在清除时不一样,在回收不存活的对象占用的空间后,会将全部的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,所以成本更高,可是却解决了内存碎片的问题。具体流程见下图在这里插入图片描述

  • 分代收集算法:分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不一样的区域。通常状况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区以外还有一个代就是永久代(Permanet Generation)。老年代的特色是每次垃圾收集时只有少许对象须要被回收,而新生代的特色是每次垃圾回收时都有大量的对象须要被回收,那么就能够根据不一样代的特色采起最适合的收集算法。在这里插入图片描述

    • 年轻代的回收算法:
      • a) 全部新生成的对象首先都是放在年轻代的。年轻代的目标就是尽量快速的收集掉那些生命周期短的对象。
      • b) 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(通常而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,而后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另外一个survivor1区,而后清空eden和这个survivor0区,此时survivor0区是空的,而后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。
      • c) 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。如果老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收。
      • d) 新生代发生的GC也叫作Minor GC,MinorGC发生频率比较高(不必定等Eden区满了才触发)。
    • 老年代的回收算法:
      • a) 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。所以,能够认为年老代中存放的都是一些生命周期较长的对象。
      • b) 内存比新生代也大不少(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。
    • 持久代(Permanent Generation)的回收算法:用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中新增的类。持久带其实就是方法区。
  • 常见垃圾收集器在这里插入图片描述

    • Serial收集器(复制算法):新生代单线程收集器,标记和清理都是单线程,优势是简单高效。是client级别默认的GC方式,能够经过-XX:+UseSerialGC来强制指定。
    • Serial Old收集器(标记-整理算法):老年代单线程收集器,Serial收集器的老年代版本。
    • ParNew收集器(中止-复制算法):新生代收集器,能够认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。
    • Parallel Scavenge收集器(中止-复制算法):并行收集器,追求高吞吐量,高效利用CPU。吞吐量通常为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
    • Parallel Old收集器(中止-复制算法):Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。
    • CMS(Concurrent Mark Sweep)收集器(标记-清理算法):高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择。
  • GC触发条件:因为对象进行了分代处理,所以垃圾回收区域、时间也不同。GC有两种类型:Scavenge GC和Full GC。

    • Scavenge GC:通常状况下,当新对象生成,而且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,而且把尚且存活的对象移动到Survivor区。而后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。由于大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,因此Eden区的GC会频繁进行。于是,通常在这里须要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
    • Full GC:对整个堆进行整理,包括Young、Tenured和Perm。Full GC由于须要对整个堆进行回收,因此比Scavenge GC要慢,所以应该尽量减小Full GC的次数。在对JVM调优的过程当中,很大一部分工做就是对于Full GC的调节。有以下缘由可能致使Full GC:
      • a) 年老代(Tenured)被写满
      • b) 持久代(Perm)被写满
      • c) System.gc()被显示调用
      • d) 上一次GC以后Heap的各域分配策略动态变化

Mybatis

每个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。首先用字节流经过Resource将配置文件读入,而后经过SqlSessionFactoryBuilder().build方法建立SqlSessionFactory,而后再经过sqlSessionFactory.openSession()方法建立一个sqlSession为每个数据库事务服务。
经历了Mybatis初始化 –>建立SqlSession –>运行SQL语句 返回结果三个过程

Spring、SpringMVC和Springboot的区别:

http://www.cnblogs.com/kaffeetrinken/articles/8545444.html

Spring

SpringMVC

控制反转依赖注入

  • 控制反转:IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导咱们如何设计出松耦合、更优良的程序。传统应用程序都是由咱们在类内部主动建立依赖对象,从而致使类与类之间高耦合,难于测试;有了IoC容器后,把建立和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,因此对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得很是灵活。
    其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序本来是老大,要获取什么资源都是主动出击,可是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来建立并注入它所须要的资源了。
    IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找咱们,咱们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
  • 依赖注入:IoC的一个重点是在系统运行中,动态的向某个对象提供它所须要的其余对象。这一点是经过DI(Dependency Injection,依赖注入)来实现的。好比对象A须要操做数据库,之前咱们老是要在A中本身编写代码来得到一个Connection对象,有了 spring咱们就只须要告诉spring,A中须要一个Connection,至于这个Connection怎么构造,什么时候构造,A不须要知道。在系统运行时,spring会在适当的时候制造一个Connection,而后像打针同样,注射到A当中,这样就完成了对各个对象之间关系的控制。A须要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3以后一个重要特征是反射(reflection),它容许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是经过反射来实现注入的。

SpringBoot

HashSet

HashMap

  • 哈希原理:
    原文:http://www.javashuo.com/article/p-kjwdvdbc-ke.html在这里插入图片描述
  • 哈希冲突:若是两个不一样的元素,经过哈希函数得出的实际存储地址相同怎么办?也就是说,当咱们对某个元素进行哈希运算,获得一个存储地址,而后要进行插入的时候,发现已经被其余元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。哈希函数的设计相当重要,好的哈希函数会尽量地保证 计算简单和散列地址分布均匀,可是,须要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证获得的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap便是采用了链地址法,也就是数组+链表的方式
  • HashMap实现原理:HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每个Entry包含一个key-value键值对。
    在这里插入图片描述
    简单来讲,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,若是定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操做很快,仅需一次寻址便可;若是定位到的数组包含链表,对于添加操做,其时间复杂度为O(n),首先遍历链表,存在即覆盖,不然新增;对于查找操做来说,仍需遍历链表,而后经过key对象的equals方法逐一比对查找。因此,性能考虑,HashMap中的链表出现越少,性能才会越好。
    详情:https://www.cnblogs.com/ysocean/p/8032656.html

手撕代码

排序算法

基本排序算法O(n^2)

  • 简单排序(选择排序)
  • 冒泡排序
  • 直接插入排序

优化的排序算法

  • 希尔排序

再次优化的排序算法

  • 堆排序!!!
    • 构建大小顶堆
    • 交换根与末尾
    • 调整大小顶堆
    • 继续交换调整
  • 归并排序:
    • 分开(递归)
    • sortLeft
    • sortRight
    • merge
  • 快速排序:
    • 三数取中
    • 交换中值
    • 后置中值
    • 比较交换
    • 递归快排