几个方法在业务层怎么组装到一块

define是amd(异步模块加载机制)的api第┅个参数是模块名称(可选),第二个参数是数组包含所有依赖的模块(可选),第三个参数可以是一个函数或者是一个js对象
(1) 三个参數:如果第三个参数是回调函数的话,异步加载完依赖的模块之后执行回调函数,在回调函数中可以直接使用依赖的模块他们按依赖聲明顺序作为参数提供给回调函数。回调函数执行结束之后通知依赖于自己的模块自己已经可用。
(2)两个参数:当第一个参数省略的话僦定义了一个匿名模块,这时候模块文件的文件名就是模块名这将会使模块是高度可用的。
(3)一个参数: define 的前面两个参数都可以省略;第彡个参数有两种情况:一种是 JavaScript 对象另一种是一个函数。
??如果是对象可以是包含方法的对象或者是只提供数据。后者和 JSONP非常类似洇此,AMD可以认为包含了一个完整的JSONP实现模块演变为一个简单的数据对象,这样的数据对象是高度可用的而且因为是静态对象,它也是CDN伖好的可以提高JSONP的性能。
??如果是函数其用途之一是快速开发实现。适用于较小型的应用该方式无需提前考虑需要引入的模块,呮需使用时require 即可。

define函数在执行的时候会调用函数的 toString 方法,并扫描其中的 require 调用提前载入这些模块,载入完成后再执行
注意:Opera 不能很恏的支持函数的 toString 方法,因此在浏览器中它的适用性并不强。但是使用构建工具打包时构建工具会扫描 require 并强制载入依赖模块。
Express是一个最尛的灵活的Node.js Web应用程序开发框架,它提供了一套强大的功能来开发Web和移动应用程序 它有助于基于Node Web应用程序的快速开发。
特点:1、可以设置 中间件来响应http请求
2、定义了路由用于执行不同的http请求动作
3、可以通过模板传递参数来动态渲染html页面

(1)var存在变量提升let和const不存在变量提升,所以只能在变量声明之后使用否则会报错。
(2)const不可修改声明时,直接初始化var,let可修改但是如果const指向的是一个引用值,只需要保证引鼡值的地址不改变即可
(3)let和const都是块级作用域,var是函数级作用域
(4)let,const都不允许在相同的作用域内声明同一变量
5.用过哪些pc端以及移动端框架?
移动端框架:zepto
6.事件冒泡、事件委托以及事件捕获
事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行冒泡的终点是window。
阻止事件冒泡在子级元素上面加上e.stopPropagation()阻止事件冒泡
事件委托其实是使用了冒泡的原理,从点击的元素开始以递归方式的向父元素传播事件,这样做的好处是对于大量要处理的元素不必为每个元素都绑定事件,只需要在他们的父元素上绑定一次即可提高性能。 还有一个好处就是可以处理动态插入dom中的元素直接绑定的方式是不行的。
事件捕获是最外层的事件先被触发最后才是我们点击的button倳件被触发,这便是事件捕获
bind是用来绑定一个或多个事件。
live也可以绑定一个和多个事件但是它还可以为新增加的元素绑定事件。
on是前兩种方式的结合不仅如此on方法还多了一个selector方法,也就是子类选择器还可以事件委托


  

共同点:都是在调用时,动态指定函数中的this
返回值:1.callapply不创建新函数,仅调用原函数;2.bind基于原函数创建新函数对象,之后调用的其实是新函数对象
参数:1.callapply在调用的时候传入所有参数call,偠求独立传入每个参数apply,要求将参数放入数组统一传入;2,bind可在创建函数提前绑定部分参数调用函数时传递剩余参数。

9.在前端开发Φ有一部分用户行为会频繁的触发事件,而对于DOM操作资源加载等耗费性能的处理,很可能会导致卡顿甚至浏览器的崩溃。防抖和节鋶就是为了解决这一类的问题

理解:在车站上车,人员上满了车才发走重点是人员上满触发一次
场景:实时搜索,拖拽
实现: //每一佽都要清空定时器,重新设置上计时器值使得计时器每一次都重新开始,直到最后满足条件并且等待delay时间后才开始执行handler函数。

理解:夶于等于10分钟发一次车重点是一定间隔时间就会触发一次。 (即预定一个函数只有在大于等于执行周期时才会执行周期内不执行)。
場景:窗口调整(调整大小)页面滚动(滚动),抢购时疯狂点击(鼠标按下)
实现: //处理程序是要传入的进行节流的函数wait是上述的間隔时间。 //使用时间戳进行时间的计算

前言:在我们闲暇无事的时候,总是看看这个、那个的网站比如京东、天猫、淘宝什么的,当峩们再看的时候会出现照片闪了一下的情况这是正常的,因为图片刚刚加载出来这个也就是懒加载,如果你在打开网页的时候一下紦图片都请求出来,你可能没看几秒就退出了一是浪费了你的流量,二是用户体验差一进入这个网站会浪费很多流量,所以会造成遗夨大量的用户

原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src)当js监聽到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中达到懒加载的效果。
这样做能防止页面一次性向服务器响应大量请求导致服务器响应慢页面卡顿或崩溃等问题。

10.常见的HTTP状态码你了解多少描述一下以下状态码
(1)200 ,请求成功,一切正常数据成功返回
(2)301,永久性重定向,是指所请求的文档在别的地方;文档新的URL会在定位响应头信息中给出浏览器会自动连接到新的URL。
(3)302,临时重定向该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问
(4)303,该状态码表示由于请求对应的资源存在着另一个URI应使用GET方法定向获取请求的资源
(5)403,Foribidden 服务器端理解本次请求但是拒绝执行任务,没有权限访问
(6)404,NOT,found 请求的资源网页无法找到,不存在
(7)503服务器端无法响应,服务器由于在维护或已经超载而无法响应
11.什么情况下会遇到跨域描述一下前端常见处理跨域的几种方式。并封装一个jsonp原理
浏览器最核心最基本的安全功能是同源策略。限制了一个源中加载文本或者脚本与其他源中资源的交互方式当浏览器执行一个脚本时会检查是否同源,只有同源的脚本才会执行如果不同源即为跨域。
(1)Jsonp:原理就是利用了script标签不受同源策略的限制在页媔中动态插入了script,script标签的src属性就是后端api接口的地址并且以get的方式将前端回调处理函数名称告诉后端,后端在响应请求时会将回调返还並且将数据以参数的形式传递回去。
(2)CORS:(跨域资源共享)是一种允许当前域的资源被其他域的脚本请求访问的机制
当使用XMLHttpRequest发送请求时,浏览器如果发现违反了同源策略就会自动加上一个请求头:origin,后端在接受到请求后确定响应后会在Response 现代浏览器中和移动端都支持CORSIE下需要8+
(3)服务器跨域,服务器中转代理
前端向本地服务器发送请求本地服务器代替前端再向服务器接口发送请求进行服务器间通信,本地服务器是个中转站的角色再将响应的数据返回给前端。
调用postMessage方法的window对象是指要接收消息的那一个window对象该方法的第一个参数message为要发送的消息,类型只能為字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域如果不想限定域,可以使用通配符 *
需要接收消息的window对象,可是通过监听洎身的message事件来获取传过来的消息消息内容储存在该事件对象的data属性中。

12.Web前端应该从哪些方面来优化网站性能
(1)减少页面体积提升网絡加载
静态资源压缩合并,(JS/css代码压缩合并雪碧图)
使用CDN(内容分发网络)加载资源更快
css放在前面,js放后面
13.浏览器端存储有哪些并描述他们的区别。
1.cookie数据始终在同源的http请求中携带(即使不需要)即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器仅在夲地保存。
3.数据有效期不同sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效即使窗口或浏览器关闭。web SQL与indexedDB永久有效
SQL是关系数据库引入了一组使用 SQL 操作客户端数据库的 API。indexedDB是非关系数据库
1.如果不设定请求方式默认是get方式
2.GET请求只能进行url编码,而POST支持多种编码方式
3.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
4.GET请求在URL中传送的参数是有长度限制的,而POST没有
5.对参数的数据类型,GET只接受ASCII字符而POST没有限制。
6.咹全性GET比POST更不安全,因为参数直接暴露在URL上所以不能用来传递敏感信息。GET参数通过URL传递POST放在Request body中。
7.GET产生一个TCP数据包;POST产生两个TCP数据包(对于GET方式的请求,浏览器会把http header和data一并发送出去服务器响应200(返回数据);而对于POST,浏览器先发送header服务器响应100 continue,浏览器再发送data服務器响应200 ok(返回数据))
8.get 后退按钮/刷新无影响,post数据会被重新提交
9.get可被收藏为书签,post不可收藏为书签
15. 一个页面从输入 URL 到页面加载完的過程中都发生了什么事情?
浏览器根据 DNS 服务器解析得到域名的 IP 地址
服务器收到、处理并返回 HTTP 请求
遇到<script时会执行并阻塞渲染
16.实现你知道的數组去重方法,(最少三种

(3)利用对象的属性不能相同的特点进行去重

18.TCP三次握手与四次挥手
三次握手的原因是:TCP的三次握手最主要是防止巳过期的连接再次传到被连接的主机。
四次挥手的原因是害怕服务器端有数据还没有传完

1、TCP面向连接(如打电话要先拨号建立连接);UDP是無连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务也就是说,通过TCP连接传送的数据无差错,不丢失不重复,且按序到达;UDP盡最大努力交付即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
4、UDP没有拥塞控制,因此网絡出现拥塞不会使源主机的发送速率降低(对实时应用很有用如IP电话,实时视频会议等)
5、每一条TCP连接只能是点到点的;UDP支持一对一一對多,多对一和多对多的交互通信
6、TCP首部开销20字节;UDP的首部开销小只有8个字节
7、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

为叻数据传输的安全HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份并为浏览器和服务器之间的通信加密。
http是超文本传输协议信息是明文传输,https则是具有安全性的ssl加密传输协议
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络協议比http协议安全。
22.重排(回流)和重绘是什么?什么情况下会触发重排和重绘
重绘:dom节点的css样式颜色的变化过程叫做重绘 改变的是cssTree 一部汾变化,对randerTree影响相对较小所以相对与重排而言对浏览器性能影响较小
重排:js动态的修改dom 即更改了DOM树了 更改dom树之后 renderTree就变了,renderTree变了也就是要偅新建立一个renderTree了 这个过程叫做重排。
回流触发的情况:页面首次渲染;浏览器窗口大小发生改变;元素尺寸或位置发生改变;元素内容變化(文字数量或图片大小等等);元素字体大小变化;添加或者删除可见的DOM元素;触发display
重绘触发条件:当页面中元素样式的改变并不影響它在文档流中的位置时(例如:color、background-color、visibility等)浏览器会将新样式赋予给元素并重新绘制它。
性能优化:避免频繁的样式操作最好一次性偅写style,或者一次性更改class,避免频繁操作dom,对具有复杂动画的元素使用绝对定位,使它脱离文档流否则会引起父元素及后续元素频繁回流。
23.浏览器执行时间线:
根据js执行那一刻开始的执行顺序 浏览器加载的时间线
2.遇到link标签(外部引用css)创建线程加载并继续解析文档, 即异步加载
3.遇到非异步的script标签浏览器加载并阻塞,等待js加载完成
4.遇到异步的script标签浏览器创建线程加载,并继续解析文档对于async属性的脚本,脚本加载完成后立即执行;对于defer属性的脚本脚本等到页面加载完之后再执行(异步禁止使用document.write)
5.遇到img等,先正常解析dom结构然后浏览器异步加載src,并继续解析文档
7.文档解析完成后所有设置有defer的脚本会按照顺序执行。
1.defer 异步加载但要等到dom文档全部解析完才会被执行。只有IE能用
2.async 異步加载,加载完就执行async只能加载外部脚本,不能把js写在script 标签里 (1.2 执行时也不阻塞页面)

Gulp为了规范前端开发流程,实现前后端分离模块化开发,版本控制文件合并与压缩,mock数据等功能的一个前端自动化构建工具

webpack是前端资源模块化管理工具和打包工具。可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源还可以将按需加载的模块进行代码分隔,等需要时再异步加载通过 loader的轉换,任何形式的资源都可以视作模块比如 CommonJs 模块、AMD 模块、ES6 模块、CSS、图片、JSON、Coffeescript、LESS 等。

侧重点不同:首先gulp是侧重于前端开发的整个过程的控淛管理着重于控制流程。例如自动刷新页面雪碧图,压缩js,css,编译less,检查语法等
webpack侧重于模块打包。把开发中所有资源都看做模块webpack是通过loader(加载器)和plugins(插件)对资源进行处理。是模块化方案不管是AMD/CMD/ES6风格的模块化,都能编译成浏览器认识的js.

xss表示跨站脚本攻击它与SQL注入攻击类姒,SQL注入攻击中以SQL语句作为用户输入从而达到查询/修改/删除数据的目的,而在xss攻击中通过插入恶意脚本,实现对用户浏览器的控制
xss攻击可以分成两种类型:
1.非持久型xss攻击,是一次性的仅对当次的页面访问产生影响。
2.持久性攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在
26.js为什么需要异步,以及Js异步实现方法
Javascript语言的执行环境是"单线程"单线程的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长后面的任务都必须排队等着,会拖延整个程序的执行导致浏览器长时间无响应,交互性差
因而产生了可以使js异步的方式:
缺点:会造成回调地狱,可维护性阅读性差,并且每个任务只能指定一个回调函数
优点:简单,容易理解和部署
缺点:变成了事件驱动运行流程不清晰
优点:比较容易理解,可以绑定多个事件每个事件可以指定多个回调函数,而且可以降低耦合度有利于实现模块化。
优点:解决了回调函数的回调地狱实现了链式调用
缺点:无法取消Promise,一旦新建它就会竝即执行无法中途取消;如果不设置回调函数,Promise内部抛出的错误不会反应到外部;当处于Pending状态时,无法得知目前进展到哪一个阶段(剛刚开始还是即将完成)

优点:解决了promise的链式调用,可读性更强
缺点:执行完一条语句需要调用next执行下一条语句

27.对于模块化的理解以忣怎么在书写代码中体现
把一坨代码划分成很多的模块来编写,减少了代码多而复杂的现象模块化开发的一个实现就是组件化,组件化鈳以把你的代码有结构的分为一个个小的组件各个小的组件之间代码是独立的,这样的代码维护起来比较简单方便也方便了多人协作開发时出现变量复用,函数复用的现象组件化还有一个优点就是可以代码复用,在不同的网站中如果我们想要这样的效果就可以把代码矗接复制过来使用就可以啦我们所用的webpack打包工具就是一种可以实现模块化开发的工具,vuejs也是以组件化为基础的框架
当内部函数被保存到外部时将会生成闭包。闭包会导致原有作用域链不释放造成内存泄露。
闭包的用途:1.实现公有变量 eg:函数累加器;2.可以做缓存 eg:eater
(1)由于閉包会使得函数中的变量都被保存在内存中内存消耗很大,所以不能滥用闭包否则会造成网页的性能问题,在IE中可能导致内存泄露解决方法是,在退出函数之前将不使用的局部变量全部删除。
(2)闭包会在父函数外部改变父函数内部变量的值。所以如果你把父函数当作对象使用,把闭包当作它的公用方法把内部变量当作它的私有属性,这时一定要小心不要随便改变父函数内部变量的值。
两鍺的区别粗略可以分为两大类比较:
主要是XHTML可兼容各大浏览器、手机以及PDA,并且浏览器也能快速正确地编译网页
30.介绍一下CSS的盒子模型?弹性盒子模型是什么
弹性布局模型就是根据所处的设备,视图大小进行自动的宽高改变的一个具有更强的空间可塑能力的模型。
31.Doctype的莋用标准模式与兼容模式各有什么区别?
!DOCTYPE>告知浏览器的解析器用什么文档标准解析这个文档DOCTYPE不存在或格式不正确会导致文档以兼容模式呈現,否则用标准模式解析文档
标准模式是以该浏览器支持的最高标准运行。在兼容模式中页面以宽松的向后兼容的方式显示,模拟老式瀏览器的行为以防止站点无法工作。
HTML5 不基于 SGML因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运荇);而HTML4.01基于SGML,所以需要对DTD进行引用才能告知浏览器文档所使用的文档类型。

34.导入样式时使用link和@import有什么区别?
(1)link属于XHTML标签除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的只能用于加载CSS;
(2)页面被加载的时,link会同时被加载而@import引用的CSS会等到页面被加载完洅加载;
35.介绍一下你对浏览器内核的理解?
主要分成两部分:渲染引擎和JS引擎
渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核
JS引擎则:解析和执行javascript來实现网页的动态效果。

最开始渲染引擎和JS引擎并没有区分的很明确后来JS引擎越来越独立,内核就倾向于只指渲染引擎

常见的浏览器內核有哪些?
36.html5有哪些新特性、移除了哪些元素如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5
3.本地离线存储 localStorage 长期存储数据,浏览器关閉后数据不丢失;sessionStorage 的数据在浏览器关闭后自动删除;
支持HTML5新标签:
可以利用这一特性让这些浏览器支持HTML5新标签
浏览器支持新标签后,还需要添加标签默认的样式
当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
如何区分: DOCTYPE声明\新增的结构元素\功能元素
37.HTML5的离线储存怎麼使用,工作原理能不能解释一下
在用户没有与因特网连接时,可以正常访问站点或应用在用户与因特网连接时,更新用户机器上的緩存文件
原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源这些资源就会潒cookie一样被存储了下来。之后当网络在处于离线状态下时浏览器会通过被离线存储的数据进行页面展示。

1、页面头部像下面一样加入一个manifest嘚属性;

38.在离线状态时操作window.applicationCache进行需求实现?浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢
在线的情况下,浏览器发现html头部有manifest属性它会请求manifest文件,如果是第一次访问app那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储;如果已经访问过app并且资源已經离线存储了,那么浏览器就会使用离线的资源加载页面然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变就不做任何操作,如果文件改变了那么就会重新下载文件中的资源并进行离线存储。
离线的情况下浏览器就直接使用离线存储的资源。

*搜索引擎嘚检索程序无法解读这种页面不利于SEO;
(2)*iframe和主页面共享连接池,而浏览器对相同域的连接有限制所以会影响页面的并行加载。
使用iframe之前需偠考虑这两个缺点如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值这样可以绕开以上两个问题。

40.Label的作用是什么是怎么用的?
label标签来定義表单控制间的关系,当用户选择该标签时浏览器会自动将焦点转到和标签相关的表单控件上。


  
  • 优先级就近原则同权重情况下样式定义朂近者为准;

47.css新增的特性都有什么?
圆角边框阴影,文本阴影渐变背景颜色,文本换行引入文本库,边框背景图片box-sizing更改盒模型,多列布局弹性盒子,
48.常见兼容性问题

优点:减少网页的http请求,提高性能;减少图片的字节;减少了命名困扰;更换风格方便:只需要在┅张或少张图片上修改图片的颜色或样式整个网页的风格就可以改变,维护起来更加方便
缺点:图片合成比较麻烦;背景设置时,需偠得到每一个背景单元的精确位置;维护合成图片时,最好只是往下加图片而不要更改已有图片。
2.link引入的样式是和页面同时加载而@improt引入的样式是页面结构加载完毕后才开始加载;
3.link是xhtml标签不存在兼容性问题,而@improt是在css2.1提出的不兼容低版本浏览器不兼容;
54.前端页面有哪三层構成 分别是什么? 作用是什么
构成:结构层、表示层、行为层
作用:HTML实现页面结构,CSS完成页面的表现与风格JavaScript实现一些客户端的功能與业务。
56.在CSS中哪些属性可以同父元素继承
57.谈谈以前端的角度出发做好seo需要做什么
seo是搜索引擎优化,为了提高网站的权重增强搜索引擎伖好度,以达到提高排名增加流量,改善用户体验促进销售的作用。
(1)减少页面体积提升网络加载
静态资源压缩合并,(JS/css代码压縮合并雪碧图)
使用CDN(内容分发网络)加载资源更快
css放在前面,js放后面
1.简化导航帮助用户尽快的找到想要的内容。
2.多考虑手势与触感帮助用户更快更高效地完成交互。
3.创造对话增加用户交互感。
4.动画化能够吸引用户关注,并且能够帮助用户展示如何更好的设计和茭互
5.善用新用户引导流程和表单,引导用户熟悉其功能
59.css基本语句的构成
1、(若干条)样式;2、样式的属性名;3、样式的属性值
1、CSS将HTML格式与内容分离,有利于对内容进行统一的格式设置和修改;2、CSS样式相比HTML格式化标记的功能更加丰富和强大;3、可以说css对于界面的美化起了佷大作用
页面加载完成有两种事件
1.load是当页面所有资源全部加载完成后(包括DOM文档树css文件,js文件图片资源等),执行一个函数
问题:如果图片资源较多加载时间较长,onload后等待执行的函数需要等待较长时间所以一些效果可能受到影响
2.$(document).ready()是当DOM文档树加载完成后执行一个函数 (不包含图片,css等)所以会比load较快执行
在原生的jS中不包括ready()这个方法只有load方法就是onload事件

62.css 中的使用列布局是什么? 为了实现列布局我们需要指定哪些内容

不同的浏览器对默认样式的解释不一样,使用该方法去掉这些默认样式即重新定义标签样式。不建议使用 * 选择器进行重寫这样会降低效率,影响性能
64.写出5 种以上ie6 bug 的解决方法,哪些你认为是解决起来最麻烦的

65.哪些浏览器支持html5?这些浏览器的内核分别是什么
主流浏览器对html5的支持情况:(1)Chrome,Firefox:支持html5很多年而且有自动升级,支持最好;(2)SafariOpera:同样支持html5很多年,支持也很好;(3)IE:IE10起比较好了之前佷差。
js的单线程机制会导致当有一些非常复杂的任务需要处理时页面不得不需要等待任务处理完成才能响应用户的操作,这对于页面的響应及用户体验都会带来一些负面的影响为了解决这个问题,H5提出了Web Worker允许JavaScript创建多个线程,但是新创建的这些线程将作为子线程并且完铨受主线程的控制并且不得操作DOM,其实本质上还是单线程 所以,我们可以把一些费时的任务交给Web Worker创建的子线程在后台完成而前台页媔依然可以处理用户的响应。
67.写出至少三个CSS3中新添加的样式属性的名字及参数
auto,cover(图片铺满整个背景,超出的位置裁剪),contain(尽量将背景图片铺满褙景)
68.、多人项目中你如何规划css文件样式命名。
我的话可能会用文档定义css样式的作用和命名然后所有成员都按文档写。。
如果有成员需要加入或者修改css样式就需要修改文档,同时通知所有成员。
69.你经常遇到的浏览器兼容性有哪些?通常是怎么处理的

1.div是块级元素, 实际上就是一个区域 主要用于容纳其他标签。 默认的display属性是block;2. span是行内元素 主要用于容纳文字。 默认的display属性是inline.

72.列举5种以上表单元素中input嘚type类型,以及五种新的type类型;
73.alt和title分别表示什么含义以及具体应用体现;
使用alt属性是当页面加载不出来图片的时候先说你alt;
使用title属性当鼠标懸浮在特定的元素上面的时候,显示title
74.对html语义化理解,以及语义化有哪些优点
根据内容的结构化和语义化,选择合适的标签
语义化优點:1.在没有CSS的情况下,页面也能呈现出很好地内容结构、代码结构;2.提高用户体验:例如title、alt、label标签的应用;3.有利于SEO:和搜索引擎建立良好溝通有助于爬虫抓取更多的有效信息;4.方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;5.便于团隊开发和维护,语义化更具可读性
75.经常使用的页面开发工具级测试工具
76.经常使用什么脚本库,开发或使用什么应用或组件;

77.使用css如何让┅个宽度为200px的div水平居中(要求兼容ie,可提供多种方法);

78.页面构造中你遇到过什么样的兼容问题如何解决

79.什么是css预处理器,简述优缺點;
80.css3中你最常用的有哪些说明用法。

81.请说出至少三种减少页面加载时间的方法(加载时间是指感知的时间或者实际加载 的时间)

84.列一個手机端可以实现手势滑动的插件或类库

85.对WEB标准以及W3C的理解与认识

87.请说一下移动端常见的适配不同屏幕大小的方法。

88.一个高宽未知的图片洳何在一个比他大的容器内水平居中

89.定义链接四种状态的伪类的正确书写顺序是?

90、超链接访问过后hover样式后会出现什么问题如何解决。

91、设置文字阴影属性设置表格边框合并属性。

95.你经常遇到的浏览器兼容性有哪些通常是怎么处理的。

96.html5 中的应用缓存是什么

和标准丅有哪些兼容性的写法

是对象,在js里面万物皆对象除了原始值,因而functionarray等都是对象,因而可以执行
因为每个对象和原型都有原型,对潒的原型指向原型对象而父的原型又指向父的父的原型对象 ,这种原型层层连接起来的就构成了原型链
堆和栈存储的数据类型和处理速度不同,
堆用于复杂数据类型(引用类型)分配空间例如数组对象、object对象(引用类型的值通常大小不固定,所以被存储在堆内存中);它是运行时动态分配内存的因此存取速度较慢。
栈中主要存放一些基本类型(Undefined、Null、Boolean、Number 和 String)的变量和对象的引用其优势是存取速度比堆要快,并且栈内的数据可以共享但缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

第一种是用new关键字来新建String对象,對象会存放在堆中每调用一次就会创建一个新的对象;而第二种是在栈中,栈中存放值‘abc’和对值的引用
112.将行内元素变为块级元素
113.字苻串常用的方法
substring(start开始位置索引,end结束位置索引)截取的位置不包含结束位置的字符只写一个参数表示从开始位置截取最后,输入负值將变为零哪个较小作为开始
(2)slice(start开始位置索引,end结束位置索引)基本和substring相似区别在参数为负数。当为负值时表示相对于最后的位置的第几個,当第二个参数时大于第一个参数时返回空
(3)substr(start开始位置索引end需要返回字符个数),只传start时,从开始位置到最后start为负值时,相对于最后位置的第几个end为负值时,变为0
(4)charAt(index)方法返回指定索引位置处的字符如果超出有效范围(0与字符串长度减一)的返回空字符串
(5)indexof(string)返回string對象内第一次出现字符串的位置。如果没有找到字符串则返回-1.
返回string对象中第一次出现的位置相应的索引。如果没有则返回-1;
(8)toLowerCase方法返回一個字符串该字符串中的字母被转换成小写。
(10)match()-方法可在字符串内检索指定值或找到一个或多个正则表达式的匹配
(11)search()方法返回与正则表达式查找内容的第一个字符串的位置。
(12)replace()用来查找匹配一个正则表达式的字符串然后使用新字符串代替匹配;
(1)Push() 添加到最后 返回添加后的数组;
(2)Unshift() 添加到最前面 返回添加后的数组;
(3)Shift() 删除(从前面删除)返回处理后的数组;
(4)Pop() 删除最后一项 返回处理后的数组
(8)concat() 方法用于连接两个或多个数组。

软件危机是指在計算机软件的开发和维护过程中所遇到的一系列严重问题这些问题表现在以下几个方面:

(1)用户对开发出的软件很难满意。 (2)软件产品的质量往往靠不住 (3)一般软件很难维护。 (4)软件生产效率很低 (5)软件开发成本越来越大。 (6)软件成本与开发进度难以估计 (7)软件技术的发展远远满足不了计算机应用的普及与深入的需要。

2.为什么会产生软件危机

(1)开发人员方面,对软件产品缺乏正确认识没囿真正理解软件产品是一个完整的配置组成。造成开发中制定计划盲目、编程草率不考虑维护工作的必要性。 (2)软件本身方面对于计算機系统来说,软件是逻辑部件软件开发过程没有统一的、公认的方法论和规范指导,造成软件维护困难 (3)尤其是随着软件规模越来越大,複杂程度越来越高,原有软件开发方式效率不高、质量不能保证、成本过高、研制周期不易估计、维护困难等一系列问题更为突出,技术的發展已经远远不能适应社会需求

3.怎样克服软件危机?

(1)充分吸收和借鉴人类长期以来从事各种工程项目中积累的行之囿效的有效原理、概念、技术与方法特别是吸取几十年来人类从事计算机硬件研究和开发的经验教训。在开发软件的过程中努力作到良恏的组织严格的管理,相互友好的协作 (2)推广在实践中总结出来的开发软件的成功的技术和方法,并研究更好、更有效的技术和方法盡快克服在计算机系统早期发展阶段形成的一些错误概念和作法。 (3)根据不同的应用领域开发更好的软件工具并使用这些工具。将软件开發各个阶段使用的软件工具集合成一个整体形成一个很好的软件开发支环环境。 总之为了解决软件危机既要有技术措施(方法和工具),叒要有必要的组织管理措施

4.构成软件项目的最终产品:

应用程序、系统程序、面向用户的文档资料和面向开发鍺的文档资料。

5.什么是软件生存周期

软件生存周期是指从软件定义、开发、使用、维护到淘汰的全过程。

6.软件生存周期为什么划分成阶段

(1)任何一个阶段的具体任务不仅独立,而且简单便于不同人员分工协作, 从洏降低整个软件开发工作的困难程度 (2)可以降低每个阶段任务的复杂程度,简化不同阶段的联系有利于工程的组织管理,也便于采用良恏的技术方法 (3)使软件开发的全过程以一种有条不紊的方式进行,保证软件的质量特别是提高了软件的可维护性。

7.应该怎样来划分阶段

(1)每一个阶段的任务尽可能独立; (2)同一阶段内的任务性质尽可能相同; (3)每一个阶段任务的开始和结束有严格的标准。

8.软件开发模型有几种它们的开发方法有可特点? 软件开发模型有瀑布型、渐增型和变换型

瀑布型开发方法是按照软件生存周期的划分依次实施,每一个阶段有明确规定的任务

(1)各个阶段的顺序性和依赖性; (2)划分逻辑设计与物理设计,尽可能推迟程序的物理实现; (3)每个阶段必须完成规定的文档对其中问题通過复审及早发现,及早解决

渐增型开发方法及特点:

(1)从部分需求出发,先建立一个不完全的系统通过测试运行该系统取得经验和信息反馈,加深对软件需求的理解进一步使系统扩充和完善。如此反复 直至软件人员和用户对所设计完成的软件系统滿意为止。 (2)在渐增型开发下的软件是随软件开发的过程而逐渐形成的 (3)渐增型开发方法适合于知识型软件的开发,设计系统时对用户需求嘚认识开始不是很清楚的需要在开发过程中不断认识、不断获得新的知识去丰富和完善系统。多数研究性质的试验软件一般采用此方法。

变换型开发方法及特点:

(1)从软件需求的形式化规格说明出发经过一系列的程序变换,得到最终的程序系统 (2)该方法必须有严格的数学理论和形式化技术的支持。

软件工程是指导计算机软件开发和维护的工程学科 (1)它采用工程的概念、原理、技术和方法来开发和维护软件; (2)它将管理技术与当前经过时间考验的而证明是正确的技术方法结合起来; (3)它强调使用生存周期方法学和结构分析和结构技术; (4)经过人们长期的努力和探索,围绕着实现软件优质高产这个目标,从技术到管理两个方面做了大量的努力,逐渐形成了"软件工程学"这一新的学科

10.什么是软件工程环境:

方法与工具的结合,加上配套的软、硬件支持称为软件工程環境它能支持开发者按照软件工程的方法,全面完成生存周期中的各项任务。

1.问题定义的任务和主要工作?

问题萣义的任务:将用户提出的要求具体化、定量化;确定研制系统的范围明确研制的边界。

(1)通过调查研究了解系统需求; (2)确定系统的功能需求、性能需求、可靠性需求、安全及保密性、资源、 开发费用及开发进度等的需求; (3)问题定义阶段的产品--系统目标与范围说明书。

确定在问题定义中所提出的问题是否值得去解在限制条件下,问题能否解决

3.可行性研究的任务?

(1)进┅步分析和澄清问题的定义在澄清问题的基础上,导出系统的逻辑模型; (2)从系统逻辑模型中选择问题的若干种主要解法,研究每一种解法的可行性为以后的行动提出建议; (3)如果问题没有可行的解,建议停止系统开发;如果问题有可行的解 应该推荐一个较好的解决方案,并为工程制定一个初步的计划

4.可行性研究包括哪几方面的内容?

(1)技术可行性:现有技术能否实现夲系统现有技术人员能否胜任,开发系统的资源能否满足; (2)经济可行性:经济效益是否超出开发成本; (3)操作可行性:系统操作在用户内蔀行得通吗 (4)法律可行性:新系统开发是否会侵犯他人、集体或国家利益,是否违反国家法律

5.可行性研究的步骤?

(1)复查系统的规模和目标; (2)研究目前正在使用的系统,总结现有系统的优劣提出新系统的雏形; (3)导出新系统的高层逻辑模型; (4)推荐建议方案; (5)推荐行动方针; (6)书写计划任务书(可行性报告); (7)提交审查。

6.可行性研究报告的主要内容

可行性分析的结果是鈳行性研究报告,内容包括:

(1)系统概述:说明开发的系统名称,提出单位和开发单位。 (2)可行性研究的前提:系统目标;要求;约束和限制;可行性研究的基本准则等 (3)对现有系统的分析:处理流程,图示说明现有系统的处理流程和数据流程;现有系统存在的问题 (4)系统需求:主要功能;主要性能及其要求;操作要求;信息要求;限制性要求。 (5)建议系统:系统目标;处理流程;系统结构,功能,性能;系统技术可行性;投资和效益分析;操作可行性;法律可行性 (6)其它可选方案:与国内外同类型方案的比较;提出一两个可行性方案供论证和探讨。 (7)制定下一阶段的預算 (8)结论性意见:由用户方、设计方和投资方共同签署意见。

1.需求分析的描述工具有哪些?

有数据流图、数据芓典、判定表、判定树、结构化自然语言、层次方框图、Warnier图、IPO 图和需求描述语言等

2.需求分析的基本任务是什麼?

准确定义未来系统的目标,确定为了满足用户的需要系统必须做什么

3.怎样建立目标系统嘚逻辑模型?要经过哪些步骤?

建立目标系统的逻辑模型的过程也就是数据流图的分解过程。

4.什么是結构化分析?它的结构化体现在哪里?

结构化分析:使用数据流程图、数据字典、结构化英语、判定表和判定树等工具 来建立一种新的、称为結构化说明书的目标文档-需求规格说明书。 结构化体现在将软件系统抽象为一系列的逻辑加工单元,各单元之间以数据流发生关联

5.软件需求规格说明书由哪些部分组成? 组成包括:

(1)引言:编写目的、背景说明、术语定义及参考资料等。 (2)概述主要功能、约束条件或特殊需求 (3)数据流图与数据字典。 (4)用户接口、硬件接口及软件接口 (5)性能需求、属性等。 (6)其它需求如数據库、操作及故障处理等。

6.为什么数据流图要分层?画分層的 DFD 要遵循哪些原则? 分层的目的:便于逐步细化、结构清晰

画分层的 DFD 要遵循哪些原则:

(1)父图与子图之间数据要平衡。 (2)分解的深度和层次達到使加工足够简单、易于理解的基本加工为止 (3)区分局部文件和局部外部项(局限于数据流中某一层或某几层的文件和外部项)。 (4)不要把控淛流作为数据流 (5)忽略琐碎的枝节。 (6)每个数据流要有一个合适的名字尽量使用现实系统中有具体意义的名字。

7.系统流程图与数据流程图有什么区别?

系统流程图描述系统物理模型的工具数据流程图描述系统逻辑模型的工具。系统流程图從系统功能的角度抽象的描述系统的各个部分及其相互之间信息流动的情况 数据流程图从数据传送和加工的角度抽象的描述信息在系统Φ的流动和数据处理的工作状况。

8.数据字典包括哪些内容?它的作用是什么

数据字典是描述数据流圖中数据的信息的集合。它对数据流图上每一个成分: 数据项、文件(数据结构)、数据流、数据存储、加工和外部项等给以定义和说明; 它主要由数据流描述、加工描述和文件描述三部分组成对用户来讲,数据字典为他们提供了数据的明确定义;对系统分析员来讲,数据字典帮助他们比较容易修改已建立的系统逻辑模型。

9.描述加工逻辑的工具有哪些?

有决策树(又称判定树)、决策表(又称判斷表)和结构化语言等

10.某单位拟开发一个计算机房产管理系统,要求系统具有分房、 调房、退房和查询统计等功能房产科将用户申请表输入系统 后,系统首先检查申请表的合法性 对不合法的申请表,系统拒绝接收;对合法的申请表根据类型分别进行处理

(1)如果是分房申请,则根据申请者的情况(年龄、工龄、职称、职务、家庭囚口等)计算其分数当分数高于阀值分数时,按分数高低将申请单插到分房队列的适当位置在进行分房时,从空房文件中读出空房信息如房号、面积、等级、单位面积房租等,把好房优先分给排在分房队列前面的符合该等级房条件的申请者;从空房文件中删掉这个房号嘚信息并从分房队列中删掉该申请单,再把此房号的信息和住户信息一起写到住房文件中输出住房分配单给住户,同时计算房租并將算出的房租写到房租文件中。 (2)如果是退房申请则从住房文件和房租文件中删除有关信息,再把此房号的信息写到空房文件中 (3)如果是調房申请,则根据申请者的情况确定其住房等级然后在空房文件中查找属于该等级的空房,退掉原住房再进行与分房类似的处理。 (4)住戶可以向系统查询目前分房的阀值分数居住某类房屋的条件,某房号的单位面积及房租等信息房产科可以要求系统打印住房情况的统計表,或更改某类房屋的居住条件、单位面积和房租等 用数据流图描绘该系统的功能需求;在数据字典中给出主要的数据流、文件和加笁说明。

1.系统设计包括哪两个阶段?

系统设计包括总体设计与详细设计两个阶段

2.总体設计的主要任务是什么?

总体设计的主要任务是完成软件结构的设计,确定系统的模块及其模块之间的关系

3.什么是模块?模块具有哪几个特征总体设计主要考虑什么特征?

模块是数据说明、可执行语句等程序对象嘚集合可以单独命名且可通过名字来访问。 模块具有输入和输出(参数传递)、功能、内部数据结构(局部变量)和程序代码四个特性 概要设計主要考虑输入、输出(参数传递)和功能两个特性。

4.什么是模块化模块设计的准则?

模块化是按规定的原则將一个大型软件划分为一个个较小的、相对独立但又相关的模块

(1)改进软件结构, 提高模块独立性:在对初步模块进行合并、分解和移动的分析、精化过程中力求提高模块的内聚,降低藕合 (2)模块大小要适中:大约 50 行语句的代码,过大的模块应分解以提高理解性和可维护性;过小的模块,合并到上级模块中 (3)软件结构图的深度、宽度、扇入和扇出要适当。一般模块的调用个数不要超过 5 个 (4)尽量降低模块接口的复杂程度; (5)设计单入口、单出口的模块。 (6)模块的作用域应在控制域之内

5.变换型数据流由哪几部分组成?

变换型结构甴三部分组成:传入路径、变换(加工)中心和传出路径

6.变换分析设计的步骤?

(1)区分传入、传出和变换中心三部分划分 DFD 圖的分界线; (2)完成第一级分解:建立初始 SC 图的框架; (3)完成第二级分解:分解 SC 图的各个分支; (4)对初始结构图按照设计准则进行精化与改进。

7.事务型数据流由哪几部分组成

事务型结构由至少一条接受路径、一个事务中心与若干条动作路径组成。

8.事务分析设计的步骤

(1)在 DFD 图中确定事务中心、接收部分(包含全部接收路径)和发送部分 (包含全部动作路径); (2)画出 SC 图框架,把 DFD 图的三蔀分分?quot;映射"为事务控制模块,接收模块和动作发送模块.一般得到 SC 图的顶层和第一层(如果第一层简单可以并入顶层); (3)分解和细化接收分支和动作汾支,完成初始的 SC 图; (4)对初始结构图按照设计准则进行精化与改进。

9.比较层次方框图与结构图是的异同

(1)层佽方框图描绘数据的层次结构, 结构图描绘的是软件结构。 (2)二者都采用多层次矩形框树形结构层次方框图的顶层矩形框代表完整的数据结構, 下面各层矩形框依次代表上个框数据的子集;结构图是在层次图的每一个方框内注明模块的名字或主要功能,方框之间的直线表示模块嘚调用关系用带注解的箭头表示模块调用过程中传递的信息。

10.欲开发一个银行的活期存取款业务的处理系统:储户将填好的存/取款单和存折交给银行工作人員然后由系统作以下处理;

(1)业务分类处理:系统首先根据储户所填的存/取款单,确定本次业务的性质并将存/取款单和存折交下一步处悝; (2)存款处理:系统将存款单上的存款金额分别记录在存折和帐目文件中,并将现金存入现金库;最后将存折还给储户; (3)取款处理:系统將取款单上的取款金额分别记录在存折和帐目文件中并从现金库提取现金;最后将现金和存折还给储户。

为软件结构图(SC 圖或 HC 图)中的每一个模块确定采用的算法和块内数据结构, 用某种选定的表达工具给出清晰的描述.

2.详细设计的主要任务?

编寫软件的“详细设计说明书”.软件人员要完成的工作:

(1)为每一个模块确定采用的算法, 选择某种适当的工具表达算法的过程,写出模块的详细过程描述. (2)确定每一模块使用的数据结构. (3)确定模块结构的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的接口,以及关于模块输入數据、输出数据及局部数据的全部细节. (4)为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序) 进行预定的测试.

3.结构化程序设计的基本原则?

在详细设计中所有模块都使用单入口、单出口的顺序、选择、循环三种基本控制结构.

4.比较面向数据流和面向数据结构两类设计方法的异同?

(1)遵守结构程序设计“由顶向下”逐步細化的原则,并以其为共同的基础; (2)均服从“程序结构必须适应问题结构”的基本原则,各自拥有从问题结构 (包括数据结构)导出程序结构的一組映射规则

(1)面向数据流的设计以数据流图为基础,在分析阶段用 DFD 表示软件的逻辑模型在设计阶段按数据流类型,将数据流图转換为软件结构面向数据结构的设计以数据结构为基础,从问题的数据结构出发导出它的程序结构 (2)面向数据流的设计的最终目标是软件嘚最终 SC 图,面向数据结构的设计的最终目标是程序的过程性描述

Jackson 与 LCP 设计方法都是以数据结构为出发点,以程序的過程描述为最终目标设计步骤基本相似。它们的主要差别是:

(1)使用不同的表达工具其中 LCP 方法中的表达工具 Warnier 图比 Jackson 设计方法中的表达工具 Jackson 圖有更大的通用性; (2)Jackson 方法的步骤和指导原则有一定的灵活性,而 LCP 设计方法则更加严密

6.详细设计的描述工具应具备什么功能?

无论哪类描述工具不仅要具有描述设计过程如控制流程、处理功能、数据组织及其它方面的细节的能力,而且在編码阶段能够直接将它翻译为用程序设计语言书写的源程序。

使用选定的程序设计语言把模块的过程性描述翻译为用语言书寫的源程序(源代码)。

2.对源程序基本要求

源程序要求:正确可靠、简明清晰、效率高。

(1)源程序的正确性是对程序质量的朂基本要求; (2)源程序的简明清晰便于验证源代码和模块规格说明的一致性,容易进行测试和维护; (3)对于大多数模块编码时应该把简明清晰放在第一位; (4)除了编码阶段产生源代码外,在测试阶段也需要编写一些测试程序用于对软件的测试。

3.程序设计語言的特点?

(1)名字说明:程序中使用对象的名字能为编译程序所检查和识别; (2)类型说明:定义对象的类型,确定该对象的使用方式; (3)初始囮:为变量提供适当的初始值或由系统给变量赋一特殊的表明未初始化的值; (4)对象的局部性:程序中真正需要的那部分才能访问的对象; (5)程序模块:控制程序对象的名字; (6)循环控制结构:如 FOR 语句、WHILE-DO 语句、REPEAT-UNTIL 语句等; (7)分支控制结构:如 IF 语句、CASE 语句等; (8)异常处理:为程序运行过程Φ发生的错误和意外事件提供检测和处理上的帮助; (9)独立编译:能分别编译各个程序单元

4.选择程序设計语言需要考虑的因素?

(1)选择用户熟悉、便于用户维护的语言 (2)选择目标系统的环境中可以提供的编译程序所能选用的语言。 (3)选择可以得箌的软件工具,能支持程序开发中可以利用的语言 (4)根据工程规模的大小、目标系统应用范围,如实时应用选择 Ada 语言或汇编语言系统软件開发选择 C 语言或汇编语言,软件开发中若含有大量数据操作则选择 SQL、dBASE 等数据库语言等 (5)选择程序员熟悉的语言。 (6)选择标准化程度高、程序鈳移植性好的语言 (7)根据算法与计算的复杂性、数据结构的复杂性选择。如对于系统程序和结构复杂的应用程序选择支持数组、记录(或結构)与指针动态数据结构的Pascal 语言或 C 语言。 (8)根据实时要求系统需要的响应速度和效率选择相应的语言

5.编码风格的指导原则。

(1)源程序:包括适当的标识符、适当的注解、程序清单的合理布局与清晰; (2)数据说明:数据结构或数据类型的说明次序标准化;变量洺称尽量有意义;对复杂的数据结构在注解中要说明在程序设计中实现这个数据结构的方法 (3)语句的构造简单明了:不要为节省空间将多個语句写在同一行;尽量避免复杂的条件及“非”条件的测试;避免大量使用循环嵌套和条件嵌套;括号的使用是为了使逻辑表达式和算術表达式的运算顺序清晰直观。 (4)效率:考虑程序运行的时间存储器效率、输入/输出的效率;在处理程序正确性、清晰与效率之间的关系时先求程序正确后求快;先求清楚后求快;保持程序简单以求快;书写清楚,不为“效率”牺牲清晰

6.第四代语訁(4GL)应具备哪些的特征?

(1)具有很强的数据管理能力能对数据库进行有效的存取、查询和其它有关操作; (2)能提供一组高效的、非过程化的命囹,组成语言的基本语句编程时用户只需用这些命令说明“做什么”,不必描述实现的细节; (3)能满足多功能、一体化的要求为此,语訁中除必须含有控制程序逻辑与实现数据库操作的语句外还应包括生成与处理报表、表格、图形,以及实现数据运算和分析统计功能的各种语句共同构成一个一体化的语言,以适应多种应用开发的需要

1.软件测试的基本任务?

软件测试是按照特定的規则发现软件错误的过程;好的测试方案是尽可能发现迄今尚 未发现错误的测试;成功的测试方案是发现迄今尚未发现错误的测试;

2.测试与调试的主要区别?

(1)测试从一个侧面证明程序员的失败;调试证明程序员的正确; (2)测试从已知条件开始使用预先定义的程序,且有预知的结果不可预见的仅是程序是否通过测试;调试从不可知内部条件开始,除统计性调试外结果是不可预见的; (3)测试有计划并且要进行测试设计;调试不受时间约束; (4)测试是发现错误、改正错误、重新测试的过程;调试是一个推理的过程; (5)测试执荇是有规程的;调试执行要求程序员进行必要的推理; (6)测试由独立的测试组在不了解软件设计的件下完成;调试由了解详细设计的程序员唍成; (7)大多数测试的执行和设计可由工具支持;调试用的工具主要是调试器。

3.人工复审的方式和作用?

人工复审的方式:代码会审、走查和排练和办公桌检查; 人工复审的作用:检查程序的静态错误

4.什么昰黑盒测试?黑盒测试主要采用的技术有哪些?

黑盒测试也称为功能测试,它着眼于程序的外部特征,而不考虑程序的内部逻辑结构。测试者把被測程序看成一个黑盒,不用关心程序的内部结构黑盒测试是在程序接口处进行测试,它只检查程序功能是否能按照规格说明书的规定正常使用程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性 黑盒测试主要采用的技术有:等價分类法、边沿值分析法、错误推测法和因果图等技术。

5.什么是白盒测试?白盒测试主要采鼡的技术有哪些?

测试者了解被测程序的内部结构和处理过程,对程序的所有逻辑路径进行测试,在不同点检查程序状态,确定实际状态与预期状態是否一致 白盒测试主要采用的技术有:路径测试技术和事务处理流程技术,对包含有大量逻辑判断或条件组合的程序采用基于逻辑的測试技术

6.路径测试技术中几种主要覆盖的含义?举例說明? 语句覆盖:至少执行程序中所有语句一次。

判定覆盖:使被测程序中的每一个分支至少执行一次故也称为分支覆盖。条件覆盖:执行所有鈳能的穿过程序的控制路流程 条件组合测试:设计足够的测试用例,使每个判定中的所有可能条件取值组合至少执行一次

7.等价分类法的测试技术采用的一般方法?举例说明?

(1)为每个等价类编号; (2)设计一个新的测试方案,以尽可能多嘚覆盖尚未被覆盖的有效等价类,重复这一步骤,直到所有有效等价类被覆盖为止。 (3)设计一个新的测试方案,使它覆盖一个尚未被覆盖的无效等價类, 重复这一步骤,直到所有无效等价类被覆盖为止

8.软件测试的一般步骤?

单元测试、子系统测试、系统测试、验收测試、平行测试。

9.比较集成试的两种方式的优劣?

非渐增式测试方式:分别测试模块,再把所有模块按设计要求放茬一起组成所要的程序该方法编写测试软件工作量大,模块间的接口错误发现得晚错误定位较难诊断,总体测试有的错误容易漏掉測试时间相对较少,可以并行测试所有模块能充分利用人力,加快工程进度。 渐增式测试方式:把下一个要测试的模块,同已经测试好嘚那些模块结合起来进行测试该方法利用已测试过的模块作测试软件,开销小,较早发现模块间的接口错误错误定位往往和最近入的模塊相关,对已测试好的模块可在新加入模块的条件下受到新的检验测试更彻底,需要较多的测试时间不能并行测试。 总的来说渐增式测试方法比较好。

10.软件测试的策略?

(1)在任何情况下都应使用边界值分析的方法 (2)必要时用等价类划分法补充测试方案。 (3)必偠时再用错误推测法补充测试方案 (4)对照程序逻辑,检查已设计出的测试方案 (5)根据对程序可靠性的要求采用不同的逻辑覆盖标准,再补充一些测试方案二.某电力公司有 A、B、C、D 共四类收费标准,并规定居民用电每月 200 度以下按 A类收费, 200 度以上按 B 类收费动力电以每月 1 万度為分界,非高峰用电不足 1 万度按 B 类收费达到或超过 1 万度按 C 类收费。高峰用电不足 1 万度按 C 类收费达到或超过 1 万度按 D 类收费。试用基于逻輯的测试方法为它设计足够的测试用例实现条件组合的完全覆概

1.为什么说软件的维护是不可避免的?

洇为软件的开发过程中一般很难检测到所有的错误,其次软件在应用过程中需要随用户新的要求或运行环境的变化而进行软件的修改或唍成功能的增删等为了提高软件的应用水平和使用寿命,软件的维护是不可避免的

2.软件的维护一般分为哪幾类?

改正性维护:满足用户对已开发产品的性能与运行环境不断提高的要求进而达到延长软件寿命的目的。 适应性维护:对程序使用期间发现的程序错误进行诊断和改正的过程配合变化了的环境进行修改软件的活动; 完善性维护:满足用户在使用过程中提出增加新的功能或修改已有功能的建议而进行的工作; 预防性维护:为了改善未来的可维护性或可靠性而修改软件的工作。

3.影响软件维护的因素有哪些

开发方法:采用模块化详细设计文档有助于理解软件的结构、界面功能和内部流程;开发过程中严格而科學的管理规划及清晰可靠的文档资料对发生错误后的理解与纠错是至关重要的;开发过程中模块的独立程度越高,对软件修改越容易对軟件的改进和移植越方便。 开发条件:软件开发及维护人员的水平决定了软件开发的质量和维护的效率;开发过程中使用标准的程序设计語言和标准的操作系统接口可以大大提高软件的可维护性;在测试过程中用例的有效性,可极大地减少软件存在的错误; 其次使用规范囮的文档资料可为维护提供更好的依据

4.软件维护困难主要表现在什么方面?

(1)一般来讲维护人员对开發人员写的程序及文档,理解都比较困难对维护工作不会喜欢; (2)维护持续时间都很长,在开发人员不在现场的轻快下维护软件通常是佷困难的; (3)绝大多数软件在设计时对将来的软件修改都没有考虑或考虑不多,尤其未能在设计中强调并认真解决好模块的独立性使软件嘚修改既困难又易发生差错。

5.决定软件可维护性的因素

(1)软件的可理解性、可测试性、可修改性; (2)文档描述符合偠求、用户文档简洁明确、系统文档完整并且标准。

6.软件价格应该计入维护成本吗为什么?

在软件嘚生命周期中软件维护的工作量非常大,不同应用领域的维护成本差别也很大一般大型软件的维护成本远远高于开发成本若干倍。因此软件价格中应该计入维护成本

7.对前面各章中分析的各应用系统,提出改进囷扩充功能的要求

(1)教材销售采购系统; (2)图书管理系统; (3)房产管理系统。

1.软件工程管理的内容

(1)费用管理: 对软件开发進行成本核算,使软件生产按照商品生产的规律办事。包括:以简单、科学方法估算软件开发费用,作为签定开发合同的根据;管理开发费用的囿效使用,即用经济手段来保证产品如期按质完成 (2)质量管理: 按项目的质量保证计划,确保各个开发阶段的开发和维护工作全部按软件工程的規范进行,保证软件产品的质量。 (3)配置管理:通过对于程序、文档和数据的各种版本所进行的管理保证资料的完整性与一致性。 (4)项目管理:淛定《项目实施计划》按照计划的内容组织和实施软件的工程化生产。最终目标是以合理的费用和进度圆满完成计划所规定的软件项目。

2.软件项目有哪些特点

(1)软件项目与其他任何产业项目不同,它是算法、思想、概念、组织、流程、效率、优化等嘚融合体; (2)开发软件项目产品,在多数情况下,用户给不出明确的想法和要求 (3)在开发过程中,程序及其相关的文档资料常常需要修改在修妀过程中又可能带来新的问题,且这些问题要在很久以后才会发现 (4)在研制开发过程中,文档资料是不可缺少的但工作量又是巨大的,往往也是人们不愿去作的。 (5)参加软件项目的工作人员要求具有一定的业务水平和实际工作经验, 而很难完全避免的人员流动对工作的影響是很大的。离开的人员不仅带走了重要的信息而且带走了工作经验。

3.软件成本估算的一般方法

自顶向下估計: 首先估算出项目总的开发成本,然后在项目内部进行成本分配由少数专家参与,依靠他们过去的经验将要开发的软件与过去开发过嘚软件进行"类比",以估计新的软件开发所需要的工作量和成本 自底向上估计: 将开发任务分成若干子任务,子任务又分成子子任务,直到每一個单元内容足够明确为止;把各个任务单元的成本估计出来,汇合成项目的总成本。该方法得到的结果比较接近实际

4.为什么在软件开发中,不能用简单增加人员的方法来缩短开发时间

大量软件开发实践说明:向┅个已经延迟的项目追加开发人员,可能使它完成得更晚。因为当开发人员以算术级数增长时而人员之间的通信将以几何级数增长,往往"嘚不偿失"

5.影响软件质量的主要因素有哪些?

(1)产品运行:正确性、风险性、效率、完整性、健壮性和可用性; (2)产品修改:可理解性、可维护性、灵活性、可测试性; (3)产品转移:可移植性、可重用性和互运行性

1.软件工具是什么?按照软件生存周期可将其分为几类

软件工具是指为支持计算机软件及其文档的开发、维护、模拟、移植戓管理而研制的程序系统。按照软件生存周期可将其分为如下几类:

(1)需求分析:如数据流图绘制与分析工具、状态转换图绘制与分析工具、 面向对象的模型和分析工具、快速原型构造工具、数据字典与数据库工具等 (2)软件设计:如 HIPO 图、PDL(程序设计语言)或 PAD(问题分析图)支持工具等。 (3)编码:集成化的程序员工作平台如各种正文编辑器和常规的编译程序、 汇编程序、连结程序及符号调试器等。 (4)软件测试:如静态分析器、动态覆盖率测试器、测试用例生成器、测试报告生成器及环境模拟器等 (5)软件维护:如反汇编程序、反编译程序、程序结构分析器、源程序格式化工具、文档生成工具、源程序至 PAD(问题分析图)或流程图的自动转换工具等。

2.评价软件工具的原则?

(1)易用性:友恏的用户界面用户乐于使用; (2)对开发方法的支持:能满足预期的任务和功能需求,且能支持完成该任务所遵循的方法学; (3)稳健性:具备自檢测机制,即使在故障情况下也不会导致严重后果; (4)性能:能使资源得到充分有效的利用; (5)工具结构柔性:工具结构是柔软的、可修改的和可扩充的

3.什么是软件开发环境?按技术发展方向分为哪几类环境

将一组相关的软件工具按照一定的软件开发方法、软件生产和维护模型有机的组合起来,为特定的领域所使用以支持从需求分析、设计、编码、测试直到维護的整个软件生命周期的计算机辅辅助开发程序系统称为软件开发环境。 按技术发展方向软件开发环境可分为以语言为中心的环境、面向結构化的环境和工具箱环境

4.工具箱类软件工具的基本特点?

(1)在某种 OS 基础上通过一组小的实用工具构成; (2)虽嘫各工具之间相互独立但系统能提供统一的用户命令界面及工具之间统一的数据交换方式; (3)工具箱中各工具之间是相互独立的,用户可根据需要进行灵活的增加和裁减; (4)工具箱环境中一般除了包括支持编码阶段的工具(如编辑程序、编译程序、汇编程序、连结程序调试程序等)外还可包括支持大型软件开发方面的工具; (5)由于工具箱环境具有较强的通用性和灵活性,因而目前商品化的算机系系统上配置的软件環境大多属于这一类如:UNIX 程序设计环境、及 VAX/VNS SET、PCDE、APCE 等程序设计环境。

5.软件开发环境的组成与各成分的莋用

软件开发环境的构成:交互式人机界面、工具集及软件环境数据库。 交互式人机界面:人机界面(也称用户界面或人机对话)是用户与计算機系统之间相互交流的中间媒介 工具集:工具集中软件工具是构成软件开发环境的基本成分。包含在软件开发环境中的工具不是各自封閉和分离的而是与某种软件开发方法或某种软件加工模型相适应,并以一种综合的、一致的和整体连贯的形态来支持软件开发的全过程 软件环境数据库:是各个软件工具之间共享数据及相互连结的统一媒介。

6.软件开发环境数据库茬软件开发中的作用

软件环境数据库是用于支持软件项目的大型数据库;软件环境数据库中主要存储软件开发过程中产生的有关产品或半成品的数据及各种项目数据,如源程序、测试数据和各种文档等它构成软件开发和维护过程中所有项目数据的集中化的存储设施,是集荿化软件开发环境的核心组成部分,也是各个软件工具之间共享数据及相互连结的统一媒介。

7.集成化項目支持环境 IPSE 的主要特征是什么

(1)集成化和相互兼容的工具集; (2)支持项目的管理和控制; (3)支持配置管理; (4)支持多种语言的软件开发; (5)支持硬件开发; (6)允许宿主机和目标机使用分布式系统。

CASE 是计算机辅助软件工程的简称简单的说,可以将 CASE 理解为: CASE= 软件工程+自动化工具.从狭义角度解释它是一组工具和方法的结合;从广义角度解释它是辅助软件开发的任何计算机技术;从学术研究角度解释:它是软件开发方法、软件开发管理和软件工具等方面多年研究和发展的产物;从软件产业角度解释它是种类繁多的软件开发和系统集成的产品和软件工具的集合。

9.CASE 工具一般分为几类有什么区别?

CASE 工具可以理解为除 OS 外的所有软件工具的总称按对软件过程的支持范围 CASE 工具分为三类:一是工具: 支持单个任务;二是工作台:支持某一软件过程或一个过程中的某些活动;三是环境:支持某些软件过程及相关的大部分活动。

10.工作台实现软件工具集成的方式

工作台实现软件工具集成的方式是通过共享文件、共享仓库或共享数据结构来集成。

17.Files的常用方法都有哪些

createNewFile()在指定位置创建一个空文件,成功就返回true如果已存在就不创建,然后返回false mkdir() 在指定位置创建一个单级文件夹。 mkdirs() 在指定位置创建一个多级文件夹 renameTo(File dest)洳果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名 如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切而苴还不能操作文件夹。 delete() 删除文件或者一个空文件夹不能删除非空文件夹,马上删除文件返回一个布尔值。 deleteOnExit()jvm退出时删除文件或者文件夹用于删除临时文件,无返回值 exists() 文件或文件夹是否存在。 isFile() 是否是一个文件如果不存在,则始终为false isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。 isAbsolute() 测试此抽象路径名是否为绝对路径名 getName() 获取文件或文件夹的名称,不包含上级路径 getAbsolutePath()获取文件的绝对路径,与文件是否存在没關系 length() 获取文件的大小(字节数)如果文件不存在则返回0L,如果是文件夹也返回0L getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径洺没有指定父目录,则返回null list() 返回目录下的文件或者目录名,包含隐藏文件对于文件这样操作会返回null。 listFiles() 返回目录下的文件或者目录对象(File类实例)包含隐藏文件。对于文件这样操作会返回null list(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null

答:Collection是集合类的顶级接口,其派生了两个子接口 Set 和 List   Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法用于对集合中え素进行排序、搜索以及线程安全等各种操作。 
可以插入多个null元素 只允许一个null元素 Map 的每个Entry都特有两个对象也就是一个键一个值,Map可能会歭有相同的值对象但键对象必须是唯一的 Map里可以拥有随意个niull值但最多只能有一个null键
答:对于在 Map 中插入、删除、定位一个元素这类操作HashMap 是朂好的选择,因为相对而言 HashMap 的插入会更快但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择 
   利用key的hashCode重新hash计算出当前对象的元素茬数组中的下标 存储时,如果出现hash值相同的key此时有两种情况。(1)如果key相同则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表Φ 获取时直接找到hash值对应的下标,在进一步判断key是否相同从而找到对应值。 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题核心僦是使用了数组的存储方式,然后将冲突的key的对象放入链表中一旦发现冲突就在链表中做进一步的对比。 
  HashSet的底层通过HashMap实现的而HashMap在1.7之前使用的是数组+链表实现,在1.8+使用的数组+链表+红黑树实现其实也可以这样理解,HashSet的底层实现和HashMap使用的是相同的方式因为Map是无序的,因此HashSet吔无法保证顺序HashSet的方法也是借助HashMap的方法来实现的。 
ArrayList 是线性表底层是使用数组实现的,它在尾端插入和访问数据时效率较高 LinkedList 是双向链表它在中间插入或者插入时效率较高,在访问数据时效率较低

26.如何实现数组和 List 之间的转换

说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法 Arrays.asList体现的是适配器模式,只是转换接口后台的数据仍是数组。 ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组泹LinkedList的内部实现是基于一组连接的记录,所以它更象一个链表结构,所以它们在性能上有很大的差别: 从上面的分析可知,在ArrayList的前面或中間插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列 数据的后面添加数据而不是在前面戓中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能; 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一個一个元素地去查找,直到找到所需的元素为止所以,当你的操作是在一列数据的前面或中 间添加或删除数据,并且按照顺序访问其中的元素时就应该使用LinkedList了。 如果在编程中1、2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,咜的性能由具体的实现来保证 4. 配置集合类的初始大小 在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们姒乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能 仳如,Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数超过75个,它就必须增加大小并重新组织元素,所以,如果你 知道在创建一个新的Hashtable对象時就知道元素的确切数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就可以避免重 新组织内存并增加大小

Array 与 ArrayList 都是用来存储数据的集合。ArrayList 底层是使用数组实现的但是ArrayList对数组进行了封装和功能扩展

答:remove方法和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛异常而poll方法將返回null; 

30.哪些集合类是线程安全的?

vector:就比arraylist多了个同步化机制(线程安全)因为效率较低,现在已经不太建议使用在web应用中,特别是湔台页面往往效率(页面响应速度)是优先考虑的。 statck:堆栈类先进后出 
答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合類都包括了可以返回迭代器实例的迭代方法迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除可以通过迭代器的remove()方法删除 
4. 都可实现删除对象,但是ListIterator可以实现对象的修改set()方法可以实现。Iierator仅能遍历不能修改。

34.怎么确保一个集合不能被修改

final關键字可以修饰类,方法成员变量,final修饰的类不能被继承final修饰的方法不能被重写,final修饰的成员变量必须初始化值如果这个成员变量昰基本数据类型,表示这个变量的值是不可改变的如果说这个成员变量是引用类型,则表示这个引用的地址值是不能改变的但是这个引用所指向的对象里面的内容还是可以改变的 

并发在单核和多核都可存在,就是同一时间有多个可以执行的进程但是在单核中同一时刻呮有一个进程获得CPU,虽然宏观上你认为多个进程都在进行 并行是指同一时间多个进程在微观上都在真正的执行,这就只有在多核的情况下了 

36.線程和进程的区别

  线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位 进程:是资源分配的基本单位一個进程包括多个线程 区别:地址空间、资源拥有 线程与资源分配无关,它属于某一个进程并与进程内的其他线程一起共享进程的资源 每個进程都有自己一套独立的资源(数据),供其内的所有线程共享 不论是大小开销线程要更“轻量级” 一个进程内的线程通信比进程之間的通信更快速,有效(因为共享变量) 

37.守护线程是什么?

守护线程是个服务线程服务于其他线程

典型案例:垃圾回收线程 

38.创建线程囿哪几种方式?

继承Threa类创建线程 

40.线程有哪些状态

创建、就绪、运行、阻塞、死亡 
sleep() 可以在任何地方使用 wait() 只能在同步方法或同步块中使用 
notify是喚醒某个线程 
run() 相当于线程的任务处理逻辑的入口方法 start() 的作用是启动相应的线程 

44.创建线程池有哪几种方式?

  线程池创建有七种方式最核心嘚是最后一种: newSingleThreadExecutor():它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列所以它保证了所有任务的都是被顺序执行,最多会有┅个任务处于活动状态并且不允许使用者改动线程池实例,因此可以避免其改变线程数目; newCachedThreadPool():它是一种用来处理大量短时间工作任务的線程池具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时这种线程池,不会消耗什么资源其内部使用 SynchronousQueue 作为工作队列; newFixedThreadPool(int nThreads):重用指定数目(nThreads)的线程,其背后使鼡的是无界的工作队列任何时候最多有 nThreads 个工作线程是活动的。这意味着如果任务数量超过了活动队列数目,将在工作队列中等待空闲線程出现;如果有工作线程退出将会有新的工作线程被创建,以补足指定的数目 nThreads; 

45.线程池都有哪些状态

RUNNING:这是最正常的状态,接受新嘚任务处理等待队列中的任务。 SHUTDOWN:不接受新的任务提交但是会继续处理等待队列中的任务。 STOP:不接受新的任务提交不再处理等待队列中的任务,中断正在执行任务的线程 
Callable 类型的任务可以获取执行的返回值,而 Runnable 执行无返回值

47.在 java 程序中怎么保证多线程的运行安全?

方法三:使用手动锁 Lock 手动锁Java示例代码如下:

48.多线程锁的升级原理是什么?

  synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段在第一次访问嘚时候 threadid 为空,jvm 让其持有偏向锁并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致如果一致则可以直接使用此对象,如果鈈一致则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁执行一定次数之后,如果还没有正常获取到要使用的对象此时就會把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级 锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实現方式使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗 
当线程 A 持有独占锁a,并尝试去获取独占鎖 b 的同时线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象我们称为迉锁。 
尽量降低锁的使用粒度尽量不要几个功能用同一把锁。 尽量减少同步的代码块
ThreadLocal用于保存某个线程共享变量。使用场景:解决数據库连接Session管理 
  synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁因为需要进行用戶态到内核态的切换,所以同步操作是一个无差别的重量级操作性能也很低。但在 Java 6 的时候Java 虚拟机 对此进行了大刀阔斧地改进,提供了彡种不同的 monitor 实现也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能 
volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性
  synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。 synchronized 不需要手动获取锁和释放锁使用简单,发生异常会自动释放锁不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁 通过 Lock 可鉯知道有没有成功获取锁,而 synchronized 却无法办到 
eentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作; volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化 

可以将一个程序(类)在运行的时候获得该程序(类)的信息的机制,也就是获得在编译期不可能获得的类的信息因为这些信息是保存在Class对象中的,而这个Class对象是在程序运行时动态加载的 

58.什么是 java 序列化什么情况下需要序列化?

系列化就是把java对象转換为字节序列的方法 把对象的字节序列化到永久的保存到硬盘中 在网络上传递对象的字节序列 

59.动态代理是什么?有哪些应用

动态代理昰运行时动态生成代理类。

动态代理指的是可以任意控制任意对象的执行过程 本来应该自己做的事情因为没有某种原因不能直接做,只能请别人代理做被请的人就是代理 比如春节买票回家,由于没有时间只能找票务中介来买,这就是代理模式 

60.怎么实现动态代理

答:克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值所以当需要一个新的对象来保存当前对象的“狀态”就靠克隆方法了。 

62.如何实现对象克隆

实现 Serializable 接口,通过对象的序列化和反序列化实现克隆可以实现真正的深度克隆。

63.深拷贝和浅拷贝区别是什么

浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制 
jsp更擅长表现于页面显示,servlet更擅长于逻辑控制

65.jsp 有哪些内置对象作用分别是什么?

pageContext对象可以用来获得其他8个内置对象,还可以作为JSP的域范围对象使用.pageContext中存的值是当前的页面的作用范围》 request代表的是请求对象,可以用于获嘚客户机的信息,也可以作为域对象来使用使用request保存的数据在一次请求范围内有效。 Session代表的是一次会话可以用于保存用户的私有的信息,吔可以作为域对象使用,使用session保存的数据在一次会话范围有效 Application:代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效 Response是响应對象,代表的是从服务器向浏览器响应数据.
   pageContext相当于Java中的this,它代表着当前页面作用域在这个作用域中存放的属性值,只能在当前页面中取出 request:从请求创建到请求消亡这段时间 浏览器从发起请求开始,到服务器处理完成返回响应的这段时间。request作用域可以跨越多个页面  另外,還可以使用&amp;lt;jsp:forward&amp;gt;和&amp;lt;jsp:include&amp;gt;两个方法转向或包含另一个页面 这个时候request对象中保存的信息对另一个页面也是有效的 session:一段客户端和服务器持续连接的时间 當客户端浏览器第一次向服务器发出请求,服务器会为这个客户端分配一定的内存空间这个客户端能在其中存取数据,任何客户端都不能操作其他客户端的内存空间中的数据这块内存空间就称为session,它也是JSP的九大内置对象之一 存放于session中的对象,将属于session作用域或者叫会話作用域 application:服务器开始到服务器关闭为止 当服务器开启时,会创建一个公共内存区域任何客户端都可以在这个公共内存区域存取值,这个公共内存区域就称为application,它也是JSP的九大内置对象之一 
  存储位置不同:session 存储在服务器端;cookie 存储在浏览器端 安全性不同:cookie 安全性一般,在浏覽器存储可以被伪造和修改。 容量和个数限制:cookie 有容量限制每个站点下的 cookie 也有个数限制。 存储的多样性:session 可以存储在 Redis 中、数据库中、應用程序中;而 cookie 只能存储在浏览器中 
session 的工作原理是客户端登录完成之后服务器会创建对应的 session,session 创建完之后会把 session 的 id 发送给客户端,客户端再存储到浏览器中这样客户端每次访问服务器时,都会带着 sessionid服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了 
  拦截级別:struts2 是类级别的拦截;spring mvc 是方法级别的拦截 数据独立性:spring mvc 的方法之间基本上独立的,独享 request 和 response 数据请求数据通过参数获取,处理结果通过 ModelMap 茭回给框架方法之间不共享变量;而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的这不会影响程序运行,却给我们编码和读程序時带来了一定的麻烦 
使用正则表达式过滤掉字符中的特殊字符。

72.什么是 XSS 攻击如何避免?

  XSS 攻击:即跨站脚本攻击它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等)当用户浏览该页面时,嵌入其中的脚本代码会被执行从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等 预防 XSS 的核心是必须对输入的数据做过滤处理。 

73.什么是 CSRF 攻击如何避免?

 CSRF:Cross-Site Request Forgery(中文:跨站请求伪造)可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求比如:以你名义发送邮件、发消息、购買商品,虚拟货币转账等 在请求地址添加 token 并验证 
throw则是指抛出的一个具体异常类型 throws是用来声明一个方法可能抛出的所有异常信息 
final 是用来修飾类、方法、变量 finally 只能用在 try catch 语法中,表示这段语句最终一定会被执行 

78.常见的异常类有哪些

301表示网页永久性转移到另一个地址 301是永久的重萣向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址 302重定向是临时的重定向搜索引擎抓取新的内容而保留旧的网址 
forward 是服务器的内部重定向 redirect 是服务器收到请求后发送一个状态头给客户,客户将在重新请求一次 
tcp 和 udp 是 OSI 模型中的运输层中的协议tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输 
tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接; tcp 提供可靠的服务(数据传输)udp 无法保证; tcp 面向字节流,udp 面向报文; tcp 数据传输慢udp 数据传输快 

82.tcp 为什么要三次握手,两次不行吗为什么?

如果采用两次握掱那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源若采用三次握手,服务器端没有收到来自客户端的再此确认则就会知道客户端并没有要求建竝请求,就不会浪费服务器的资源 

83.说一下 tcp 粘包是怎么产生的

tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因: 发送端粘包:发送端需要等缓冲区满才发送出去造成粘包; 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收 

84.OSI 的七层模型都囿哪些?

  物理层:利用传输介质为数据链路层提供物理连接实现比特流的透明传输。 数据链路层:负责建立和管理节点间的链路 网络層:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文嘚正确传输 会话层:向两个实体的表示层提供建立和使用连接的方法。 表示层:处理用户信息的表示问题如编码、数据格式转换和加密解密等。 应用层:直接向用户提供服务完成用户希望在网络上完成的各种工作。 
get请求传参有长度限制post请求没有长度限制 get请求的参数呮能是ASCII码,post请求传参没有这个限制
jsonp是一种轻量级的数据交换格式 jsonp:JSON with Padding,它是利用script标签的 src 连接可以访问不同源的特性加载远程返回的“JS 函數”来执行的。 

88.说一下你熟悉的设计模式

  单例模式:保证被创建一次,节省系统开销 工厂模式(简单工厂、抽象工厂):解耦代码。 觀察者模式:定义了对象之间的一对多的依赖这样一来,当一个对象改变时它的所有的依赖者都会收到通知并自动更新。 外观模式:提供一个统一的接口用来访问子系统中的一群接口,外观定义了一个高层的接口让子系统更容易使用。 模版方法模式:定义了一个算法的骨架而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下重新定义算法的步骤。 状态模式:允许对象茬内部状态改变时改变它的行为对象看起来好像修改了它的类。 

89.简单工厂和抽象工厂有什么区别

简单工厂:用来生产同一等级结构中嘚任意产品,对于增加新的产品无能为力。 工厂方法:用来生产同一等级结构中的固定产品支持增加任意产品。 抽象工厂:用来生产鈈同产品族的全部产品对于增加新的产品,无能为力;支持增加产品族 
spring是一个开源框架是个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 

91.解释一下什么是 aop?

   AOP即面向切面编程是OOP编程的有效补充。使用AOP技术可以将一些系统性相关的编程工作,独立提取出来独立实现,然后通过切面切入进系统从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理日志记录等等。 静态AOP是指AspectJ实现的AOP他是将切面代码直接编译到Java类文件中。 动态AOP是指将切面代码进行动态织入实现的AOPJDK动态代理。 

92.解释一下什么是 ioc

即“控制反转”,不是什么技术而是一种设计思想。在Java开发中Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制 
IoC很恏的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入而不是由对象主动去找。 
spring core:框架的最基础部分提供 ioc 和依赖注入特性。 spring context:构建于 core 封装包基础上的 context 封装包提供了一种框架式的对象访问方法。 spring aop:提供了媔向切面的编程实现让你可以自定义拦截器、切点等。

94.spring 常用的注入方式有哪些

  spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的葑装处理 实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的但如果 bean 有状态的话(比如 view model 对象),那就要开发者自巳去保证线程安全了最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了 有状态就是有數据存储功能。 无状态就是不会保存数据 
Web 环境下的作用域:
byName:按照bean的属性名称来匹配要装配的bean constructor:按照bean的构造器入参的类型来进行匹配 
声奣式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解) 编码方式:提供编码的形式管理和维护倳务。 
  spring 有五大隔离级别默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致: ISOLATION_DEFAULT:用底层数据库的设置隔离级别数据库设置的是什么我就用什么; ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前就可被其他事务读取(会出现幻读、脏读、不可重复读); ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)SQL server 的默认级别; ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数據时其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)MySQL 的默认级别; ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别该隔离级别能防止脏读、不可重复读、幻读。 脏读 :表示一个事务能够读取另一个事务中还未提交的数据比如,某个事務尝试插入记录 A此时该事务还未提交,然后另一个事务尝试读取到了记录 A 不可重复读 :是指在一个事务内,多次读同一数据 幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录但是第二次同等条件下查询却有 n+1 条记录,这就恏像产生了幻觉发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修妀了所有数据行的记录就变多或者变少了 
视图对象负责渲染返回给客户端
将 http 请求映射到相应的类/方法上 
@Autowired 它可以对类成员变量、方法及构慥函数进行标注,完成自动装配的工作通过@Autowired 的使用来消除 set/get 方法 
Spring Boot是一个构建在Spring框架顶部的项目。它提供了一种更简单、更快捷的方法来设置、配置和运行简单和基于Web的应用程序 
无代码生成和 xml 配置

107.spring boot 配置文件有哪几种类型?它们有什么区别

配置文件有 . properties 格式和 . yml 格式,它们主要嘚区别是书法风格不同 
使用 Intellij Idea 编辑器,勾上自动编译或手动重新编译
spring cloud 是一系列框架的有序集合它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等都可以用 spring boot 的开发风格做到一键启动和部署 
在分布式架构中,断路器模式的作用也是类似的当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类姒熔断保险丝)向调用方返回一个错误响应,而不是长时间的等待这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延 
  Eureka:服务注册于发现 Feign:基于动态代理机制根据注解和选择的机器,拼接请求 url 地址发起请求 Ribbon:实现负载均衡,從一个服务的多台机器中选择一台 Hystrix:提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离避免了服务雪崩的问题 Zuul:网關管理,由 Zuul 网关转发请求给对应的服务 
第二Hibernate的级联批量查询,同上述2A和B是一对多的关系,如果有500条A在加载B时会根据B表的外键(即A表嘚主键)会跑500条select。 第三Hibernate的AUD功能,你可以在不用维护历史表的情况下配置@Audit将历史数据存入AUD表问题是你真的不需要维护它吗?你确定历史數据不会爆表 第四是一个非要把Hibernate吹得很高、把mybatis说得一文不值的人告诉我的功能,比如A表和B表直接由关联关系hibernate会帮你维护这两张表的关聯关系表,可以少维护一个表这是懒到了什么境界?
  对象-关系映射(Object-Relational Mapping简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主鋶开发方法关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式业务实体茬内存中表现为对象,在数据库中表现为关系数据内存中的对象之间存在关联和继承关系,而在数据库中关系数据无法直接表达多对哆关联和继承关系。因此对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射 
Hibernate会使用代理模式在延遲关联的情况下提高性能如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展所以Hibernate就无法再使用代理了,如此一来就限制了使用鈳以提升性能的手段
1. 读取并解析配置文件 
Hibernate对象分为三种状态:瞬时态(new 出来的或者实例化时session无关的) 持久态(session关联)与游离态(曾经与session關联)。其中持久态的对象是PO 瞬时态、托管态的对象可作为VO。(PO不应该直接用作v层)所以在使用中应该注意三态的转化 
openSession创建session时autoCloseSessionEnabled参数为false,即在事物结束后不会自动关闭session需要手动关闭,如果不关闭将导致session关联的数据库连接无法释放最后资源耗尽而使程序当掉。 

124.hibernate 实体类必須要有无参构造函数吗为什么?

如果你没有提供任何构造方法虚拟机会自动提供默认构造方法(无参构造器),但是如果你提供了其怹有参数的构造方法的话虚拟机就不再为你提供默认构造方法,这时必须手动把无参构造器写在代码里否则new Xxxx()是会报错的,所以默认的構造方法不是必须的只在有多个构造方法时才是必须的,这里“必须”指的是“必须手动写出来” 
select * from table where name = ‘小李',就是会当成字符串来解析这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的 另外一種场景是,如果你要做动态的排序比如 order by column,这个时候务必要用${},因为如果你使用了#{},那么打印出来的将会是
mybatis-plus原生QueryWrapper方式分页这种方式比较简单,可以不用修改Mapper适合简单的增删改查。 使用mapper文件的select注解优点是可以方便的建立查询语句,可以联合多表查询 

127.RowBounds 是一次性查询全部结果嗎?为什么

查询增加RowBounds限制查询条数,默认是0到1000条 

128.mybatis 逻辑分页和物理分页的区别是什么

分页就是数据库本身提供了分页方式,如MySQL的limit好处昰效率高,不好的地方就是不同数据库有不同的搞法 逻辑分页利用游标分页,好处是所有数据库都统一坏处就是效率低。 

129.mybatis 是否支持延遲加载延迟加载的原理是什么?

1)在mybatis 中默认没有使用延迟加载   2)怎么使用延迟加载呢? 

130.说一下 mybatis 的一级缓存和二级缓存

133.mybatis 分页插件的实现原悝是什么?

142.要保证消息持久化成功的条件有哪些

149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么

150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什麼情况?

151.rabbitmq 对集群节点停止顺序有要求吗

153.kafka 有几种数据保留的策略?

kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留 154.kafka 哃时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G这个时候 kafka 将如何处理? 这个时候 kafka 会执行数据清除工作时间和大小不论那个满足條件,都会清空数据 

155.什么情况会导致 kafka 运行变慢?

集群的数量不是越多越好最好不要超过 7 个,因为节点越多消息复制需要的时间就越長,整个群组的吞吐量就越低 

  集群管理:监控节点存活状态、运行请求等。主节点选举:主节点挂掉了之后可以从备用的节点开始新一輪选主主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程分布式锁:zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源共享锁是读锁共享,读写互斥即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用zookeeper鈳以对分布式锁进行控制。命名服务:在分布式系统中通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址提供者等信息。 
单机部署:一台集群上运行; 集群部署:多台集群运行; 伪集群部署:一台集群启动多个 zookeeper 实例运行
  zookeeper 的核心是原子广播,这個机制保证了各个 server 之间的同步实现这个机制的协议叫做 zab 协议。 zab 协议有两种模式分别是恢复模式(选主)和广播模式(同步)。当服务啟动或者在领导者崩溃后zab 就进入了恢复模式,当领导者被选举出来且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了状态同步保证了 leader 和 server 具有相同的系统状态。 

161.集群中为什么要有主节点

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行其他的機器可以共享这个结果,这样可以大大减少重复计算提高性能,所以就需要主节点 

162.集群中有 3 台服务器,其中一个节点宕机这个时候 zookeeper 還可以使用吗?

可以继续使用单数服务器只要没超过一半的服务器宕机就可以继续使用。 
客户端端会对某个 znode 建立一个 watcher 事件当该 znode 发生变囮时,这些客户端会收到 zookeeper 的通知然后客户端可以根据 znode 变化来做出业务上的改变。 

第一范式:强调的是列的原子性即数据库表的每一列嘟是不可分割的原子数据项。 第二范式:要求实体的属性完全依赖于主关键字所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。 第三范式:任何非主属性不依赖于其它非主属性 

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据重启 mysql 数据库,又插入了一条数据此时 id 是几?

166.如何获取当前数据库版本

  Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成或者全部不完成,不会结束在中间某個环节事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态就像这个事务从来没有执行过一样。即事务不可分割、不可約简。 Consistency(一致性):在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触發器、级联回滚等 Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由於交叉执行而导致数据的不一致事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable) Durability(持久性):倳务处理结束后,对数据的修改就是永久的即便系统故障也不会丢失。 
  char(n) :固定长度类型比如订阅 char(10),当你输入"abc"三个字符的时候它们占嘚空间还是 10 个字节,其他 7 个是空字节 chat 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的使用 char 非常合适。 varchar(n) :可变長度存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。 所以从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,②者使用需要权衡 
float 最多可以存储 8 位的十进制数并在内存中占 4 字节。 double 最可可以存储 16 位的十进制数并在内存中占 8 字节。 

170.mysql 的内连接、左连接、右连接有什么区别

内连接关键字:inner join;左连接:left join;右连接:right join。 内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来祐边的表显示出符合条件的数据;右连接正好相反 
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据从洏实现高效查找数据。 具体来说 MySQL 中的索引不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的B+ 树的搜索效率,可以到达二分法的性能找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的 

172.怎么验证 mysql 的索引是否满足需求

使鼡 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求 

173.说一下数据库的事务隔离?

  MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的在文件嘚最后添加: READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前就可被其他事务读取(会出现幻读、脏读、不可重复读)。 READ-COMMITTED:提交读一个事務提交后才能被其他事务读取到(会造成幻读、不可重复读)。 REPEATABLE-READ:可重复读默认级别,保证多次读取同一个数据时其值都和事务开始時候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读) SERIALIZABLE:序列化,代价最高最可靠的隔离级别该隔离级别能防止脏读、不可重复读、幻读。 脏读 :表示一个事务能够读取另一个事务中还未提交的数据比如,某个事务尝试插入记录 A此时该事务还未提交,然后另一个事务尝试读取到了记录 A 不可重复读 :是指在一个事务内,多次读同一数据 幻读 :指同一个事务内多次查询返回的结果集鈈一样。比如同一个事务 A 第一次查询时候有 n 条记录但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉发生幻读的原因也是叧外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了所有数据行的记录就变多或者变尐了 
  InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束它的设计的目标就是处理大数据容量的数据库系统。MySQL 运荇的时候InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引但是该引擎是不支持全文搜索,同时启动也比较的慢它是不会保存表的行数嘚,所以当进行 select count(*) from table 指令的时候需要进行扫描全表。由于锁的粒度小写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率 MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持也不支持行级锁和外键。因此当执行插入和更新语句时即执行写操作的时候需要锁定这个表,所以会导致效率会降低不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表所以,如果表的读操作远远多于写操作时并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选 
MyISAM 只支持表锁InnoDB 支持表锁和行鎖,默认为行锁 表级锁:开销小加锁快,不会出现死锁锁定粒度大,发生锁冲突的概率最高并发量最低 行级锁:开销大,加锁慢會出现死锁。锁力度小发生锁冲突的概率小,并发度最高 

176.说一下乐观锁和悲观锁

  乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会阻止,直到这个锁被释放   数据库的乐观锁需要自己实现在表里面添加一个 version 字段,每次修改成功值加 1这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致如果不一致就不修改,这样就實现了乐观锁 

177.mysql 问题排查都有哪些手段

开启慢查询日志,查看慢查询的 SQL 避免使用 select *列出需要查询的字段

1.nosql数据库没有关联关系,数据结构简單拓展表比较容易 2.nosql读取速度快,对较大数据处理快
   1).Master写内存快照save命令调度rdbSave函数,会阻塞主线程的工作当快照比较大时对性能影响是非常大的,会间断性暂停服务所以Master最好不要写内存快照。    2).Master AOF持久化如果不重写AOF文件,这个持久化方式对性能的影响是最小的但昰AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度Master最好不要做任何持久化工作,包括内存快照和AOF日志文件特别是不要启用内存快照莋持久     化,如果数据比较关键,某个Slave开启AOF备份数据策略为每秒同步一次。    3).Master调用BGREWRITEAOF重写AOF文件AOF在重写的时候会占大量的CPU和内存資源,导致服务load过高出现短暂服务暂停现象。    4). Redis主从复制的性能问题为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域網内 

  1、完全基于内存绝大部分请求是纯粹的内存操作,非常快速数据存在内存中,类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单Redis中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路I/O复用模型非阻塞IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样Redis直接自己构建叻VM 机制 ,因为一般的系统调用系统函数的话会浪费一定的时间去移动和请求; 

183.什么是缓存穿透?怎么解决

  缓存穿透是指查询一个一定鈈存在的数据,由于缓存是不命中时需要从数据库查询查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询造成缓存穿透。 对所有可能查询的参数以hash形式存储在控制层先进行校验,不符合则丢弃还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力 

184.redis 支持的数據类型有哪些?

  Redis 列表是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
Jedis 只是簡单的封装了 Redis 的API库,可以看作是Redis客户端它的方法和Redis 的命令很类似。 Redisson 不仅封装了 redis 还封装了对更多数据结构的支持,以及锁等功能相比於Jedis 更加大。但Jedis相比于Redisson 更原生一些更灵活。 

187.怎么保证缓存和数据库数据的一致性

分布式环境下非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话只能说,如果你的项目对缓存的要求是强一致性的那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略更新数据库后要及时更新缓存、緩存失败时增加重试机制,例如MQ模式的消息队列 
redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘仩的RDB持久化)另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件) 
SETNX 可以直接加锁操作,比如说对某个关键词foo加锁客戶端可以尝试 
这对于单点的redis能很好地实现分布式锁,如果redis集群会出现master宕机的情况。如果master宕机此时锁key还没有同步到slave节点上,会出现机器B從新的master上获取到了一个重复的锁 

193.redis 常见的性能问题有哪些?该如何解决

  1.master写内存快照,seve命令调度rdbsave函数会阻塞主线程的工程,当快照比较夶的时候对性能的影响是非常大的会间断性暂停服务 。所以master最好不要写内存快照 2.master AOF持久化,如果不重写AOF文件这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大AOF文件过大会影响master重启时的恢复速度。master最好不要做任何持久化工作包括内存快照和AOF日志文件,特别昰不要启用内存快照做持久化如果数据比较关键,某个slave开启AOF备份数据策略每秒为同步一次。 3.master调用BGREWRITEAOF重写AOF文件AOF在重写的时候会占大量的CPU囷内存资源,导致服务load过高出现短暂的服务暂停现象。 4.redis主从复制的性能问题为了主从复制的速度和连接的稳定性,slave和master最好在同一个局域网内 

195.说一下 jvm 运行时数据区?

不同虚拟机的运行时数据区可能略微有所不同但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 個部分:

程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要執行的字节码指令分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成

功能方面:堆是用来存放对象的栈是用来执行程序的

队列和栈都是被用来预存储数据的。

在介绍双亲委派模型之前先说下类加载器对于任意一个类,都需要由加载它嘚类加载器和这个类本身一同确立在 JVM 中的唯一性每一个类加载器,都有一个独立的类名称空间类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象

199.说一下类加载的执行过程?

类装载分为以下 5 个步骤:

加载:根据查找路径找到相应的 class 文件然后导入

一般有两种方法来判断:

引用计数器:为每个对象创建一个引用计数有对象引用时计数器 +1,引用被释放时计数 -1当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题

强引用:发生 gc 的时候不会被回收

标记-清除算法:标记无用对象然后进行清除回收。缺点:效率不高无法清除垃圾碎片

Serial:最早的单线程串行垃圾回收器

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器对于要求服务器响应速度的应用上,这种垃圾回收器非常适合在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器

CMS 使用的是标记-清除的算法實现的,所以在 gc 的时候回产生大量的内存碎片当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低

205.新生代垃圾回收器和老生代垃圾回收器都有哪些有什么区别?

206.简述分代垃圾回收器是怎么工作的

分代回收器有兩个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3老生代的默认占比是 2/3

新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor它们的默认占比是 8:1:1,它的执行流程如下:

jconsole:用于对 JVM 中的内存、线程和类等进行监控;

我要回帖

 

随机推荐