JavaScript-进阶问题列表

作者:Lydia Hallie翻译:疯狂的技术宅 原文:https://github.com/lydiahalli... 我在我的 Instagram 上每天都会发布 JavaScript 的选择题,并且同时也会在这个仓库中发布。 从基础到进阶,测试你有多了解 JavaScript,刷新你的知识,或者帮助你的 coding 面试! 我每周都会在这个仓库下更新新的问题。 答案在问题的下方。祝你好运 1. 输出是什么?function sayHi() { console.log(name) console.log(age) var name = 'Lydia' let age = 21}sayHi()A: Lydia 和 undefinedB: Lydia 和 ReferenceErrorC: ReferenceError 和 21D: undefined 和 ReferenceError答案: D在函数内部,我们首先通过 var 关键字声明了 name 变量。这意味着变量被提升了(内存空间在创建阶段就被设置好了),直到程序运行到定义变量位置之前默认值都是 undefined。因为当我们打印 name 变量时还没有执行到定义变量的位置,因此变量的值保持为 undefined。 通过 let 和 const 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。 2. 输出是什么?for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1)}for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1)}A: 0 1 2 和 0 1 2B: 0 1 2 和 3 3 3C: 3 3 3 和 0 1 2答案: C由于 JavaScript 的事件循环,setTimeout 回调会在遍历结束后才执行。因为在第一个遍历中遍历 i 是通过 var 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 ++ 来每次递增 i 的值。当 setTimeout 回调执行的时候,i 的值等于 3。 ...

July 13, 2019 · 12 min · jiezi

vue总结

原文地址 vue(前端框架)解决了什么问题?现在的前端页面元素越来越多,结构也变得越来越复杂,当数据和视图混合在一起的时候对它们的处理会十分复杂,同时也很容易出现错误,而现代框架使用声明式语法,描述组件对象的嵌套关系,并自动生成与dom对象的对应关系参考1 vue生命周期vue生命周期描述beforeCreate组件实力被创建,el和数据对象都为undefined,还未初始化create数据已经被初始化,并且初始化了Vue内部事件,但是DOM还未生成befroeMount完成了模板的编译。把data对象里面的数据和vue的语法写的模板编译成了虚拟DOMmouted执行了render函数,将渲染出来的内容挂载到了DOM节点上beforeUpdate组件更新之前:数据发生变化时,会调用beforeUpdate,然后经历DOM diffupdated组件更新后activedkeep-alive组件被激活deactivatedkeep-alive移除beforeDestroy组件销毁前destroyed组件销毁后简述Vue的响应式原理可以问数据变动如何和视图联系在一起? Vue是采用数据劫持结合发布者-订阅者模式的方式, Vue相应系统有三大核心:observe,dep,watcher;精简版Vue代码参考Observe:当一个Vue实例创建时,initData阶段,vue会遍历data选项的属性(observe),用 Object.defineProperty 将它们转为 getter/setter并且在内部追踪相关依赖(dep),在属性被访问和修改时通知变化。Compite:调用compile方法解析模版,当视图中有用到vue.data中数据的时候,会调用实例化watcher方法进行依赖收集Watcher:是Observer和Compile之间通信的桥梁,当视图中遇到绑定的数据时,在watcher方法中会获取这个数据,此时会触发observe中的getter方法,Dep:发布订阅模式,observe中数据的getter被触发时会收集依赖的watcher(dep.depend方法)当有数据被改动时会触发observe中数据的setter,此时会调用dep.notify方法给所有订阅的watcher发通知(通过回掉方式)进行视图更新,此时会进行diff流程: vue中data为什么必须要是一个函数vue中的data为对象,是引用类型,当重用组件时,一个组件对data做了更改,那么另一个组件也会跟着改,而使用返回一个函数返回数据,则每次返回都是一个新对象,引用地址不用,所以就不会出现问题Virtual DOM 是什么虚拟DOM是一个JavaScript对象,包含了当前DOM的基本结构和信息,它的存在是为了减少对操作无用DOM所带来的性能消耗,在大量的、频繁的数据更新下能够对视图进行合理的高效的更新(细粒度的精准修改),同时也抽象了原来的渲染过程,实现了跨平台的能力 简述vue中的DOM DIFF算法精简源码;当数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch给真实的DOM打补丁(两个重要函数patchVnode和updateChildren): 先判断根结点及变化后的节点是否是sameVnode,如果不是的化,就会创建新的根结点并进行替换如果是sameVnode,则进入patchVnode函数,其基本判断 如果两个节点是相等oldVnode === vnode则直接return如果新节点是文本节点,则判断新旧文本节点是否一致,不一致(oldVnode.text !== vnode.text)则替换如果新节点不是文本节点,则开始比较新旧节点的子节点oldCh和ch:如果子节点都存在,则进行updateChildren计算(稍后讲)如果只有新子节点存在,则如果旧节点有文本节点,则移除文本节点,然后将新子节点拆入如果只有旧子节点存在,则移除所有子节点如果均无子节点且旧节点是文本节点,则移除文本节点(此时新节点一定不是文本节点)updateChildren函数做细致对比 start && oldStart对比end && oldEnd对比start && oldEnd对比end && oldStart 对比生成map映射,(key:旧子节点上的key,value:旧子节点在自己点中的位置),根据key记录下老节点在新节点的位置(idxInOld)1) 如果找到了idxInOld,如果是相同节点则移动旧节点到新的对应的地方,否则虽然key相同但元素不同,当作新元素节点去创建2) 如果没有找到idxInOld,则创建节点如果老节点先遍历完,则新节点比老节点多,将新节点多余的插入进去如果新节点先遍历完,则就节点比新节点多,将旧节点多余的删除vue中key的作用主要是为了复用节点,高效的更新虚拟DOM,另外,在使用标签元素过渡效果时也会用到key computed的原理vue对象初始化的同时对计算属性进行初始化initComputed,computed会对初始化的Watcher传入lazy: true就会触发Watcher中的watcher.dirty=true(dirty决定了当前属性是否更新),当视图中有对computed引用的时候会第一次执行计算属性,并将dirty设置为false,并将结果保存在this.value中进行缓存,如果依赖没有更改,则下次获取computed会这直接返回this.value,只有当computed所依赖的属性发生变化时会将dirty设置为true,并重新计算class Watcher{ …… evaluate () { this.value = this.get() this.dirty = false } ……}class initComputed{ …… //计算属性的getter 获取计算属性的值时会调用 createComputedGetter (key) { return function computedGetter () { //获取到相应的watcher const watcher = this._computedWatchers && this._computedWatchers[key] if (watcher) { //watcher.dirty 参数决定了计算属性值是否需要重新计算,默认值为true,即第一次时会调用一次 if (watcher.dirty) { /*每次执行之后watcher.dirty会设置为false,只要依赖的data值改变时才会触发 watcher.dirty为true,从而获取值时从新计算*/ watcher.evaluate() } //获取依赖 if (Dep.target) { watcher.depend() } //返回计算属性的值 return watcher.value } } } ……}计算属性computed和watch的区别计算属性顾名思义就是通过其他变量计算得来的,它的值是基于其所依赖的属性来进行缓存的,只有在其所依赖的属性发生变化时才会从新求值 watch是监听一个变量,当变量发生变化时,会调用对应的方法 ...

July 12, 2019 · 2 min · jiezi

手撕面试官系列三-微服务架构面试题DubboSpring-BootSpring-Cloud

直接进入主题Dubbo(面试题+答案领取方式见个人主页) Dubbo 中 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?dubbo 服务负载均衡策略?Dubbo 在安全机制方面是如何解决的dubbo 连接注册中心和直连的区别dubbo 服务集群配置(集群容错模式)dubbo 通信协议 dubbo 协议为什么要消费者比提供者个数多dubbo 通信协议 dubbo 协议为什么不能传大包dubbo 通信协议 dubbo 协议为什么采用异步单一长连接dubbo 通信协议 dubbo 协议适用范围和适用场景RMI 协议Hessian 协议httpWebserviceThrifSpring Boot 什么是 Spring Boot?Spring Boot 有哪些优点?什么是 JavaConfig?如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot 中的监视器是什么?如何在 Spring Boot 中禁用 Actuator 端点安全性?如何在自定义端口上运行 Spring Boot 应用程序?什么是 YAML?如何实现 Spring Boot 应用程序的安全性?如何集成 Spring Boot 和 ActiveMQ?如何使用 Spring Boot 实现分页和排序?什么是 Swagger?你用 Spring Boot 实现了它吗?什么是 Spring Profiles?什么是 Spring Batch?什么是 FreeMarker 模板?如何使用 Spring Boot 实现异常处理?您使用了哪些 starter maven 依赖项?什么是 CSRF 攻击?什么是 WebSockets?什么是 AOP?什么是 Apache Kafka?我们如何监视所有 Spring Boot 微服务?Spring Cloud ...

July 12, 2019 · 1 min · jiezi

手撕面试官系列二开源框架面试题SpringSpringMVCMyBatis

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视。 闲话不多说开始主题(面试题+答案领取方式见个人主页) 以下为常见spring面试题: 1 、什么是 Spring 框架?Spring 框架有哪些主要模块?2 、使用 Spring 框架能带来哪些好处?3 、什么是控制反转(IOC) ?什么是依赖注入?4 、请解释下 Spring 框架中的 IoC ?5 、BeanFactory 和 和 ApplicationContext 有什么区别?6 、Spring 有几种配置方式?7 、如何用基于 XML 配置的方式配置 Spring ?8 、如何用基于 Java 配置的方式配置 Spring?9 、怎样用注解的方式配置 Spring10 、请解释 Spring Bean 的生命周期?11 、Spring Bean 的作用域之间有什么区别?12 、什么是 Spring inner beans?13 、Spring 框架中的单例 Beans 是线程安全的么?14 、请举例说明如何在 Spring 中注入一个 Java Collection?15 、如何向 Spring Bean 中注入一个 Java.util.Properties ?16 、请解释 Spring Bean 的自动装配?17 、请解释自动装配模式的区别?18 、如何开启基于注解的自动装配?19 、请举例解释@Required 注解?20 、请举例解释@Autowired 注解?21 、请举例说明@Qualifier 注解?22 、构造方法注入和设值注入有什么区别?23 、Spring 框架中有哪些不同类型的事件?24 、FileSystemResource 和 和 ClassPathResource 有何区别?25 、Spring 框架中都用到了哪些设计模式? ...

July 11, 2019 · 2 min · jiezi

Nodejs-入门你需要知道的-10-个问题

本文为您分享「Node.js 入门你需要知道的 10 个问题」这些问题可能也是面试中会被问到的,当然问题不仅仅是这 10 道,因此,最近开源了一个新项目 Nodejs-Interview-Questions 专注于 Node.js 面试题的分享,提供了中英文版本,您也可以在线预览: https://interview.nodejs.red/ Q1: 什么是 Node.js?Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它是一个开源和跨平台的服务端应用程序。任何人都可以编写 JavaScript 代码来开发 Node.js 应用程序。它可以运行于 Microsoft Windows、Linux、 或 OS 系统。 Node.js 不是一个新的语言,也不仅仅是一个基于 JavaScript 的框架,它基于 Chrome 的 JavaScript 运行时,因此代码的编写和执行与浏览器非常相似。 Node.js 功能 以下是 Node.js 的一些重要功能 高度可扩展Node.js 使用的单线程模型且采用了事件循环架构,使得编写可扩展性高的服务器变得既容易又安全。一些传统的服务端语言会创建多线程来处理请求,通常创建线程都是有系统资源开销的,因此也会有一些限制,而 Node.js 只创建一个线程来处理更多的请求。 事件驱动和异步Node.js 的所有 API 都是异步的。这意味着下一个请求来临时可以直接处理而不用等待上一次的请求结果先返回。 No BufferingNode.js 从不缓冲任何任何数据,参见What is No-Buffering feature of Node.js 我们许多人可能会对 Node.js 感到困惑。它不是像 Apache 这样的 Web 服务器。Node.js 提供了一种新方法来执行我们的代码。它是 JavaScript 的运行时。Node.js 提供了创建 HTTP 服务器的方法,我们可以在这之上托管我们的应用程序。 ...

July 11, 2019 · 3 min · jiezi

StepByStep高频面试题深入解析-周刊07

不积跬步无以至千里。 关于【Step-By-Step】Step-By-Step (点击进入项目) 是我于 2019-05-20 开始的一个项目,每个工作日发布一道面试题。每个周末我会仔细阅读大家的答案,整理最一份较优答案出来,因本人水平有限,有误的地方,大家及时指正。 如果想 加群 学习,可以通过文末的公众号,添加我为好友。 __ 本周面试题一览:实现一个 JSON.stringify实现一个 JSON.parse实现一个观察者模式使用CSS让一个元素水平垂直居中有哪些方式ES6模块和CommonJS模块有哪些差异?31. 实现一个 JSON.stringifyJSON.stringify([, replacer [, space]) 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串。此处模拟实现,不考虑可选的第二个参数 replacer 和第三个参数 space,如果对这两个参数的作用还不了解,建议阅读 MDN 文档。 JSON.stringify() 将值转换成对应的 JSON 格式:基本数据类型: undefined 转换之后仍是 undefined(类型也是 undefined)boolean 值转换之后是字符串 "false"/"true"number 类型(除了 NaN 和 Infinity)转换之后是字符串类型的数值symbol 转换之后是 undefinednull 转换之后是字符串 "null"string 转换之后仍是stringNaN 和 Infinity 转换之后是字符串 "null"如果是函数类型 转换之后是 undefined如果是对象类型(非函数) 如果有 toJSON() 方法,那么序列化 toJSON() 的返回值。如果是一个数组 - 如果属性值中出现了 `undefined`、任意的函数以及 `symbol`,转换成字符串 `"null"`如果是 RegExp 对象。 返回 `{}` (类型是 string)如果是 Date 对象,返回 Date 的 toJSON 字符串值如果是普通对象; ...

July 10, 2019 · 5 min · jiezi

前端-100-问能搞懂80的请把简历给我

引言半年时间,几千人参与,精选大厂前端面试高频 100 题,这就是「壹题」。 在 2019 年 1 月 21 日这天,「壹题」项目正式开始,在这之后每个工作日都会出一道高频面试题,主要涵盖阿里、腾讯、头条、百度、网易等大公司和常见题型。得益于大家热情参与,现在每道题都有很多答案,提供的解题思路和答案也大大增长了我的见识,到现在已累积 100 道题目,『 8000+ 』Star 了,可以说你面试中遇到过的题目,在这里肯定能发现熟悉的身影。 后期计划除了持续更新「壹题」之外,还将整理非常详细的答案解析,提供完整的思考链路,帮助大家更好的理解题目,以及题目背后的知识,「我们的目标不是背题,而是通过题目查漏补缺,温故知新」。 更多更全更详细的每日一题和答案解析,戳这里查看 第 1 - 10 题第 1 题:(滴滴、饿了么)写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?解析:第 1 题 <br/> 第 2 题:['1', '2', '3'].map(parseInt) what & why ?解析:第 2 题 <br/> 第 3 题:(挖财)什么是防抖和节流?有什么区别?如何实现?解析:第 3 题 <br/> 第 4 题:介绍下 Set、Map、WeakSet 和 WeakMap 的区别?解析:第 4 题 <br/> 第 5 题:介绍下深度优先遍历和广度优先遍历,如何实现?解析:第 5 题 <br/> 第 6 题:请分别用深度优先思想和广度优先思想实现一个拷贝函数?解析:第 6 题 <br/> ...

July 10, 2019 · 8 min · jiezi

面试官教你写简历有点干慎入

一、前言“为什么简历投出去总是石沉大海,没有回应?!”,无论你技术水平如何,如果你遇到了这类问题,那么这篇文章就是为你准备的。(3000余字,有点干慎入) 本文转自:https://juejin.im/post/5d1dc5...

July 8, 2019 · 1 min · jiezi

每日一面深入理解reduce方法

引言有一段时间没更新了,最近挺忙的(懒病犯了)。今天偶然想到之前去去哪儿面试的时候,面试管问我的redece题目,当时被血虐的场景。干脆今天我们就来聊一下redece方法以及相关的应用 reduce方法j介绍reduce(callback,initval)其中callback函数接收4个参数: Accumulator (acc) (累计器)Current Value (cur) (当前值)Current Index (idx) (当前索引)Source Array (src) (源数组)如果initval传了,则索引从0开始,acc是initval,cur是arr[0]如果initval没有传,则索引从1开始,acc是arr[0],cur是arr[1]reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。 例1:数组累加const arr = [1,2,3,4,5];console.log(arr.reduce((pre,cur)=>{return pre+cur}))//1+2+3+4+5 15例2: 计算总价var product = [ { name: '苹果', count: 2, price: 5 }, { name: '桃子', count: 5, price: 2 }, { name: '西瓜', count: 1, price: 10 }];var total = product.reduce((pre,cur)=>{ return pre+cur.count*cur.price},0)// 30自己实现一个reduce方法知道了reduce的两种模式,利用递归实现它并不复杂 // callback参数有4个。pre,cur,index,arrArray.prototype.myReduce = function(callback,prev){ for(let i = 0 ; i < this.length; i++){ // 判断有没有第二个参数 if(!prev){ // 没有的话复杂点,第一次拿的是两个元素arr[0],arr[1],注意index的变化 prev = callback(this[i],this[i+1],i+1,this); //这里的指针是i+1都是对的,但是下一次循环的时候i必须按是3所以需要+1 i++; // 第一次循环了两个变量,下次应该从第三个执行,所以向后移动 }else{ //有的话最简单,直接就是从arr[0]开始递归 prev = callback(prev,this[i],i,this); } } return prev;}应用好不容易学了reduce,只计算个水果价格,是不是有点太小才大用了?我们看一看面试中能直接大幅度提升逼格的题目 ...

July 4, 2019 · 2 min · jiezi

Leetcode137只出现一次的数字-II

题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2]输出: 3示例 2: 输入: [0,1,0,1,0,1,99]输出: 99题解根据上一道题目的经验,我们很明确的知道不能用数数字的办法去解。考虑位运算的办法,找相关的性质。 这个题其实就是求,在其他数都出现k次的数组中有一个数只出现一次,求出这个数。 而上面那个k次的是有通用解法的。 使用一个32维的数组,用这个32维的数组存储: [第31位1的总数, 第30位1的个数,…, 第1位1的个数] 假如第0位1的个数是k的倍数,那么要求的这个数在该位一定是0;若不是k的倍数,那么要求的这个数在该位一定是1。因为假如说数组中的某些数在该位置是1,那么因为这个数要么出现k次,那么出现1次。 这样我们就可以找出只出现一次那个数的二进制表示形式。二进制如何转化为10进制呢? 假如,按照上面的规则,最招找到的二进制为: A = [0, 0, 0, 0, 0, …, 1] 因为异或操作是:相同为0,不同为1。 那么久可以依次用 1, 2, 4, 8… 和依次每一位异或,即可得到最终答案。 第二部分可能不好理解,可以手动模拟下。 class Solution { public int singleNumber(int[] nums) { // 有多少个相同的数字 int N = 3; // [高位1的个数,...,低位1的个数] int[] bitNum = new int[32]; for (int i = 0; i < nums.length; i++) { int compare = 1; int num = nums[i]; for (int j = bitNum.length - 1; j >= 0; j--) { if ((compare&num) != 0) { bitNum[j]++; } compare = compare << 1; } } int compare = 1; int res = 0; for(int i = bitNum.length - 1; i >= 0; i--) { if(bitNum[i] % N != 0) { res = res ^ compare; } } return res; }}热门阅读看了很多技术书,为啥仍然写不出项目?【Spring】IOC是啥有什么好处百度社招面试题——Redis实现分布式锁【Leetcode】114. 二叉树展开为链表 ...

July 4, 2019 · 1 min · jiezi

可能是全网最好的MySQL重要知识点面试题总结

标题有点标题党的意思,看了文章之后希望大家不会有这个想法,绝对干货!!!这篇花文章是我花了几天时间对之前总结的MySQL知识点做了完善后的产物,这篇文章可以用来回顾MySQL基础知识以及备战MySQL常见面试问题。 文末有公众号二维码,欢迎关注获取笔主最新更新文章,并可免费获取笔主总结的《Java面试突击》以及Java工程师必备学习资源。@[toc] 什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。 事务相关什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID)介绍一下? 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。并发事务带来哪些问题?在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。不可重复度和幻读区别: 不可重复读的重点是修改,幻读的重点在于新增或者删除。 例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。 例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。 事务隔离级别有哪些?MySQL的默认隔离级别是?SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。隔离级别脏读不可重复读幻影读READ-UNCOMMITTED√√√READ-COMMITTED×√√REPEATABLE-READ××√SERIALIZABLE×××MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看 mysql> SELECT @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。 ...

June 29, 2019 · 3 min · jiezi

详解一套面试题

span的display值,文本example的颜色<div class="outside"> <span id="passage" style="color:blue;" data-color="red">example</span></div><style> #passage { color: yellow;} .outside span{ color: green; display: block;} span { display: inline;} [data-color="red"] { color: red;}</style>其实浏览器中,这张图的排列顺序,就很好的表示出了这个demo中的优先级关系: 优先级关系:内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器。 ⚠️!important是个例外,优先级最高。更详细的CSS优先级请查看MDN-优先级是如何计算的? 写一个满屏的品字这就是考验一个布局的能力,没什么好说的,办法很多。我用的flex打个样。 <div class="main"> <div class="top"><h1>class="top"</h1></div> <div class="bottom"> <div class="left"> <h1>class="left"</h1> </div> <div class="right"> <h1>class="right"</h1> </div> </div></div><style>.main{ display: flex; flex-direction: column;}.top,.bottom{ height: 300px;}.top{ border: 1px solid red;}.bottom{ display: flex; border: 1px solid green;}.left,.right{ flex: 1; height: 100%;}.left{ border-right: 1px solid blue;}</style>如下代码,写出执行结果var fun = function(arr) { for(var i = 0; i< arr.length;i++) { setTimeout(function() { console.log(i); },0) } console.log(arr[i])}fun([1,2,3,4])直接写答案就没什么意思了,借这个题先扯一下执行上下文、作用域、作用域链、闭包。 ...

June 28, 2019 · 5 min · jiezi

大数据面试题

第一阶段:1.scala闭包2.jdk版本3.mysql版本4.垃圾回收器 CMS G1 HBASE笔试部分: 1.给定一个字符串,求最大的回文长度????2.给定两个有序的数组,合并一个有序的数组3.一个有序的数组构建成平衡的二叉树第二阶段: 1.压缩有哪几种? 区别 什么场景用2.文件格式有哪几种? 区别 什么场景用3.HDFS读写流程 output和input对象,谁是读,谁是写4.HDFS的namenode内存生产上如何规划?5.小文件(20M以下) 过多了 什么危害?如何规避 合并,降低namenode内存的压力6.yarn的工作流程7.yarn调度器哪几种?区别是什么 8.yarn的生产上调优参数 调优规划 让你的内存 最大化利用 vcore9.Hive内部表和外部表的区别10.Hive外部表有静态,动态 区别是什么11.Hive的UDF函数,如何永久生效?12.Hive的sort by, order by,cluster by, distributed by各代表什么意思13.sqoop如何增量抽取到Hive, 对应的hive表如何设计14.hbase的rowkey如何设计,请举例?15.hbase的读写流程经过master吗?假如不经过,那么什么流程经过呢?16.hbase的hbck命令有了解吗?哪些故障?哪些命令?17.flume如何抽取数据?记录pos点? 能支持递归吗?18.flume源代码有没有做过二次开发?19.kafka的ack有哪几种? 生产选择哪个?20.kafka offset有绝对和相对的说法吗?请解释一下21.kafka offset如何寻找数据 请复述流程22.kafka 生产者和消费者生产上如何做监控?看数据的是否及时消费呢?23.spark数据倾斜的解决方案24.spark代码有没有阅读过25.

June 27, 2019 · 1 min · jiezi

面试问算法不懂这6大数据结构知识一定过不了附力扣LeetCode真题讲解

在互联网行业的算法面试中经常会被考到数据结构的知识,它与算法相辅相成,没有扎实的数据结构基础,学好算法几乎不太可能。 这里精心整理了 Google 资深工程师的学习笔记和解题技巧,总结出6大数据结构必考知识点,同时以力扣 LeetCode 经典题辅助讲解,帮助你更好的理解数据结构要点。 ** 一、数据结构、字符串** 数组和字符串是最基本的数据结构,在很多编程语言中都有着十分相似的性质,这部分的算法面试题也是最多的。 很多时候,在分析字符串相关面试题的过程中,要针对字符串当中的每一个字符进行分析和处理,甚至有时候需要先把给定的字符串转换成字符数组之后再进行分析和处理。举个最简单的例子:翻转一个字符串。 一种比较快速和直观的方法是用两个指针,一个指向字符串的第一个字符a,一个指向它的最后一个字符m,然后互相交换。交换之后,两个指针向中央一步步地靠拢并相互交换字符,直到两个指针相遇。由于无法直接修改字符串里的字符,所以必须先把字符串变换为数组,然后再运用这个算法。 采用数据的优缺点 a.优点: 构建一个数组非常简单; 能让我们在 O(1)的时间里根据数组的下标(index)查询某个元素。 b.缺点: 构建时必须分配一段连续的空间; 查询某个元素是否存在时需要遍历整个数组,耗费O(n)的时间(其中,n是元素的个数); 删除和添加某个元素时,同样需要耗费O(n)的时间。 所以,在考虑是否应当采用数组去辅助所用算法时,务必需要考虑它的优缺点,看看它的缺点是否会阻碍所用算法的复杂度以及空间复杂度。 真题:力扣(LeetCode)第242题.Valid Anagram 判断两个字符串是否互为字谜 解题思路: 所谓字谜,也就是两个字符串中的相同字符的数量要对应相等。例如:s 等于 “anagram”,t等于 “nagaram”,s和t就互为字谜,因为它们都包含有三个字符a,一个字符g,一个字符m,一个字符n以及一个字符r。而当s为“rat”,t为 “car”的时候,s和t不互为字谜。 题目里有一个重要的前提:假设两个字符串只包含小写字母。小写字母一共26个,这意味着,可以利用两个个长度都为26的字符数组来统计每个字符串中小写字母出现的次数,然后再对比看看是否相等即可。 或者,也可以只利用一个长度为26的字符数组,将出现在字符串s里的字符个数加一,而出现在字符串t里的字符个数减一,最后判断每个小写字母的个数是否都为零就可以了。 二、链表链表的出现在某种程度上是为了避免数组的一大缺陷,即分配数组的时候需要开辟一段连续的内存空间,但鱼和熊掌不可兼得,链表也牺牲了数组的一些优点,链表不能通过下标进行快速查询。所以在考虑是否需要运用链表的时候,务必搞懂所用算法是否需要经常进行查询和遍历。 1.链表的优点和缺点 a.优点: 链表能灵活地分配内存空间 能在O(1)时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在O(1)时间内删除或者添加该元素。 b.缺点: 查询第k个元素需要O(k)时间 很显然,如果要解决的问题里面需要很多快速的查询,链表可能并不适合。一般而言,如果数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适,而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。 2.链表的经典解题方法 a.利用快慢指针(有时候需要用到三个指针): 例如,链表的翻转,寻找倒数第k个元素,或者寻找链表中间位置的元素,判断链表是否有环等等。 b.构建一个虚假的链表头: 这个方法一般用在要返回新的链表的题目中,例如: 给定两个排好序的链表,要求将它们整合在一起并排好序 将一个链表中的奇数和偶数按照原定的顺序分开后重新组合成一个新的链表,链表的头一半是奇数,后一半是偶数。 在这类问题里,如果不用一个虚假的链表头,那么在创建新链表的第一个元素时,都虚要判断一下链表的头指针是否为空,也就是要多写一条if else语句,比较简洁的写法是创建一个空的链表头,直接往其后面添加元素即可,最后返回这个空的链表头的下一个节点即可。 另外,链表有单链表和双链表,它们是实现很多复杂数据结构的基础,在解决链表的题目时,建议在纸上或者白板上画出节点之间的相互关系,然后画出修改的方法,这样可以有效地分析问题,因为凭空想象是比较困难的,而且在面试的时候,如果能把方法画在白板上,还能帮助面试官清楚地看到你的思路。 真题:力扣(LeetCode)第25题.Reverse Nodes in k-Group在链表中对每k个节点所组成的部分进行翻转 这道题是力扣(LeetCode)第24题.Swap Node in Paris(在链表中每两个节点进行翻转)的扩展,在这道题里,当k等于2时,第25题就变成了第24题。 ...

June 27, 2019 · 1 min · jiezi

小马哥Java面试题课程总结

前段时间在慕课网直播上听小马哥面试劝退("面试虐我千百遍,Java 并发真讨厌"),发现讲得东西比自己拿到offer还要高兴,于是自己在线下做了一点小笔记,文章还没更新完,供各位参考。 课程地址:https://www.bilibili.com/vide... 源码文档地址:https://github.com/mercyblitz... 本文来自于我的慕课网手记:小马哥Java面试题课程总结,转载请保留链接 ;)Java 多线程1、线程创建基本版有哪些方法创建线程? 仅仅只有new thread这种方法创建线程 public class ThreadCreationQuestion { public static void main(String[] args) { // main 线程 -> 子线程 Thread thread = new Thread(() -> { }, "子线程-1"); } /** * 不鼓励自定义(扩展) Thread */ private static class MyThread extends Thread { /** * 多态的方式,覆盖父类实现 */ @Override public void run(){ super.run(); } }}与运行线程方法区分:java.lang.Runnable() 或 java.lang.Thread类 进阶版如何通过Java 创建进程? public class ProcessCreationQuestion { public static void main(String[] args) throws IOException { // 获取 Java Runtime Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("cmd /k start http://www.baidu.com"); process.exitValue(); }}劝退版如何销毁一个线程? ...

June 24, 2019 · 12 min · jiezi

团队面试的指导

红线除 HR 外,擅自对候选人录用、薪资方面进行问询或承诺未参加面试考核,提交不实的面试官评估意见面试中恶意诋毁竞争对手或打压其他部门职责在面试环节中,对候选人基本知识技能、学习能力、沟通能力等素质项进行考察如果一面通过则通知二面,如果未通过则把候选人送走及时发出面试评价邮件潜意识不需要展示个人能力 。我不懂没关系,你得给我讲清楚 ,不要怕问时间不用管。不需要一定要 follow 时间限制(30 分钟 ——1 个小时)错挂不可避免。宁可错杀,不可放过主线业务:star 分析 (一面偏技术,二面偏业务),架构图。过往确定潜力(最核心)编码:团队的面试题技术点:star 的一些补充,用过的才问,没用过不问;新的需求可以要他简单设计出来github&blog:架构是什么,为什么要这样选;博客的点是不是清楚流程面试开场(一般 < 5 分钟): 可以给候选人倒一杯水简单寒暄几句面试官简短自我介绍候选人简短自我介绍给候选人说明一面主要考察基础知识技能面试过程 (一般 0.5-1 小时):面试模版、 STAR 原则 考察算法和代码能力、Java 知识技能,这两项是重点,在很大程度上决定候选人过不过一面考察擅长技术:如 MySql、Linux、网络等知识技能,或者候选人简历和自我介绍时明确提到擅长的技术,有亮点会是加分项考察架构能力:可以让候选人讲一个做的比较好的项目,考察候选人对系统架构的思考,有亮点是加分项面试结束(一般 < 3 分钟): 可以问下候选人对公司或者面试是否有问题要问如果一面通过则通知二面,如果未通过则把候选人送走及时发出面试评价邮件(可以让 TL 看一眼,如果没问题再加上去;也可以二面面完,再加一面)好的做法简单的自我介绍,保持微笑、乐观的仪态全神贯注地倾听,完整记录面试过程掌握好面试节奏,避免时间过短或过长面试结束前留出 2-3 分钟时间回答同学问题不好的做法接听电话、转笔或处理业务等不合适的行为给予不客观的评价和判断非语言性的暗示,特别是消极的表现过分夸大公司及部门业绩

June 24, 2019 · 1 min · jiezi

面试的一些思考

写在前面在一个小时内对一个人做出 yes or no 的判断,是一件复杂的工程 —— 信息的输入、消化、整合、再输出都要在面对面的形态下,实时密集的进行;同时,信息的不对称也增加了我们的沟通成本,不时伴随着困惑与纠结。技术面试确实容易在很多方面出现问题,本文基于自己在面试经验所成,不妨一看。 一些容易被忽视的原则首先,面试是一个双向选择的过程。从面试角度来讲,考察候选人的时候看的是这个人,而反过来候选人看面试官看到的是一个公司的形象代表,所以作为面试官,主要目标应该有两个:一是尽可能深入地了解候选人,二是需要向候选人展示我司形象。(面试官行为规范) 其次,切忌和候选人比拼知识技能。一方面知识技能和每个人的经历关系很大,我们很难找到完全匹配当前工作的候选人,考察注重的应该是候选人的学习能力,另外一方面展示面试官的自身技能并非面试的目的。 最后,我们要找的是合作者、未来的同事。一方面在面试过程中,候选人陷入困局的时候不妨点拨他一下,想想自己团队如果有个同学搞不定问题时你会怎么做?另外一方面在最终决定要不要通过时如果犹豫不决,一定需要问自己一个问题,那就是如果这个人成为你的同事,你是不是很愿意和他在一个团队并肩作战? 面试前的准备以及开场首先,面试前最好能够阅读一下候选人的简历,了解一些基本信息,发现一些有待澄清的疑问点,以及可能的兴趣点。 其次,面试开场白主要是让候选人进入面试的状态,所以简单寒暄几句就好,不建议让他完整地介绍人生旅程,或者重复简历上已有的内容,否则就是在浪费时间。 最后,面试的同时可以及时的备注面试者的回答信息,方便后续面试官的信息同步和决策判断。(面试官评价模版) 工程的面试问题一、询问过去工作中碰到过的一个项目或者解决过的问题尽可能按照 STAR (Situation, Task, Action, Result) 的技巧来组织对话,了解问题背后的信息,候选人本人的贡献,以及反映出来的能力。 通常来说这个问题我习惯放在最前面,因为对于这类问题候选人比较熟悉,回答的时候不会过于紧张。另外可以通过这个问题引出后续的一些具体的技术问题。 这个问题可以有很多变形,比如你做过的失败的项目是什么,最成功的项目,最难的项目,印象深刻的项目等等,提问的时候要考虑候选人对于回答的内容记忆是否是比较清楚的,这样有助于挖出很多细节的信息。 对于候选人的回答,需要判断其语言的信息量,如果形容词比较多,比如做得很好,客户反应不错之类的回答,应该要求其给出明确的描述,到底好在什么地方,有没有明确的内容和数据,而不是含糊的形容一下。通常如果一个工程师在得到明确提示的情况下还是不能切换陈述事实的方式,那么我基本上可以认为这个人对于平常的工作是缺乏理性思考的。 二、根据简历 / 背景询问关于某个具体的知识点的细节算法编程题算法或者代码编程题阶段,要注意候选人的思考过程,可以让他自己说说自己解题的思路,计算的复杂度,潜在的问题和局限性,以及解决的方案等等。(Coding 标准) 设计问题比如设计一个开放平台系统,一个在线购物网站等等。可以要求画出模块图,给出关键的 API 的定义或者类和类之间的关系。 注意这类问题需要提前准备,注意不要选择脑筋急转弯的问题,而应该是大家能理解的实际可能碰到的问题,另外就是不要一上来把问题全部解释清楚,因为你需要看看候选人能否主动来了解产品需求(产品往往不会把所有需求说清楚)。另外一个需要注意的是这类问题可以很容易改变或者新增需求,所以可以考察候选人的方案如何适应变化的需求。 发散的面试问题关于 * 你怎么看这一类问题一般是没有明确的答案的,主要考察候选人是否有自己的理解,比如可以问候选人对于一些常见的编程和软件工程理念的看法,DDD、OOP、SOA、设计模式、微服务等等,来看看候选人平常对于这些问题是否有思考和总结,也可以是对于最近的一些技术热点的关注,等等。 不要期望这类问题的回答是不是和自己的观点一致,如果不一致的时候也不要想着和候选人争论,而是应该引导候选人完成地表述自己的逻辑,了解其观点背后的内容,考察候选人对于概念的理解和实践的程度,看看候选人是否有比较严密的能够自圆其说的逻辑。 你的朋友或者同事是怎么评价你的注意这个问题其实是候选人自己理解到的外在对他的评价,但是还是能获得很有意思的信息,注意有时候需要深挖。深挖的时候要让候选人描述一个能符合其观点的事实,这样才能正确评估候选人实际的状态。 这个问题可以考察候选人是不是一个自省的人,能否认识到自己的长处和短处。 最近在看什么书我比较喜欢提的一个问题,看起来简单,但是能够观察候选人的学习方式和行为习惯,除了让候选人报出书名,一定需要让他讲讲这本书里面让他印象深刻的章节,以及他从中学到了什么? 工作之余做什么事情提出这个问题是观察候选人是不是真的对技术有兴趣和热情,一个工程师的业余生活也很有可能和技术有很大的关系,比如看些开源的软件、写些日常的博客等等。 应该避免的状态候选人反复在同一个问题上纠缠太久如果候选人思维陷入某个问题无法自拔,而面试官无法从沟通中获取有效信息,因为总的面试时间是有限的,所以有时候需要礼貌地打断候选人,比如说” 好的,我已经知道了,……“转移话题。 一上来就问非常困难的问题很多候选人在碰到非常困难的问题又长时间不能解决的时候会非常紧张,影响后续发挥,既然我的目的是为了寻找平常工作中的合作伙伴,通常来说没有必要把候选人弄得特别紧张。 提前太早结束即使开始几个问题候选人回答不是特别顺利,最好也能从不同的侧面考察候选人,因为可能候选人还存在其他比较优秀的方面,而且从礼貌的角度来说我也尽量尊重候选人。 陷入争执这一点一定要避免,一旦出现争执,后面的面试基本上就很难继续了,即使勉强继续下去,也无法真实地考察候选人。在可能争执的点上先放下,不要试图说服候选人,转移到其他问题上。 其他的面试技巧如何识别技术人才在我的普遍印象中,好的技术人才往往在面试开始的时候不会非常热情,但是当聊到某个具体问题的时候,可能会突然涛涛不绝地谈论从上到下的细节,同时又能在适当的时候收回来,不至于让人觉得非常不适。优秀的人往往能够从原理到实现都理解得非常透彻,既能回答具体的细节问题,又能提出自己的观点和思考总结,并且对于新的问题能够迅速给出自己的比较靠谱的思考和解释。 面试中的沟通技巧需要注意的是,在面试的过程中不仅仅要考察问题的回答,同时也要注意很多沟通技巧,比如观察对方是不是能够准确地理解问题,面对问题陈述有没有做适当的复述,有没有在没有问清楚需求的情况下就开始自顾自解答了。 候选人在回答的时候,如果偏题太远,需要通过适当的方式中断候选人的陈述。如果候选人陷入问题出不来的时候,需要给予适当的提示帮助他解答出问题以便顺利结束面试(不等于要最后放他通过)。

June 24, 2019 · 1 min · jiezi

一位大佬的亲身经历总结简历和面试的技巧

分享一篇很不错的文章!本文作者曾经写过《Java Web轻量级开发面试教程》和 《Java核心技术及面试指南》这两本书。我觉得了解简历和面试的技巧可以帮助你更好的去学习重要的知识点以及更好地去准备面试以及面试,说实话,我个人觉得这些东西还挺重要的。原文地址:https://dwz.cn/P6G0F6jH 作者:hsm_computer 文末有公众号二维码,欢迎关注获取笔主最新更新文章,并可免费获取笔主总结的《Java面试突击》以及Java工程师必备学习资源。 在18年底到19年3月,陆续面试了几家公司,有成有不成的,最终进了一家比较满意的知名外企。在本文里,我将介绍我这段时间里更新简历和面试的相关经历。可能面试相关的一些方法,大家能从我之前的博文里看到,但在本文里,大家更能从相关实战性的例子中进一步体会到面试技巧的使用方法。 1 刚开始一定得通过一些小公司练手 我打算要换工作,就更新了简历,这时就有不少猎头来找我,刚开始,我不敢面大公司,只是去些规模小的互联网公司。因为一方面,当时我很久不面试了,面试实战技能难免有些荒废,另一方面,离我之前的面试毕竟过了一阵,我不知道当前市面上哪些技术比较值钱。 而且,我在面试前会准备一些针对项目和值钱技术的说辞,这些说辞总要经过实战来演练下。事实上,在和小公司沟通的过程中,进一步提升了我的相关表述能力和相关话术,相当于用小公司来踩坑。相反,如果用大公司的面试失败来换得这些进步,就未免有些可惜了。 所以,我和猎头明说,我想去大公司,但之前,你得让我到一些小公司去练练手,同时,我面试好以后,会告诉你这些小公司的面试题和相关技巧。这样一些猎头就肯先推荐我去小公司了。 2 投简历前,微调简历描述的技巧 1 公司A在职位介绍里,提到对分布式组件有要求,尤其是负载均衡集群。这块技术我在通用版简历中只是笼统写了下,有nginx+lvs实际经验,既然这个公司有类似要求,我就在简历中细化了这块:用到了lvs+keepalive集群和nginx,它们分别工作在4层和7层,(后省略相关技术使用点描述),最后介绍下效果:用了这个负载均衡组件外,我们系统承受住了xx的并发量。 2 在公司B的职位介绍里,提到了高并发的需求,那么我就着重写了我压测的相关经验,包括压测环境怎么部署,用到哪些组件,再同时列了些压测后改善系统性能的若干方法。 3 公司C比较小,需要一位比较资深的能带团队的架构师,那么我在简历中除了介绍技术外,还着重写了带团队的若干经验。 对大家来说,其实面试任何一家公司,它们的职位要求绝对不可能一样。这时大家最好是微调下简历。这种微调,绝对不是胡乱编写,比如上个项目干的是测试,简历中改成开发。而是挖掘下侧重点。 就像我之前给出的案例,对于分布式技术,我上个项目确实用过,但简历中篇幅有限,我不可能面面俱到地写,但既然你们公司有要求,那么我就针对性地详细介绍。 其实这块谈不上是面试技巧,而是语文技巧。首先是审题,理解职位介绍的主要内容,然后再像写作文那样,详细扩展下上个项目里相关技术点。甚至这只是中考语文的考点而不是高考的,但我自己的体会是,在这段时间里针对每份职位介绍我都做了微调,所以基本上是投一份简历就能得到一次面试机会。 3 在换工作前,需要定下预期目标,同时要观察公司的情况 我见过不少人,面试成了就进去了,结果虽然钱达到预期,但工作环境和行业背景都不是自己想要的,对自己未来发展很不利。 目前不少公司的情况,比如行业背景(比如金融保险电商等)还有工作强度(加班情况)在网上都能查到,用什么技术(比如分布式技术还是云还是AI)通过打听也能问到。互联网是万能的,甚至如果仔细些,一些离职率,每年工资的增长幅度,甚至这个公司是第几轮融资,一般也能看到。 而且,大家在面试的时候,可以通过现场观察以及和面试官交流,旁敲侧击地打探到上述情况。在这个基础上,大家需要结合自己当前的需求和未来3到5年的发展方向,找若干类适合自己的公司,下面就给些我个人的和我所见到的例子。 1 (这是我个人的观点)比如我不大愿意进创业型公司,也比较排斥长时间的996,所以这类公司我只是拿来练手。 2 有段时间,不少P2P金融公司踩雷,所以哪怕面试时,这类公司的面试官会说得天花乱坠(很少有说自己不好的),但这类公司得慎重。 3 有次我到一个现场去面试,发现公司规模不大,是在一个园区里占1个楼层,且大多是业务人员,开发的不多,而且人事总会说自己公司正在融资,那么这个公司就有可能不稳定,在有其它选项时,我就没去。 4 我认识一个人,他想在Java分布式这块有所发展,他5年后的目标是架构师,在面试过程中,他就详细问了未来新进组的技术栈,等确定可以了再入职。 换工作是个折腾人的事情,虽然没有十全十美的事情,进新公司后一定会发现和当初的预期有所不同,但如果事先不调查,那么入职后后悔这还是小事,耽搁自己的发展才是大事。 4 面试前,我总要查看职位介绍,以此准备项目介绍 在上文里,我一直介绍的是准备简历和定目标,从这部分开始,将介绍准备面试。在之前的博文里,我一直强调项目介绍的重要性,所以当我自己出去面试的时候,这块绝对重视。在准备项目介绍前,我还是会通读应聘职位的技术介绍,然后按如下的步骤来准备。 1 介绍项目的基本情况,比如这个项目是干嘛的,有哪些模块流程是什么,自己做了哪些,持续了多久,有多少个人参与。这块切记,可以谈下业务,但别深入,因为面试官不熟悉,也不想熟悉候选人的业务,这块时间控制在1分钟之内。 2 通过介绍项目用到的软件,以及项目的管理方式,来进一步验证项目的真实性,否则很难和培训班给出的项目有差别。 我介绍的时候,就说,项目管理用Maven,部署用jenkins,静态扫描用Sonar,任务管理和bug管理用jira,平时采用敏捷的项目迭代方式,每天有站会,大约1月一个迭代版本。这块大家可以根据自己的情况来介绍,时间也别太长,估计用1分钟也就够了。 3 这块最重要,是结合业务,抛出项目用到的技术,但别展开。 比如我见过一个职位介绍,里面写到需要有数据库优化的经验,那么我就说,项目里我用过MyCat作为分库分表,(不展开技术),结果上线后,我们数据库能承受住每秒2000个并发请求(说下用好的结果)。 ...

June 23, 2019 · 1 min · jiezi

松哥整理了-15-道-Spring-Boot-高频面试题看完当面霸

什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石! <!--more--> 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry ,我们不合适! 今天松哥就给大家整理了 15 道高频 Spring Boot 面试题,希望能够帮助到刚刚走出校门的小伙伴以及准备寻找新的工作机会的小伙伴。 1.什么是 Spring Boot ?传统的 SSM/SSH 框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率,而 Spring Boot 可以轻松创建基于 Spring 的、可以独立运行的、生产级的应用程序。通过对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。 Spring Boot 让日益臃肿的 Java 代码又重回简洁。在配合 Spring Cloud 使用时,还可以发挥更大的威力。 2.Spring Boot 有哪些特点 ?Spring Boot 主要有如下特点: 为 Spring 开发提供一个更快、更广泛的入门体验。开箱即用,远离繁琐的配置。提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。绝对没有代码生成,也不需要XML配置。3.Spring Boot 中的 starter 到底是什么 ?首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。 ...

June 19, 2019 · 3 min · jiezi

京东面试

1.hashmap和hashtable的区别2.海量数据处理,一个大型的数字格式的文件,取前100大的数字,怎么实现?靠hash + 堆 + 统计 来实现,类似于mapreducehttps://www.cnblogs.com/liugx...3.viotile关键字4.mysql的底层实现,B+tree,底层指针算法,减少分裂,其实也可以用hash,但是hash是不支持范围查询的5.如何优化索引,创建索引的原则(要看一些创建索引的实例)6.三次挥手,四次握手为什么要4次挥手?确保数据能够完整传输。 当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。 但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后, 再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。7.多线程问题,java锁,如果写synchronized,对静态方法和动态方法的影响区别

June 17, 2019 · 1 min · jiezi

译送你43道JavaScript面试题

导读 这两天的GitHub Trending repositories被一个名叫 javascript-questions的项目霸榜了,项目中记录了一些JavaScript题目。 我大概从头到尾看了一遍,都是一些基础的题目,我大概花了半个小时(有些题很简单,可以一扫而过)把这些题做完了,虽然题目很简单,但是每道题都对应一个知识点,如果这个知识点你没有接触过,那肯定会做错,如果你接触过这些知识点,那么这些题对你来说就很容易。 建议大家也花半个小时来做一做,以便查漏补缺。 为方便大家能够更快的做题,而不把时间浪费在翻译上,我又花了几个小时把它们翻译成了中文,当然已经获得了作者授权。 文中有些点作者解释的不太完整,为了更好的理解,我在文中添加了一些个人解释。仓库地址:https://github.com/lydiahalli... JavaScript 进阶问题列表我在我的Instagram上发布了每日JavaScript选择题,我也会在这里发布! 从基础到高级:测试您对JavaScript的了解程度,刷新您的知识,或为您的编码面试做好准备!???? ????我每周用新问题更新这个项目。 答案位于问题下方的折叠部分,只需单击它们即可展开。 祝你好运❤️ 1. 下面代码的输出是什么?function sayHi() { console.log(name); console.log(age); var name = "Lydia"; let age = 21;}sayHi();A: Lydia 和 undefinedB: Lydia 和 ReferenceErrorC: ReferenceError 和 21D: undefined 和 ReferenceError<details><summary>答案</summary><p> 答案: D在函数中,我们首先使用var关键字声明了name变量。 这意味着变量在创建阶段会被提升(JavaScript会在创建变量创建阶段为其分配内存空间),默认值为undefined,直到我们实际执行到使用该变量的行。 我们还没有为name变量赋值,所以它仍然保持undefined的值。 使用let关键字(和const)声明的变量也会存在变量提升,但与var不同,初始化没有被提升。 在我们声明(初始化)它们之前,它们是不可访问的。 这被称为“暂时死区”。 当我们在声明变量之前尝试访问变量时,JavaScript会抛出一个ReferenceError。 译者注: 关于let的是否存在变量提升,我们何以用下面的例子来验证: let name = 'ConardLi'{ console.log(name) // Uncaught ReferenceError: name is not defined let name = 'code秘密花园'}let变量如果不存在变量提升,console.log(name)就会输出ConardLi,结果却抛出了ReferenceError,那么这很好的说明了,let也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。 ...

June 17, 2019 · 7 min · jiezi

最长公共前缀LCP

最长公共前缀 LCP(longest common prefix)Leetcode: 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 思路:先将字符串数组排序,在比较第一个字符串与最后一个字符串的公共前缀即可 eg:["abcddd","abbddd","abccc"] -> ["abbddd","abccc","abcddd"], 只需比较第一个字符串"abbddd"与最后一个字符串"abcddd" 代码实现 /** * 最长公共前缀 LCP(longest common prefix) * Leetcode: 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 * * 思路:先将字符串数组排序,在比较第一个字符串与最后一个字符串的公共前缀即可 * eg:["abcddd","abbddd","abccc"] -> ["abbddd","abccc","abcddd"], * 只需比较第一个字符串"abbddd"与最后一个字符串"abcddd" */public class LCP { public String solution(String[] strs){ //保存公共前缀 StringBuffer lcpStr = new StringBuffer(); if(strs == null){ return lcpStr.toString(); } //排序 Arrays.sort(strs); String first = strs[0]; String last = strs[strs.length - 1]; int firstLength = first.length(); int lastLength = last.length(); int count = firstLength > lastLength ? lastLength : firstLength; for(int i = 0;i < count;i++){ if(first.charAt(i) == last.charAt(i)){ lcpStr.append(first.charAt(i)); }else{ //不一样则退出循环 break; } } return lcpStr.toString(); } public static void main(String[] args) { LCP lcp = new LCP(); String[] strs = {"abcddd","abbddd","abccc"}; System.out.println(lcp.solution(strs)); }}

June 14, 2019 · 1 min · jiezi

尘埃落定鹅厂暑期实习面经

博主 3 月份在腾讯官网投递 Web 前端开发岗,一路从提前批走到正式批,战线长达3个月...真的不容易(菜是原罪),特此记录下征战鹅厂的面经,希望可以帮到大家。 提前批一面官网显示流程——初试 3.14(电话面 + 视频面) 自我介绍,怎么学前端的CSS 常见两列布局、三列布局CSS 水平垂直居中闭包,JS 没有闭包的话会怎么样typeof 和 instanceofjs 的原型链,继承js 的 bind、apply、call 有什么区别var、let、const的区别new 操作符原理(手动实现 new 给出思路)箭头函数,箭头函数 this 问题,箭头函数是否可以被 newpromise 知道吗,手写一个 promise 怎么写(说思路)promise.all 应用场景promise 和 async/await 的区别vue 的生命周期(我说我 React 比较熟)react 的生命周期(React16)react 性能优化react 的 diff 算法react 的 Fiber 架构状态码 304(强缓存和协商缓存)你有什么要问的吗?面完加了面试官 qq,第二天qq远程视频,手写原生 DOM 拖拽和大数相加 一面大概 1 个小时左右,比较注重 JS 和 CSS 的基础能力。面试官人很温和,通过后立马打电话和我说,这种尘埃落定的感觉真好~ 面试完官网状态从初试变成复试~ 二面3.20(电话面) 自我介绍,说说项目遇到的坑看你项目 ES6 用的比较多,说说 ES6 的一些新特性有没有考虑对图片处理的优化手段,说说常用的图片懒加载怎么做考虑过缓存方面的优化吗,强缓存和协商缓存区别防抖和节流实现无缝滑屏,你觉得怎么实现dns 查询原理tpc 握手和挥手tcp 和 udp 区别,udp 使用场景https 和 http 区别http2.0 相比 1.0 好在哪抓包会吗,抓包原理,fiddler 用过吗跨域csrf、xss,如何预防项目的 webpack 配置plugin 和 loader 的区别写过 webpack 的插件吗(没写过)webpack 单路口和多路口打包配置,为什么需要多路口babel 的编译原理,抽象语法树你有什么要问的吗?二面聊了很久,一个多小时,面试官非常厉害(应该是部门组长),整体处于被碾压的情况...然后面试官说可能会有三面,让我再准备下 感觉答得很一般,当时回去恶补了 webpack 以及性能优化的东西.. ...

June 12, 2019 · 2 min · jiezi

前端必备基础

1、DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。 1、包含与被包含A.contains(B)检测B节点是否是A节点的子节点,返回布尔值2、父与子获取父节点:node.parentNode,node.parentElement,两者区别在于后者只能获取元素获取子节点:childNodes(NodeList对象存在的子节点集合),firstChild,lastChild3、同辈(兄弟节点)nextSibling,previousSibling4、Element Travel API给DOM添加的属性childElementCount,firstElementChild,lastElementChild,nextElementSilbling,previousElementSibling,他们与之前的方法的区别是多了Element,保证只返回元素节点,而之前的方法普通的文本节点及注释节点也会返回,之前的方法在非IE浏览器中还会把元素之间的空白符当文本节点返回5、children属性与childNodes不同的地方在于:children只包含元素子节点2、DOM操作 —— 如何添加、移除、移动、复制、创建和查找节点等。 1、创建新节点createDocumentFragment() 创建一个DOM片段creatElement() 创建一个具体的元素creatTextNode() 创建一个文本节点2、添加、移除、替换、插入appendChild()removeChild()replaceChild()insertBefore() 在已有的子节点前插入一个新的子节点3、查找getElementsByTagName() 通过标签名称getElementsByName() 通过元素的name属性的值getElementById() 通过元素id,唯一性3、事件 —— 如何使用事件,以及IE和标准DOM事件模型之间存在的差别。 1、关于事件流(1)ie事件流:事件冒泡 由事件的目标(event.srcElement)接受事件,然后逐级向上(例如:下一个为包含event.srcElement的节点传递事件,直到文档节点document) (2) 其他浏览器支持的另一种事件流:事件捕获 与事件冒泡正好相反,文档节点document先监听到事件,然后把事件逐级向下传递事件,直到节点目标节点event.target (3) dom事件流 dom2级事件规范的事件流综合了以上两种,把事件流分为了以下三个阶段: 一、事件捕获阶段:不涉及事件目标,或者说这个阶段在目标之前就结束了 二、处于目标阶段:被看作冒泡阶段的一部分,所以可以在冒泡阶段在目标事件上操作事件 三、事件冒泡阶段 (4) 规范和浏览器实现的差别 dom2级事件规范的捕获阶段,事件从文档节点document开始传播,现代浏览器大多数是从window对象开始传播事件的 dom2级事件规范捕获阶段不涉及事件目标,现代浏览器大多数都在这个阶段包含事件目标2、如何使用事件?以下几种用来响应事件的事件处理程序 html事件处理程序|dom0级事件处理程序|dom2级事件处理程序|ie的事件处理程序 html事件处理程序: 指定事件:<button type="button" onclick="alert('响应事件的处javascript代码,可以用全局的函数')">Click Me!</button> 优缺点:简单,但是与HTML代码紧密耦合,更改不方便; 删除事件:同DOM0的删除事件处理方式; dom0级事件处理程序 指定事件:document.onclick = function(){alert("document has been clicked")}; 优缺点:简单且跨浏览器 删除事件:document.onclick = null; 实质: 为元素指定方法(栗子中为document指定onclick方法),移除方法,所以其处理程序是在元素的作用域运行的; dom2级事件处理程序: 指定事件:addEventListener("引号括起来的事件名", 触发事件后调用的事件处理程序, 是否在捕获节点调用时间处理程序的布尔值) 栗子:var funA = function(){alert(" DOM2级事件处理程序")}; document.addEventListener("click", funA, false); 删除事件: document.removeEventListener("click", funA, false); 如果指定的处理程序是匿名函数则不能删除,因为没有函数名; 优缺点: 可以添加多个监听事件,缺点必须指定函数名才能删除 ie事件处理程序(IE11以下,IE11及Edge用的DOM2级事件处理程序) 指定事件: attachEvent("onclick", function(){alert("is no longer supported in ie11")}); 删除事件: detachEvent("onclick", funA); 如果指定的处理程序是匿名函数则不能删除,因为没有函数名; 优缺点:可以添加多个监听事件,缺点必须指定函数名才能删除3、ie和标准dom事件模型之间存在的差别 这里的IE是IE11以下; 参数的差别: attachEvent()的第一个参数比addEventListener()的事件名多一个"on",且没有第三个参数,因为IE事件模型只支持冒泡事件流; 事件处理函数作用域的区别: IE中事件处理程序处于全局作用域,其内的this会指向window;而用DOM(0或2)级事件的事件处理程序的作用域是元素作用域,其内的this指向其所属的元素 例: document.addEventListener("click", function(){ if(this == document){ alert("此时this指向document"); } }, false); 事件对象event的属性方法的差别 IE DOM cancelBubble = true stopPropagation() //停止冒泡 returnValue = false preventDefault() //阻止元素默认事件 srcEelement target //事件目标4、XMLHttpRequest —— 这是什么、怎样完整地执行一次GET请求、怎样检测错误。 ...

June 11, 2019 · 3 min · jiezi

面试题阿里

/ 面试题013 如何实现两金额数据相加(最多小数点两位)?——阿里巴巴出题专家:御术/蚂蚁金服数据可视化高级技术专家参考答案其实问题并不难,就是考察候选人对 JavaScript 数据运算上的认知以及考虑问题的缜密程度,有很多坑,可以用在笔试题,如果用在面试,回答过程中还可以随机加入有很多计算机基础的延伸。回到这个问题,由于直接浮点相 yu 加会失精,所以要转整数;(可以插入问遇到过吗?是否可以举个例子?)。转整数是第一个坑,虽然只有两位可以通过乘以100转整数,但由于乘以一百和除以一百都会出现浮点数的运算,所以也会失精,还是要通过字符串来转;(可以插入问字符串转整数有几种方式?)字符串转整是第二个坑,因为最后要对齐计算,如果没考虑周全先 toFixed(2),对于只有一位小数点数据进入计算就会错误;转整数后的计算是个加分点,很多同学往往就是直接算了,如果可以考虑大数计算的场景,恭喜同学进入隐藏关卡,这就会涉及如何有效循环、遍历、算法复杂度的问题。

June 10, 2019 · 1 min · jiezi

前端面试题汇总每周50题

1、什么是事件冒泡?2、Vue和jquery相比,有什么不同?3、介绍一下cookie,session4、页面导入样式时,使用link和@import有什么区别?5、cookie、sessionStorage 和 localStorage 之间的区别6、title 与 h1 的区别,b 与 strong 的区别,i 与 em 的区别7、你有用过哪些前端优化的方法8、vue 为什么要避免 v-if 和 v-for 用在同一个元素上9、你平时用过哪些 es6 的特性10、如何实现不用一个临时变量,来交换数组中两个元素的位置11、介绍一下 Promise12、介绍一下 async 函数13、介绍一下 http、https,以及他们有什么不同14、介绍一下 flex15、介绍一下 Promise16、手写代码,求出一个字符串中最长的回文字符串17、介绍一下 seo18、介绍一下 express19、介绍一下浏览器的缓存数据的方式(cookit/sessionStorage/localStorage/indexedDB)20、什么是原型,原型链21、js 中,如何实现继承,并手写代码实现 js 的继承22、如何实现响应式布局23、你未来 3 年的规划是什么24、px、em和rem的区别25、优雅降级和渐进增强26、eval()的作用27、JS哪些操作会造成内存泄露28、bootstrap响应式实现的原理29、CSS样式覆盖规则30、position的值, relative和absolute分别是相对于谁进行定位的31、解释下CSSsprites,以及你要如何在页面或网站中使用它32、怎样添加、移除、移动、复制、创建和查找节点?33、浏览器的内核分别是什么?34、请解释JSONP的工作原理,以及它为什么不是真正的AJAX。35、请解释一下JavaScript的同源策略。36、浏览器是如何渲染页面的?37、对<meta></meta>标签有什么理解38、请写出你对闭包的理解,并列出简单的理解39、JavaScript中如何检测一个变量是一个String类型?请写出函数实现40、判断一个字符串中出现次数最多的字符,统计这个次数41、$(document).ready()方法和window.onload有什么区别?42、js遍历43、js数组处理函数总结

June 10, 2019 · 1 min · jiezi

王真催的面试题

.讲一下第一个项目hive中shuffle的优化 压缩压缩可以使磁盘上存储的数据量变小,通过降低I/O来提高查询速度。 对hive产生的一系列MR中间过程启用压缩 set hive.exec.compress.intermediate=true;set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;对最终输出结果压缩(写到hdfs、本地磁盘的文件) set hive.exec.compress.output=true;set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;join优化 map join 如果关联查询两张表中有一张小表默认map join,将小表加入内存 hive.mapjoin.smalltable.filesize=25000000 默认大小 hive.auto.convert.join=true 默认开启 如果没有开启使用mapjoin,使用语句制定小表使用mapjoin ```sql select /*+ MAPJOIN(time_dim) */ count(1) from store_sales join time_dim on (ss_sold_time_sk = t_time_sk) ``` 2. smb join Sort-Merge-Bucket join 解决大表与大表join速度慢问题 通过分桶字段的的hash值对桶的个数取余进行分桶 3. 倾斜连接 ```xml <!-- hive.optimize.skewjoin:是否为连接表中的倾斜键创建单独的执行计划。它基于存储在元数据中的倾斜键。在编译时,Hive为倾斜键和其他键值生成各自的查询计 划。 --> <property> <name>hive.optimize.skewjoin</name> <value>true</value> </property> <property> <!-- hive.skewjoin.key:决定如何确定连接中的倾斜键。在连接操作中,如果同一键值所对应的数据行数超过该参数值,则认为该键是一个倾斜连接键。 --> <name>hive.skewjoin.key</name> <value>100000</value> </property> <!-- hive.skewjoin.mapjoin.map.tasks:指定倾斜连接中,用于Map连接作业的任务数。该参数应该与hive.skewjoin.mapjoin.min.split一起使用,执行细粒度的控制。 --> <property> <name>hive.skewjoin.mapjoin.map.tasks</name> <value>10000</value> </property> <!-- hive.skewjoin.mapjoin.min.split:通过指定最小split的大小,确定Map连接作业的任务数。该参数应该与hive.skewjoin.mapjoin.map.tasks一起使用,执行细粒度的控制。 --> <property> <name>hive.skewjoin.mapjoin.min.split</name> <value>33554432</value> </property> ```Hive在集群过程中怎么解决数据倾斜本质原因:key的分布不均导致的 ...

June 8, 2019 · 4 min · jiezi

个人前端面试总结

个人前端面试总结前言在工作了两年之后,就一直想着跳槽,去一家大公司。在 5 月 25 号(2019 年)时,我向老板提了离职,并且此时我开始在网上投简历,开始面试。 我的打算是,一开始先去面面看,积累积累面试的经验,等做好了充分的准备之后,再投大公司的简历。 第一家公司这家公司是一家不太大的公司。 首先是做了两道面试题,在半个小时之内做出来。我做出了一道。然后是面试官和 hr 对我进行面试,问了一些基础的问题: 介绍一些我工作时所做的项目什么是事件冒泡vue 和 jQuery 相比,有什么不同?介绍一下 cookie、session第二家公司(晓信)第二家公司是 “晓信”,是一家挺大的公司。 面试题页面导入样式时,使用 link 和 @import 有什么区别?cookie、sessionStorage 和 localStorage 之间的区别title 与 h1 的区别,b 与 strong 的区别,i 与 em 的区别你有用过哪些前端优化的方法vue 为什么要避免 v-if 和 v-for 用在同一个元素上面试官面试的提问介绍一下自己(我是第一次见到面试官问这样的问题,当时有点懵,没有准备,就随便介绍了一下自己)你平时用过哪些 es6 的特性如何实现不用一个临时变量,来交换数组中两个元素的位置介绍一下 Promise介绍一下 async 函数在面试时,因为没有准备好,回答的挺差的。未通过面试。 第三家公司(unity)面试题无 面试官提问介绍一下自己这次,我有了充分的准备。主要是介绍了自己毕业自哪里;所学专业是什么;自己所掌握的技术有哪些;在上家公司主要是做什么工作的;自己对自己的评价以及自己的优势; 介绍一下简历中的项目介绍一下 react 的生命周期介绍一下 http、https,以及他们有什么不同介绍一下 flex介绍一下 Promise介绍一下 async 函数手写代码,求出一个字符串中最长的回文字符串通过了面试。 第四家公司(喜马拉雅)面试题无 第一轮技术面试介绍一下自己介绍一下简历中所做的项目介绍一下 react 的高阶组件介绍一下 react virtual dom介绍一下 react virtual dom 的 diff 算法什么是单页应用介绍一下 seo介绍一下单页应用介绍一下 express介绍一下浏览器的缓存数据的方式(cookit/sessionStorage/localStorage/indexedDB)什么是原型,原型链js 中,如何实现继承,并手写代码实现 js 的继承如何实现响应式布局第二轮面试介绍一下自己介绍一下你简历中你觉得最值得介绍的一个项目你未来 3 年的规划是什么然后面试官介绍了一下目前的业务线第三轮面试介绍一下自己介绍一下 react 16.3 版本之前的生命周期介绍一下 react 16.3 版本之后的生命周期,以及为什么要这样做介绍一下 react hooks介绍一下 react fiber 架构介绍一下 Promise 以及与 Promise 相关的所有东西(callback/async 函数)面试官出了一道 async 的题目,需要手写代码通过了面试。 ...

June 7, 2019 · 1 min · jiezi

2019年前端面试题02

px、em和rem的区别 px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不会因为其他元素的尺寸变化而变化;em表示相对于父元素的字体大小。em是相对单位 ,没有一个固定的度量值,而是由其他元素尺寸来决定的相对值。rem:相对单位,可理解为”root em”, 相对根节点html的字体大小来计算,CSS3新加属性,chrome/firefox/IE9+支持。 任意浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。为了简化计算,在css中的body选择器中声明Font-size=62.5%,这就使em值变为16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。优雅降级和渐进增强 渐进增强(Progressive Enhancement):一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。优雅降级(Graceful Degradation):一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。eval()的作用 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 语法: eval(string)JS哪些操作会造成内存泄露 JS的回收机制: 找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。 垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:“标记清除”和“引用计数”。引用计数不太常用,标记清除较为常用。1、标记清除 这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。 *关于这一块,建议读读 ,关于作用域链的一些知识详解,读完差不多就知道了,哪些变量会被做标记。 function test(){ var a=10;//被标记,进入环境 var b=20;//被标记,进入环境}test();//执行完毕之后a、b又被标记离开环境,被回收2、引用计数 另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。 function test(){ var a={};//a的引用次数为0 var b=a;//a的引用次数加1,为1 var c=a;//a的引用次数加1,为2 var b={};//a的引用次数减1,为1}哪些操作会造成内存泄露: 1.意外的全局变量引起的内存泄露,一个未声明变量的引用会在全局对象中创建一个新的变量。在浏览器的环境下,全局对象就是 window,也就是说: function foo(arg) { bar = "aaaaa";}// 实际上等价于function foo(arg) { window.bar = "aaaaa";}// 类似的function foo() { this.variable = "qqqqq";}//this 指向全局对象(window)foo();2.闭包引起的内存泄露 ...

June 7, 2019 · 2 min · jiezi

阿里巴巴前端暑期实习面经

前言先说一下为什么要去面试,因为之前跟学长吃饭的时候聊起来,大三这时候找一个暑期实习是个好机会,并且我在学校拿的奖也都围绕着前端来的。作为一个想知道自己处于什么水平的人来说,肯定要投大厂了,于是选择了阿里巴巴的前端开发,在3月19日阿里大佬将简历内推至校园招聘系统。 一面(57分钟)在完善简历的第二天,3月20日晚上20:20,便有阿里巴巴的座机号打来进行电话面试,没想到来的这么快,当时一点准备的东西都没有,脑袋是懵的。 简单介绍一下你自己你所学的专业在班中的水平是怎样的印象深刻的一个项目github开源项目的90+ star怎么来的css盒模型css实现垂直居中jQuery的dollar($)是怎么实现的jQuery的ajax原理跨域问题怎么解决jsonp的原理js的事件绑定document.ready和window.onload的区别有什么问题想问我的Ps.面试结尾时直接说面试过了,还有一些小细节忘记了...二面(29分钟)3月25日晚上21:28,浙江杭州的私人手机号打来进行电话面试。 简单介绍一下你自己为什么选择做前端(我的专业是设计)说说你的项目经历和技术难点 ...围绕项目的技术点深入展开...围绕项目的技术点模拟其他场景如何实现或解决es6和es5的区别let和var的区别js怎么解决继承问题如果有一个helloworld字符串,怎么反转小程序相比h5有哪些优势有哪些跨平台开发的框架有什么问题想问我的Ps.还有一些小细节忘记了...三面(31分钟)3月31日晚上19:31,二面的面试官打来进行电话面试,深入说一下你的两个比赛所做的项目,面试官用STAR原则引导着我把项目深入的说出来,这点很棒!其实在简历和面试中也应该用STAR原则来说明!最后是有什么问题想问我的,没有问基础。 Ps.三面完成之后我加了面试官的微信,跟我说后面还会有交叉面,让我多看一下基础,例如:事件,闭包,盒模型,vue、react的数据绑定,虚拟DOM等等 交叉面(32分钟)4月2日晚上18:12,天猫技术部的面试官打来进行电话面试,自我介绍+印象深刻的项目,针对项目问一些问题,有什么问题想问我的,没有问基础。 Ps.项目问的非常有深度,这点要注意,不要在简历上面给自己挖坑! hr面(43分钟)4月4日中午11:10,hr小姐姐打来进行电话要进行视频面试,用的是阿里自家的视频会议系统,聊的内容与牛客网中的阿里hr面试的问题基本相同。 感受阿里的面试官态度真的超棒!!!面试最后可以问一下面试官我之后该怎样去学习,哪方面比较欠缺,大佬们会对你进行一个总结和建议,让你针对性的去学习薄弱的部分。疯狂打call!!!通过这次面试之后,发现自己对前端的了解仅限于面向文档、Google、Stack Overflow,对于JavaScript的基础和所做项目的技术深度了解非常差,算法更是一片空白。不管面试过不过,未来还是要加油啦! 最后2019.04.12,23:57。邮件+短信通知,发来阿里录用意向书,没想到只面试了阿里,还能走到最后,运气爆炸!2019.04.22,11:54。hr小姐姐打电话确定入职时间和流程,offer call终于来啦~~~ 另外推荐一个前端大佬给我的面试图谱,基本上js的基础面试问题都在里面包含了!真后悔面试前没好好看一下!!!点这里>>> InterviewMap 还有另外一个面经,也是超棒的!点这里>>> 中高级前端大厂面试秘籍,为你保驾护航金三银四,直通大厂(上)

June 6, 2019 · 1 min · jiezi

2019阿里巴巴技术面试题集锦含答案

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次整体放出。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 这一次,不仅是知识的收获,还将间接地与技术大牛们做了直观的沟通,了解他们的出题思路与考察要点,并加以消化吸收,这对自己技术能力本身就是一种极大的提升。走上编程之路,不断丰富自己方能与世接轨,努力做最优秀的自己。 点下方阅读原文下载试题及答案! 本文作者:山哥在这里阅读原文 本文为云栖社区原创内容,未经允许不得转载。

June 5, 2019 · 1 min · jiezi

面试官聊一下你对MySQL索引实现原理

在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过高。文章会从,B+树索引,索引的分类,哈希索引,全文索引,这个几个方面讲解 B+树索引 索引的查找索引的插入索引的删除索引的分类 聚集索引辅助索引联合索引覆盖索引哈希索引 哈希算法自适应哈希索引全文索引 倒排索引全文检索索引缓存全文索引的一些限制InnoDB支持3种常见索引,我们接下来要详细讲解的就是 B+ 树索引,哈希索引,全文索引。 B+树索引1、B+树中的B不是代表的二叉(Binary) ,而是代表平衡(Balance),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。 2、B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有的记录节点都是按照键值大小顺序存在同一层的叶子节点,由叶子节点指针进行相连。 3、B+树在数据库中的特点就是高扇出,因此在数据库中B+树的高度一般都在2~4层,这也就是说查找一个键值记录时,最多只需要2到4次IO,当前的机械硬盘每秒至少可以有100次IO,2~4次IO意味着查询时间只需要0.02~0.04秒。 4、B+树索引并不能找到一个给定键值的具体行,B+树索引能找到的只是被查找的键值所在行的页,然后数据库把页读到内存,再内存中进行查找,最后找到要查找的数据。 5、数据库中B+树索引可以分为,聚集索引和非聚集索引,但是不管是聚集索引还是非聚集索引,其内部都是B+树实现的,即高度是平衡的,叶子节点存放着所有的数据,聚集索引和非聚集索引不同的是,叶子节点是否存储的是一整行信息。每张表只能有一个聚集索引。 6、B+树的每个数据页(叶子节点)是通过一个双向链表进行链接,数据页上的数据的顺序是按照主键顺序存储的。 先来看一个B+树,其高度为2,每页可以放4条记录,扇出为5。 图:一颗高度为2的B+树 索引的查找B+树索引使用二分法查找,也称折半查找法,基本思想就是:将记录有序化(递增或递减)排列,在超找过程中采用跳跃式方式查找,既先以有序数列的中心点位置比较对象,如果要查找的元素小于该元素的中心点元素,则将待查找的元素缩小为左半部分,否则为右半部分,通过一次比较,将查找区间缩小一半。 如图所示,从有序列表中查找 48,只需要3步: 图:二分法查找 索引的插入B+树的查找速度很快,但是维护一颗平衡的B+树代价就是非常大的,通常来说,需要1次或者多次左旋右旋来保证插入后树的平衡性。 B+树的插入为了保持树的平衡,需要做大量的页(叶子节点)的拆分,页的存储基本都在磁盘,页的拆分意味着磁盘的操作,所以应该尽量减少页的拆分,在采用自增长ID,作为主键,会大量的减少页的拆分,提升的性能。 B+树 插入的三种情况 Leaf Page满Index Page满操作NoNo直接将记录插入叶子节点YesNo1、拆分Leaf Page 2、将中间的节点放入到Index Page中 3、小于中间节点的记录放左边4、大于或等于中间节点的记录放右边YesYes1、拆分Leaf Page 2、小于中间节点的记录放左边 3、大于或等于中间节点的记录放右边 4、拆分Index Page 5、小于中间节点的记录放左边6、大于中间节点的记录放右边7、中间节点放入上一层Index Page图:一颗高度为2的B+树 我们用实例来分析B+树的插入。 (1)我们插入28这个键值,发现当前Leaf Page和Index Page都没有满,我们直接插入就可以了。 (2)这次我们再插入一条70这个键值,这时原先的Leaf Page已经满了,但是Index Page还没有满,符合表(B+树 插入的三种情况)的第二种情况,这时插入Leaf Page后的情况为50、55、60、65、70。我们根据中间的值60拆分叶节点。将中间节点放入到Index Page中。 (3)因为图片显示的关系,这次我没有能在各叶节点加上双向链表指针。最后我们来插入记录95,这时符合表(B+树 插入的三种情况)讨论的第三种情况,即Leaf Page和Index Page都满了,这时需要做两次拆分。 可以看到,不管怎么变化,B+树总是会保持平衡。但是为了保持平衡,对于新插入的键值可能需要做大量的拆分页(split)操作,而B+树主要用于磁盘,因此页的拆分意味着磁盘的操作,应该在可能的情况下尽量减少页的拆分。因此,B+树提供了旋转(rotation)的功能。 索引的删除B+树使用填充因子(fill factor) 来控制树的删除变化,50%是填充因子可设的最小值,B+树的删除也同样必须保证删除后树的平衡性,删除的过程中会涉及,合并叶子节或兄弟节点,但是都是为了保持树的平衡。 索引的分类在了解B+树索引的本质和实现后,我们看看索引分为几类,聚集索引,辅助索引,联合索引,覆盖索引 聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点存储整张表的行记录数,也将聚集索引的叶子节点成为“数据页”,聚集索引的特性决定了表中的行记录数据也是索引的一部分。同B+树数据结构一样,每个数据页都通过一个双向链表进行链接。 数据页只能按照一颗B+树进行排序,因此每张表只能有一个聚集索引,由于数据页定义了逻辑顺序,聚集索引能够很快的在数据页访问指针进行范围的查找数据。 ...

June 4, 2019 · 1 min · jiezi

秋招还有-1-个月到达战场请做好准备

不知不觉就到了六月份,六月本属于夏天,为什么说秋招快要开始了呢,实际上,秋招的这个“秋”字早就名不副实了,现在的大公司都喜欢在秋招之前就开始内推、招聘提前批学生,而提前批招聘的最早时间点大概就是6月底7月初的时候。 不过,这个时间点开始招聘的基本上都是技术岗位,也就是程序员,同为程序猿的我,希望借这篇文章,提醒各位即将参加校园招聘的朋友,真的不早了,你准备好迎接秋招了吗,这可能是你离大厂理想最近的一次机会。 去年的这个时候,我就已经想好,这个月是我最后复习的一个月,从7月开始,提前批就是我的主战场,开始内推、投简历、笔试面试,尽量在提前批能够拿到满意的offer,这样一来就可以避免在秋招的时候才疲于奔命。 本着这样的一个想法,我在秋招提前批就拿到了bat的研发offer,然后在秋招期间又拿到了网易、滴滴、头条、华为、亚马逊等offer,基本上是我能想到的最好的结果了。 当然,这之前我复习了大概3个月左右的时间,这只是复习时间,我在研究生两年时间里基本上也都在学习,最终的目标自然就是秋招,两年的学习时间+3个月的最后冲刺复习时间,能拿到这样一个结果,其实也不是特别意外的事情,当然,这也和我对校园招聘比较好的理解密不可分。 在战略上轻视对手,在战术上要重视对手。为什么说秋招提前批是你拿到offer的最好机会呢,因为这个阶段参加招聘的同学并不多,很多同学要么在公司实习,要么在实验室给老师打工,如果是本科生的话,可能还有课程要学习。 所以,你在秋招提前批能拿到offer的可能性不低于秋招正式批,或者说,可能要更高,秋招正式批参加的人数多,岗位数也多,提前批参加的人数少,岗位数却不一定少。 对于技术同学来,其实最头疼的还是如何准备秋招,如何系统地进行复习,我是Java工程师,所以对于后端的招聘要求还是比较了解的,对于其他方向没有太多发言权。 作为一个后端工程师,你必须要对计算机网络、操作系统、数据结构烂熟于心,同时对于后端必备的数据库、并发编程、网络编程、分布式、缓存、消息队列、微服务等内容有所认识和掌握,如果你是Java方向的同学,那么不用多说,Java的核心技术、JVM内存管理和调优、常用的spring和ibatis框架等等技术你都要熟练掌握。 如果你被以上的要求吓到了,那也不要紧,这都是BAT等大公司的要求,你可以努力尝试去达到这个高度,即使你只能掌握百分之70、80,那么也足够你拿到二线公司的offer了,如果你基础扎实,那么即使你的知识广度不够,也很容易受到大公司的青睐,因为通过你的底子可以看出来,你的学习能力比较强。 除此之外,程序员参加校园招聘绕不过的一个坎就是算法,关于如何准备算法笔试面试,我也写了不少文章了,但事实上,对于不同的人来说,准备的方式也差不多,无非就是刷题、LeetCode、剑指offer,外加一些真题,就可以硬着头皮上战场了。归根到底一句话,刷题是一定要刷题的,否则你会被怼的很惨。 讲完了上面这些硬实力,下面也要说一些软技能了,简历怎么写,项目经历怎么描述,简历怎么投,内推的坑如何避免,面试时怎么表述问题比较好,笔试时又有哪些常见的技巧。 如果你志在大公司,那么你一定会发现,大公司的部门那么多,眼花缭乱,如何有选择性地去投递,大厂对面试者的要求到底有哪些,具体如何去准备,刷面经有用吗,如果没有用的话我该怎么去学习? 太多太多问题,可能还在困或着你,可能我说了再多也没有你亲身经历一次来得更加真实。 一篇文章可能装不下太多干货,你可能也得不到太多帮助,于是我把我之前写过的,关于求职面试、校园招聘方面的文章,一一进行整理,并且附上我之前自费购买的一些技术资料,加起来也有3T左右了,因为这些资料包含了大部分的技术方向,所以不论你是哪个方向的同学,都可以从中找到自己需要的内容。 当然,还有技术校招必备的一些学习资源,其中包括了名校计算机基础视频课程、笔试面试视频课程、leetcode算法刷题视频课程等内容。 除此之外,为了让更多准备秋招的小伙伴能够聚在一起交流,我们也开设了一个程序员2020校招备战群,上述资料都可以在群里找到,我也会不断在群里为大家准备更多的校招干货,欢迎大家进群交流,一起备战秋招。 QQ群号:770610647 

June 1, 2019 · 1 min · jiezi

可能是-PHP-面试最靠谱的资料了

CURD 写了好几年了,一直也没有什么拿得出手的作品,去年面试被虐菜之后,于是开始写这个 PHP 面试问答,写完第一版之后发到 Github 上,关注的人蛮多的。然而面试依然被虐菜,于是继续写第二版,现在写完了,发 SF 上求拍砖,各路大神可以提点建议啥的。后面还会继续更新的,原因嘛你肯定知道的 结合实际 PHP 面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案 网络、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、面试等部分里程碑Github 搜索 php 面试 排名第一,目前 Star 为 332 枚汇总问题超过 150 个,尝试提供简洁靠谱答案,大部分都有了269 次 Commits,参考出版书籍 24 本后续计划数据结构与算法篇完善完善非技术部分内容,软实力也蛮重要的主要是完善延伸深度剖析,深究原理还是很重要的传送门《 PHP 面试问答》 https://github.com/colinlet/PHP-Interview-QA 觉得不错的话,star 一波,达成 500 star 小目标 结束语当然,有了这份最(不)靠谱的资料,工作还是依然找不到的~~

May 30, 2019 · 1 min · jiezi

前端面试之CSS相关

写出以下 %分别有多少 px:<div class="box"> <div class="box-item"></div></div><style> .box { position: relative; width: 1000px; height: 500px; } .box-item { position: absolute; top: 50%; bottom : 50%; left: 50%; right: 50%; width: 50%; height: 50%; padding-top: 10%; padding-bottom: 10%; margin-right: 10%; margin-top: 10%; }</style>说实话,看到这道题,刚开始我是自信满满的,可算到后面自己就越来越不确定了,为什么会出这么简单的题呢?由此可见,自己的基本功真不扎实呀!为了展示,我加了两个背景,效果见CodePen 解析 首先明确box-item块会相对于box块定位,并且box块是box-item块的包含块;top, bottom, left, right, width, height, padding, margin这些属性的值为%时,计算的规则如下: top, bottom, height: 基于包含元素的高度;left, right, width, padding-left, padding-right, margin-left, margin-right, padding-top, padding-bottom, margin-top, margin-bottom: 基于包含元素的宽度;最容易混淆以致出错的就是 padding-top, padding-bottom, margin-top, margin-bottom,也是本题的主要考察点:margin和padding四个方向的值为%时,都是基于包含元素的宽度计算的,一定要记住!答案 ...

May 30, 2019 · 1 min · jiezi

JAVA面试题40

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 面向对象的三个特征 封装继承多态多态的好处 可替换性。在实际开发中,存在功能迭代的情况,使用多态可以更方便测试迭代代码可扩充性。增加新子类不影响原有架构规范性。实际开发中,模块与模块间数量通常会很大,使用多态能规范模块间交互,使实际开发更具规范性代码中如何实现多态 定义接口并实现定义父类,子类继承父类并重写相应方法同名方法进行重载虚拟机是如何实现多态的 使用动态绑定技术,执行期间判断所引用对象的实际类型

May 29, 2019 · 1 min · jiezi

JAVA面试题41

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 接口的意义 为模块间交互定义规范为系统功能迭代提供极强的扩展性JAVA9中提供回调接口供系统进行异步调用抽象类的意义 定义模板,使后续子类开发更具规范封装重复逻辑,使后续开发重复代码量大大减少定义抽象方法,在封装重复逻辑的同时提供部分可扩展性静态变量和实例变量的区别 静态变量属于类本身,存放在方法区中,在类加载时初始化实例变量属于对象本身,存放在堆区中,在对象定义时初始化能否创建一个包含可变对象的不可变对象 JAVA机制允许可变对象中含有不可变对象虽然规则上允许,但是实际开发不建议这样做。创建不可变对象的目的是程序运行时只允许拥有一个对象,且该对象是线程安全的。若不可变对象中含有可变对象,则违反了初衷。

May 29, 2019 · 1 min · jiezi

javascript系列javascript深入理解作用域作用域链闭包的面试题解

一、概要作用域和作用域链是js中非常重要的特性,关系到理解整个js体系,闭包是对作用域的延伸,其他语言也有闭包的特性。 那什么是作用域?作用域指的是一个变量和函数的作用范围。 1、js中函数内声明的所有变量在函数体内始终是可见的; 2、在ES6中有全局作用域和局部作用域,但是没有没有块级作用域(catch只在其内部生效); 3、局部变量的优先级高于全局变量。 二、作用域我们来举几个栗子: 2.1变量提升var scope="global";function scopeTest(){ console.log(scope); var scope="local" }scopeTest(); //undefined上面的代码输出是undefined,这是因为局部变量scope变量提升了,等效于下面 var scope="global";function scopeTest(){ var scope; console.log(scope); scope="local" }scopeTest(); //undefined注意,如果在局部作用域中忘记var,那么变量就被声明为全局变量。 var scope="global";function scopeTest(){ console.log(scope); scope="local" }scopeTest(); //globalvar scope="global";function scopeTest(){ scope="local" console.log(scope);}scopeTest(); //local2.2没有块级作用域和我们其他常用语言不同的是,js中没有块级作用域 var data = [];for (var i = 0; i < 3; i++) { data[i] = function () { console.log(i); };}data[0](); // 3data[1](); // 3data[2](); // 32.3作用域链每个函数都有自己的执行上下文环境,当代码在这个环境中执行时候,会创建变量对象的作用域链, 那什么是作用域链?作用域链式是一个对象列表。 作用域链的作用?他保证了变量对象的有序访问。 作用域链开始的地方:当前代码执行环境的变量对象,常被称之为“活跃对象”(AO),变量的查找会从第一个链的对象开始,如果对象中包含变量属性,那么就停止查找,如果没有就会继续向上级作用域查找,直到找到全局对象中,如果找不到就会报ReferenceError。 2.4闭包function createClosure(){ var name = "jack"; return { setStr:function(){ name = "rose"; }, getStr:function(){ return name + ":hello"; } }}var builder = new createClosure();builder.setStr();console.log(builder.getStr()); //rose:hello上面在函数中反悔了两个闭包,这两个闭包都维持着对外部作用域的引用,因此不管在哪调用都是能够访问外部函数中的变量。在一个函数内部定义的函数,闭包中会将外部函数的自由对象添加到自己的作用域中,所以可以通过内部函数访问外部函数的属性,这就是js模拟私有变量的一种方式。 ...

May 29, 2019 · 2 min · jiezi

关于-Git-的-20-个面试题

翻译:疯狂的技术宅原文:https://www.edureka.co/blog/i... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 我在工作中很喜欢 Git 。 Git 在许多开发团队中扮演着重要的角色。 关于 Git 面试的第一个问题必须是: Q1. Git和SVN有什么区别?GitSVN1. Git是一个分布式的版本控制工具1. SVN 是集中版本控制工具2.它属于第3代版本控制工具2.它属于第2代版本控制工具3.客户端可以在其本地系统上克隆整个存储库3.版本历史记录存储在服务器端存储库中4.即使离线也可以提交4.只允许在线提交5.Push/pull 操作更快5.Push/pull 操作较慢6.工程可以用 commit 自动共享6.没有任何东西自动共享Q2. 什么是Git?我建议你先通过了解 git 的架构再来回答这个问题,如下图所示,试着解释一下这个图: Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不依赖于中央服务器来存储项目文件的所有版本。每个开发人员都可以“克隆”我在图中用“Local repository”标注的存储库的副本,并且在他的硬盘驱动器上具有项目的完整历史记录,因此当服务器中断时,你需要的所有恢复数据都在你队友的本地 Git 存储库中。还有一个中央云存储库,开发人员可以向其提交更改,并与其他团队成员进行共享,如图所示,所有协作者都在提交更改“远程存储库”。 下一组 Git 面试问题将测试你使用 Git 的体验: Q3. 在 Git 中提交的命令是什么?答案非常简单。用于写入提交的命令是 git commit -a。 现在解释一下 -a 标志, 通过在命令行上加 -a 指示 git 提交已修改的所有被跟踪文件的新内容。还要提一下,如果你是第一次需要提交新文件,可以在在 git commit -a 之前先 git add <file>。 Q4. 什么是 Git 中的“裸存储库”?你应该说明 “工作目录” 和 “裸存储库” 之间的区别。 Git 中的 “裸” 存储库只包含版本控制信息而没有工作文件(没有工作树),并且它不包含特殊的 .git 子目录。相反,它直接在主目录本身包含 .git 子目录中的所有内容,其中工作目录包括: ...

May 28, 2019 · 3 min · jiezi

JAVA面试题36

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Jedis 和 Redisson 有哪些区别 参考博客 https://blog.csdn.net/moonpur...Jedis 优点 轻量简洁支持连接池支持pipelining、事务、LUA Scripting、Redis Sentinel、Redis Cluster缺点 不支持读写分离文档支持不足Redisson 官方推荐优点 采用非阻塞IO支持异步请求支持连接池支持pipelining、LUA Scripting、Redis Sentinel、Redis Cluster支持读写分离以及读负载平衡可与Spring Session集成文档支持充足怎么保证缓存和数据库数据的一致性 先删除缓存再更新数据库Redis 持久化有几种方式 参考博客:https://blog.csdn.net/chajing...Snapshotting(快照存储,默认存储方式)Append-only file(追加写入)虚拟内存(2.4之后已desprecated)diskstoreRedis 怎么实现分布式锁 尚未了解加粗样式

May 27, 2019 · 1 min · jiezi

JAVA面试题37

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Redis 分布式锁有什么缺陷 参考博客:https://blog.csdn.net/MOVIE14...主从切换可能丢失锁信息缓存易失性Redis 淘汰策略有哪些 参考博客:https://blog.csdn.net/MOVIE14...noevicition 内存达到阈值时申请内存报错主键空间 allkeys-Iru 在主键空间中,优先移除未使用的keyallkeys-random 在主键空间中,随机移除某个key设置过期时间的键空间 volatile-Iru 优先移除最近未使用keyvolatile-random 随机移除某个keyvolatile-ttl 移除具有更早过期时间的key说一下 JVM 的主要组成部分?及其作用? 类加载器 将指定class文件加载到运行时数据区中的Method Area区运行时数据区 程序运行时使用执行引擎 将class文件指令解析成机器指令代码本地库接口 提供JAVA与底层语言C、C++接口说一下 JVM 运行时数据区? 方法区 存储已被虚拟机加载额度类信息、常量、静态变量、JIT编译后数据虚拟机栈 存储局部变量表、操作数栈、动态链接、方法出口等信息本地方法栈 为虚拟机使用的native方法服务堆 存放对象实例内部分为新生代、老年代程序计数器 当前线程执行字节码的行号指示器

May 27, 2019 · 1 min · jiezi

JAVA面试题39

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 怎么判断对象是否可以被回收 根搜索法 判断是否有finalize方法或是否进行过finalize 满足上面判断条件直接回收若不满足则进行筛选执行对象的finalize方法,判断对象是否和GC Roots是否有直接或间接关联引用计数法 每次引用计数加1回收时查看计数是否为0Java 中都有哪些引用类型 强引用 内存空间不足也不会回收软引用 内存空间不足会回收该引用弱引用 在垃圾回收期扫描时,不管内存是否不足都会回收引用虚引用 在任何时候都可能被回收说一下 JVM 有哪些垃圾回收算法 标记-清除 标记可回收对象进行清理标记整理 标记可回收对象将存活对象整理到连续内存空间,清除边界外内存复制算法 将不可回收对象复制到另一内存空间中清理原有内存空间分代收集算法 根据对象存活周期不同划分内存块垃圾回收机制根据代数不同回收对象说一下 JVM 有哪些垃圾回收器 serialparnewparallel Scavengeserial oldparallel oldcmsG1由于是初步接触JVM,所以不是很了解JVM垃圾回收器的工作原理

May 27, 2019 · 1 min · jiezi

JAVA面试题38

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 说一下堆栈的区别? 存放数据类型的不同 栈存放基本类型变量和对象的引用变量堆存放通过new关键字创建的对象和数组内存回收的不同 栈中数据超过作用域则被释放堆中数据的回收受垃圾回收机制的控制队列和栈是什么?有什么区别? 队列是FIFO的数据结构,栈是FILO的数据结构插入数据时,两者都是从尾部进行插入返回数据时,队列是返回尾部数据,栈是返回头部数据在选用基础数据结构中,因操作数据都为端口数据,建议使用链表 队列使用带头指针尾指针的链表栈选用带尾指针的链表什么是双亲委派模型 子加载器收到类加载请求后委派到父加载器加载在父加载器无法完成请求后子加载器才尝试加载说一下类加载的执行过程 加载 将class文件加载到class文件中链接 将类合并到JRE中初始化 加载并连接未被加载和连接的类中初始化未初始化的直接父类依次执行初始化语句

May 27, 2019 · 1 min · jiezi

作为一技术人员面试前都需要做哪些准备

前言面试前对目标公司,岗位要求及面试流程有所了解,这样才可以有针对性的突破,我们来看以下几个方面,相信可以帮助大家解决大部分求职迷茫的问题。 第一,常见的技术人员发展路径/和竞争要求。 第二,技术面试一般都有哪些流程? 第三,如何去选择一个高命中率的岗位? 第四,面试前要怎么准备? 第五,面试都有哪些考察点? 常见的技术人员发展路径?能谈谈你对未来的职业规划吗?相信很多人面试都被问过这个问题,技术岗和其他岗位一样,首先要有自己的职业规划,一般来说,技术人员对职业发展有两个发展方向。 技术方向管理方向这两条路径侧重的能力不同!我们需要根据自己的兴趣,能力优势,有侧重的进行能力培养。在刚入职的1-3年里,技术人员的发展路径比较单一,主要是从工程师和高级工程师发展,这个阶段主要目标是积累,夯实后续发展的基础,重点提高自己的工作基础能力,培养技术深度和广度,对不同方向的新技术保持强烈的好奇心和学习心,在一路打怪升级成为高级工程师之后。就会面临发展方向的选择,是走技术方向还是管理方向? 技术方向技术方向:资深工程师、技术专家、专家、研究员、科学家等。需要你重点培养技术攻坚能力,或疑难问题的排查,大型项目的品牌的塑造等。具体的工作包括原理实现,注重框架能力的培养,更深一层,还有大规模高并发场景业务的抽象,业务的抽象和架构能力,分布式服务设计原则的理解等。管理方向管理方向 : 管理系列偏重于团队把控,需要让团队形成基础战斗力,利用一切资源推进项目,让团队完成作战目标。另外需要做好团队内和跨团队的沟通协作,也是管理工作很重要的一环。在实际工作中这两个方向没有特别明显的边界。例如:做管理不能远离架构设计,而技术专家也不是在单兵作战,也需要带领团队。这两个方向区分点:在于工作内容的侧重点不同,到底是更偏技术架构,还是更偏管理与项目推进?回到最开始的面试问题,你的职业规划是什么? 答案并不是在面试前打个突击准备就完成任务,而是你进入职场,准备成为一名工程师,心里就该有个谱了,这里给你个面试小诀窍,也许这么回答,能加分很多。 从过往的经验来看,我对项目的整体规划管理推进比较感兴趣,协调沟通方面也有过比较突出的表现,所以我的职业规划是成为一名优秀的技术经理。对你管理方向和发展目标,面试官可能会对你的相关经历开始询问。除了有明确的职业规划,想要往高处走,还得与对应的软硬技能要求。这样你在工作的时候,就可以有意识的捕捉能力,提高水平。 BTA职位体系不同公司,不同级别的岗位,要重点提升哪些方面的技能呢?非常简单,我们来看下图。 这张简单介绍一下BAT的技术序列,岗位划分,对应的工作年限及级别,1~3年的初级工程师,这个级别的岗位在阿里,百度,腾讯等大厂,很少进行社招。通常的都是校招进去,进行人才培养。 想了解更详细的岗位等级或薪资结构,可以访问:http://mp.163.com/v2/article/... 面试岗位选择 换工作的时候,你也许遇到过这种情况,一个公司有好几个技术岗位,要全都投一遍吗?手里有多个offer,该怎么选择,是挑钱多的?还是大平台福利待遇好的? 个人建议:挑选岗位一般从公司规模,业务线或者团队的重要程度,以及个人条件的匹配度,这几个方面来入手,先来看看公司和团队,你要有一个概念,在每一份工作,都是为了下一份更好的做趋势,提高身价,核心业务更适合长期稳定发展,进入核心团队,在能力和经验上都能获得较大的成长。 剩下的两种情况,一个是大公司的边缘业务,一个是小公司的核心业务,这也是最让人头疼的选择,给你个建议,对于工作1~3年的小伙伴,我更推荐优先选择核心业务,之前我有提到职业生涯前期以积累知识经验为主要任务,核心业务可以给你更多历练场景,无论是应用经验还是架构经验,都能有更好的收获。另外一个因素就是个人匹配度,不是每个人天生都能考上北大清华考大学,大家都要估分再报志愿,职场也一个道理,首先对自己的条件有客观的评估,再对号入座,评估范围包括岗位要求,业务方向,还有自身能力,兴趣经验等匹配程度,匹配度越高,面试的成功率就会越高,也更有利于入职后个人的发展,一句话总结就是,优先选择核心业务,以及与自己条件高度匹配的岗位。 在搞清楚前面几点之后,面试流程,也是找到工作前必须了解的。如果对面试的要求都不了解,也没有进行对应的职位匹配就来了。白白浪费一次宝贵的机会。对于技术岗,大部分公司的面试流程基本差不多,总结为如下6个环节。 前置面试首先可能会有一些前置面试,例如应聘的是外地的职位,可能会先安排电话面试,大概了解候选人的情况和技术水平,还有一些公司会在正式面试前先进行笔试。因此,初次面试前一定要跟面试官沟通,是否会先进行电话面试,是否有笔试或上机编程,是否需要自带电脑,正式的面试是从技术面开始的,可能会有1~2位面试官,他们很有可能就是你入职后的同组的同事。 技术一面技术一面以考查基础能力与实际应用能力为主,时长大概一小时左右,是纯技术面,可能会要求手写一些小算法,比如排序、字符串处理之类的,这方面大家可以平时面试的前稍作准备,也可以关注公众号:Coder编程,后续会有相关文章介绍。 技术二面技术二面,主要也是以技术面为主,偏重对技术深度的考察。例如:可能对你的一些项目经历进行询问,同时可能会要求画出项目的架构图,交互流程图等,并对项目存在的问题和改进方案进行询问。一般技术二面的面试官就是你入职后的直属领导,一些规模较小的公司,技术面到二面就结束了。而大部分公司,技术面一般是半技术面,同时会有一些项目经历,架构设计题目。另外还会涉及到 职业规划职业兴趣技术试验架构能力技术敏感度发展潜力等一些信息进行考察。面试官一般是部门的领导。部分公司会存在其他部门领导,例如腾讯在较高级别岗位面试时,跨部门的交叉面试,面试内容与三面基本相同。 HR面试如果你很幸运,通过了前面几轮的技术面试,那么就进入到HR面试阶段,这个阶段之后基本不会再出现技术面试。主要沟通个人的发展规划,上家公司的离职原因,价值观和薪资待遇等。如果你对这家公司特别期待,注意不要在这个环节,因为纠结一两千块钱的工资而错失机会。工作前期以积累能力为主,三年后再来谈公司及高管的面试。具体的轮次看情况,一般1~2遍,非技术面为主,可能会简单询问工作经历。对公司的看法,对行业的看法,未来规划.只要没有原则性的错误,一般都能通过。 小结第一:面试前询问是否有电话面试,笔试,上机的潜质面试, 第二:技术面是一面二面关注实际工作能力,架构能力。在二面与三面的时候一般决定了你的去留。所以一定要好好表现。 面试前的准备工作 假设你明天就有个面试,那么前期的准备工作对面试成败起到了决定性的作用。 成功的三大基石成功的三大基石是能力,心态和沟通。 能力:优秀的技术基本功是必要条件。毕竟公司是找你来解决问题的,没有技术能力,其他的都无从谈起。心态:注重平衡心态,过于紧张会导致平时会的内容也没有答上来。沟通:与面试官顺畅的沟通,开心的交流,会给你的面试加分.反过来了,如果沟通不顺畅,就可能变成致命一刀,直接被pass掉。如何在面试时稳定发挥? 一:面试考查点是可以在短期内突击的,也是面试前需要重点准备的内容。你需要系统的复习基础知识,对工作经历进行提炼,对原来负责的项目,从架构方面重新审视梳理总结,经典框架的原理,使用场景及实现方式进行学习,对场考的考点进行专项突击,根据面试岗位业务有针对性的准备。比如面试的岗位是可以突出自己,有个存储中间件的开发经历,协议的设计理解等,当然技能方面也还有一些加分项。 二:是心态方面。搜集面试公司岗位所属团队平均福利等资料信息,知己知彼,有助于增加信心。提示一下:有些公司喜欢压力面试。特别在面试官层级较高时发生。在不利的场景下,多给自己心理暗示,控制情绪,也许会有意想不到的收获。例如:这个面试官以后我可能永远也不会遇到,失败了又怕什么呢? 三:沟通,给以下几点建议: (1)提前准备一个简短有特色的自我介绍,主要描述自己的技术特长和职业优势,一定不要聊兴趣爱好,老家星座,无关紧要的内容。 (2)避免对于回答不上来的问题,可以主动坦白,并提出解题思路,或者在询问面试官可不可以换一个问题。 (3)当没有听清,或者不理解问题时,不要强行做答,可以跟面试官再次沟通确认问题。 (4)注意细节,例如你面试的微表情,不要皱眉,控制坐姿和手势,说话语速不要过快或过慢,表达逻辑清晰,观点明确,不要随意打断面试官,谦虚有礼的态度等等。还有一个小技巧,是要注意观察面试官的反应。如果面试官突然在简历上奋笔疾书,说明你提供的信息是有用的。如果他停下来很长时间不写了,你要想想是不是跑题了,如果面试官的表情显示出不耐烦或者深呼吸,有可能你没有领会到面试官的考查意图,可以再次询问面试的考察点。 必要的硬技能与软实力能力非常重要,一般分为硬技能和软实力。 硬技能 包括基础知识的掌握,以往的项目经验,对系统架构的设计能力,以及对不同框架工具的综合应用。 软实力 包括逻辑思维是否灵活,沟通表达写作能力是否优秀,是否有较强的项目管理推进能力,新技术的学习总结与思考能力,以及培养潜力这几方面。前面BAT的职位图提到了,不同等级的岗位能力要求。这里我用雷达图来展示,首先, 中级工程师,基本的要求是能完成分配的研发任务,所以面试官更看重基础知识的掌握,逻辑思维是否灵活,有没有培养潜力,其次是项目经验,学习思考,而对于架构能力,管理推进,以及沟通协作的能力,受限于工作年限,并不会对这方面有较高的要求。 高级工程师,一般需要独立完成功能模块,或者是项目的设计和开发,所以除了初级工程师应该具备的能力外,对项目经验沟通协作,架构能力,学习思考,管理推进,都有了更高的要求,特别是项目经验和学习思考能力 技术专家,具备项目架构,项目经验与协作沟通。与协作沟通能力,能够独立负责一个项目,做好项目架构,完成功能模块的拆解和任务分配,推进团队内外部的事务,协调资源管理进度。带领技术团队完成任务目标。 提示:: 软实力,功夫做得好,对于技术工程师的职业生涯来说,绝对是加分项。硬技能图谱 对硬技能考查点,我也做了一份系统化梳理,也是非常重要的内容。 基础知识部分 分为计算机基础与Java体系两大部分,包括了进程线程的管理,TCP/HTTP等网络协议,数据结构,经典算法,常用的设计模式等,另外还会分享一些面试的加分的内容,比如新技术方面,例如,新特性,垃圾回收算法,GC,最新的网络协议HTTP2,最新的网络协议,HTTP2和QS的知识深度方面,包括内存屏障,指令重排序,编译器逃逸分析等等。 项目经验部分 如何展现自身的项目经验。包括项目的描述,项目难点,项目问题分析与改进的部分。需要兼顾知识的广度与重点框架的知识深度。包括常用的工具,常用框架数据库等几个方面。其中工具集,以知识广度与实用性为主。例如工具的的应用,框架以经典架构的常考点为主。包括spring框架的重点,缓存数据库将以应用场景为主。最后架构能力以架构介绍为主,介绍架构理念与应用场景,也包括一些重点机制的实现方式。容器方面的知识,例如docker。 文末欢迎关注微信公众号:Coder编程获取最新原创技术文章和免费学习资料,更有大量精品思维导图等你来领,方便你随时随地学习技术知识!

May 27, 2019 · 1 min · jiezi

JAVA面试题35

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Redis 为什么是单线程的? 参考博客户 https://blog.csdn.net/chenyao...Redis是基于内存的,瓶颈通常是内存大小以及带宽,与CPU没有太大联系什么是缓存穿透?怎么解决? 参考地址 https://www.jianshu.com/p/400...缓存穿透 缓存是key命中时数据写入内存的缓存穿透是指利用不存在key进行缓存查询,当缓存不存在此key则到数据库查询,当请求量级比较大时,数据库有可能宕机解决方法 在某些特定场景使用验证码布隆过滤法 利用多种HASH算法对数据标识位进行缓存Redis 支持的数据类型有哪些? string 字符串hash 散列list 列表内部使用双向链表实现访问端元素较快,通过索引访问较慢set 无序集合内部通过value为null的散列表实现zset 有序集合Redis 支持的 Java 客户端都有哪些? 参考博客 https://blog.csdn.net/moonpur...Jedis 优点 轻量简洁支持连接池支持pipelining、事务、LUA Scripting、Redis Sentinel、Redis Cluster缺点 不支持读写分离文档支持不足Redisson 官方推荐优点 采用非阻塞IO支持异步请求支持连接池支持pipelining、LUA Scripting、Redis Sentinel、Redis Cluster支持读写分离以及读负载平衡可与Spring Session集成文档支持充足lettuce 优点 线程安全支持异步请求采用非阻塞IO支持哨兵模式支持集群

May 27, 2019 · 1 min · jiezi

JS核心知识点梳理异步单线程运行机制

引言学习javascipt的时候,经常听人说,javascipt即是异步的,又是单线程的。究竟什么是异步,什么是单线程?javascript在浏览器中的运行机制是怎么样的?什么是eventloop,task queue?怎么写异步函数?相信读完这篇文章,相信你会对上面问题有一个全面的认识。 全面了解浏览器浏览器有许多进程:Browser进程:浏览器的主进程(负责协调、主控),只有一个。第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建GPU进程:最多一个,用于3D绘制等浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的)在浏览器渲染进程中有许多线程:渲染引擎线程:顾名思义,该线程负责页面的渲染JS引擎线程:负责JS的解析和执行(主线程)定时触发器线程:处理定时事件,比如setTimeout, setInterval事件触发线程:处理DOM事件异步http请求线程:处理http请求虽然JavaScript是单线程的(说的是JS引擎线程),可是浏览器内部不是单线程的。一些I/O操作、定时器的计时和事件监听(click, keydown...)等都是由浏览器提供的其他线程来完成的。主线程和渲染引擎线程互斥,因为渲染的时候主线程可能通过dom操作渲染结果,所以主线程必须被阻塞 单线程,异步判断标准之前傻傻的分不清楚单线程多线程,同步异步。其实很简单 异步的判断标准:是否阻塞,同步阻塞,异步不阻塞。 单线程的判断标准:一次是否只做一件事。 JS引擎一次只做一件事。遇到异步任务并不会阻塞后面的同步任务(不等待)。所以我们说JS是异步 单线程的。需要注意的是JS引擎其实并不提供异步的支持,异步支持主要依赖于运行环境(浏览器或Node.js)。 while阻塞实验var start = new Date(); while(new Date() - start < 100000) { // delay 10 sec ; }上面代码在chrome控制台输入可以手动阻塞当前页面的js主线程10s。然后我们在当前页面输入console.log(1),当前页面无反应,在另外的页面输入console.log(1)直接打印说明浏览器每个页面都会单独起一个进程,页面1的主线程被阻塞并不会影响影响页面2的主线程 执行机制 JS Engine和runtime Environment之前在Stackoverflow看了一个答案,感觉还比较靠谱 JavaScript Engine:parse your code and convert it to runnable commandsJavaScript Runtime Environment :provide some objects to javascript so that it can interact with the outside world.For example, the Chrome Browser and node.js use the same Engine - V8, but their Runtimes are different: in Chrome you have the window, DOM objects etc, while node gives you require, Buffers and processes.通俗的讲,上面这张图,左边你可以看成JS引擎,右边你可以看成JS运行环境 ...

May 26, 2019 · 2 min · jiezi

Leetcode130-被包围的区域

题目给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 示例: X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为: X X X XX X X XX X X XX O X X解释: 被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。 题解这道题我们拿到基本就可以确定是图的dfs、bfs遍历的题目了。题目中解释说被包围的区间不会存在于边界上,所以我们会想到边界上的o要特殊处理,只要把边界上的o特殊处理了,那么剩下的o替换成x就可以了。问题转化为,如何寻找和边界联通的o,我们需要考虑如下情况。 X X X XX O O XX X O XX O O X这时候的o是不做替换的。因为和边界是连通的。为了记录这种状态,我们把这种情况下的o换成#作为占位符,待搜索结束之后,遇到o替换为x(和边界不连通的o);遇到#,替换回o(和边界连通的o)。 如何寻找和边界联通的o? 从边界出发,对图进行dfs和bfs即可。这里简单总结下dfs和dfs。 bfs递归。可以想想二叉树中如何递归的进行层序遍历。bfs非递归。一般用队列存储。dfs递归。最常用,如二叉树的先序遍历。dfs非递归。一般用stack。那么基于上面这种想法,我们有四种方式实现。 ...

May 26, 2019 · 6 min · jiezi

我人生中的第一场Java面试

1、说起我的第一次Java面试,我不禁回想起我大学时参加校园招聘的那段日子,那时候我还是本科生,由于不是科班出身,只学过一点点Java皮毛,所以那时候对于找Java工作并没有什么概念,只是以为上过Java的课程就可以找到一份Java工作了,于是就兴高采烈地参加了一些公司的面试。 2、不过那个时候我还在复习考研,所以也没时间好好准备,于是拼凑出一份Java简历就想去面试。当时投递了几个省内还不错的公司,结果都是音讯全无,我当时还挺费解的,我不是学过Java吗,为什么连面试机会都不给我呢。当然那时候也没时间纳闷了,复习考研才是第一要务。 3、于是时间一晃到了大四,考研结束,春招到来,当时想找一份实习工作先做着,积累一些开发经验,于是就想去投几家招Java实习生的公司,当时来我们学校的公司都是一些小企业,我心想着要求应该也不会多高吧,于是“海投”了一波,送出十几份简历,结果给我面试机会的公司一家都没有,有一家公司干脆直接让我去上班,当时我一听工作内容好像和开发没有什么关系,貌似就是it维护的职位,一天给50块钱,还离学校很远,可以说是非常尴尬了。 4、就算当时我已经考上了研究生,但是对Java基本上还是入门水平,于是我不得不降低要求,直接到网上的招聘网站上投简历,什么智联、猎聘、51job,就算是在这种我现在嗤之以鼻的招聘网站,当时也找不到几个能投递的岗位,随便投了几个之后,终于有人来约面试了。 5、一开始给我电话的是中软国际,我当时还不知道这就是家外包公司,但是一看招聘要求,居然要先交钱才能上班,后来才知道这是打着招聘旗号做培训的机构,真的非常恶心。。。后来,终于又有一家小公司来联系我,让我去现场面试,公司就在本地,我打了个车过去,开始我人生中第一次真正意义上的面试。到了那个地方之后,才发现就是一间小小的办公室,有个自称面试官的人看了我的简历,然后给了我一套Java测试卷让我做,半个小时后,我把一份完成度百分之50左右的卷子交上去了,本以为挂定了,没想到这个面试官居然对我褒奖有佳,并且和我大谈人生理想,吹牛逼谁还不会啊,聊呗。 6、面试算是告一段落,面试官表示他的领导要来见见我,确认面试结果,结果那个领导一来,问了我的情况,才知道我只是来实习的,我刚说完我是想来实习的,领导脸色一沉,马上很抱歉地和我说,打扰了,你走吧!(大概就是这个意思)于是我人生第一场面试就这么折戟了。

May 25, 2019 · 1 min · jiezi

去-BAT-面试总结了这-55-道-MySQL-面试题

1、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?(1)如果表的类型是MyISAM,那么是18.因为MyISAM表会吧自增主键的最大ID记录到数据文件里,重启MysQL自增主键的最大ID也不会丢失。(2)如果表的类型是InnoDB,那么是15.InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。 2、Mysql的技术特点是什么?Mysql数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理工具。 3、Heap表是什么?HEAP表存在于内存中,用于临时高速存储。 BLOB或TEXT字段是不允许的只能使用比较运算符=,<,>,=>,= <HEAP表不支持AUTO_INCREMENT索引不可为NULL 4、Mysql服务器默认端口是什么?Mysql服务器的默认端口是3306。 5、与Oracle相比,Mysql有什么优势?Mysql是开源软件,随时可用,无需付费。Mysql是便携式的带有命令提示符的GUI。使用Mysql查询浏览器支持管理 6、如何区分FLOAT和DOUBLE?以下是FLOAT和DOUBLE的区别: 浮点数以8位精度存储在FLOAT中,并且有四个字节。浮点数存储在DOUBLE中,精度为18位,有八个字节。 7、区分CHAR_LENGTH和LENGTH?CHAR_LENGTH是字符数,而LENGTH是字节数。Latin字符的这两个数据是相同的,但是对于Unicode和其他编码,它们是不同的。 8、请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?SQL标准定义的四个隔离级别为: read uncommited :读到未提交数据read committed:脏读,不可重复读repeatable read:可重读serializable :串行事物 9、在Mysql中ENUM的用法是什么?ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。 Create table size(name ENUM('Smail,'Medium','Large'); 10、如何定义REGEXP?REGEXP是模式匹配,其中匹配模式在搜索值的任何位置。 11、CHAR和VARCHAR的区别?以下是CHAR和VARCHAR的区别: CHAR和VARCHAR类型在存储和检索方面有所不同CHAR列长度固定为创建表时声明的长度,长度值范围是1到255当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。 12、列的字符串类型可以是什么?字符串类型是: SETBLOBENUMCHARTEXTVARCHAR 13、如何获取当前的Mysql版本?SELECT VERSION();用于获取当前Mysql的版本。 14、Mysql中使用什么存储引擎?存储引擎称为表类型,数据使用各种技术存储在文件中。 技术涉及: Storage mechanismLocking levelsIndexingCapabilities and functions. 15、Mysql驱动程序是什么?以下是Mysql中可用的驱动程序: PHP驱动程序JDBC驱动程序ODBC驱动程序CWRAPPERPYTHON驱动程序PERL驱动程序RUBY驱动程序CAP11PHP驱动程序Ado.net5.mxj 16、TIMESTAMP在UPDATE CURRENT_TIMESTAMP数据类型上做什么?创建表时TIMESTAMP列用Zero更新。只要表中的其他字段发生更改,UPDATE CURRENT_TIMESTAMP修饰符就将时间戳字段更新为当前时间。 17、主键和候选键有什么区别?表格的每一行都由主键唯一标识,一个表只有一个主键。 主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。 18、如何使用Unix shell登录Mysql?我们可以通过以下命令登录: #[mysql dir]/bin/mysql -h hostname -u <UserName> -p <password> 19、 myisamchk是用来做什么的?它用来压缩MyISAM表,这减少了磁盘或内存使用。 21、如何控制HEAP表的最大尺寸?Heal表的大小可通过称为max_heap_table_size的Mysql配置变量来控制。 22、MyISAM Static和MyISAM Dynamic有什么区别?在MyISAM Static上的所有字段有固定宽度。动态MyISAM表将具有像TEXT,BLOB等字段,以适应不同长度的数据类型。点击这里有一套最全阿里面试题总结。 MyISAM Static在受损情况下更容易恢复。 23、federated表是什么?federated表,允许访问位于其他服务器数据库上的表。 24、如果一个表有一列定义为TIMESTAMP,将发生什么?每当行被更改时,时间戳字段将获取当前时间戳。 25、列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。 ...

May 24, 2019 · 2 min · jiezi

JS核心知识点梳理原型继承下

引言正如上篇所提到的,有些人认为JavaScript并不是真正的面向对象语言,在经典的面向对象语言中,您可能倾向于定义类对象,然后您可以简单地定义哪些类继承哪些类,JavaScript使用了另一套实现方式,继承的对象函数并不是通过复制而来,而是通过原型链继承(通常被称为 原型式继承 —— prototypal inheritance)。 继承的方式说到继承,首先得明白继承的是什么东西。为了方便理解,我个人把属性(包括方法)分为共有属性和私有属性。私有属性比如名字或者身份证之类的,是每个人独有的。共有属性是能共用的属性或者方法,比如爱好属性,吃饭方法。 私有属性的继承(构造函数+call)这个比较简单,私有属性用利用构造函数和call或者apply const Person = function (name) { this.name = name }const Students = function (name) { Person.call(this,name) }const xm = new Students('小明')console.log(xm) //Students {name: "小明"}公有属性的继承这里里面坑有点多,大家听我娓娓道来。通过原型链实现公有属性继承肯定没错,但是我们设计的时候有个原则 子类需要有自己的原型,父类也必须要有自己的原型,子实例在自己的原型上找不到属性的时候才会到父原型上去找子类.prototype = 父类.prototype 这样肯定不行,虽然能继承父类原型的方法,但是子类的原型和父类的原型是同一个,给子类原型添加方法的时候,相当于给父类的原型也添加了一个方法。so我们应该有一个缓冲。 子类实例---->子类原型------->中间对象------->父类原型 //沿着箭头能访问,表现上符合我们的设计原则 最常见的是使用父类的实例当这个中间对象。 Children.prototype = new Parent() 但是了这么做有个不好的地方。会实例化一次父类。如果父类特别复杂,比如axios,那么会带来很多额外的开销。 我们看一下中间对象有什么作用,实际上只起了一个隔离和原型重定向的作用。完全可以用一个空对象实现这个功能 //实现缓冲var fn = function() {}fn.prototype = Parent.prototypeChildren.prototype = new fn()实际上,这个就是Oject.create()的实现 //Oject.create()Object.create = function(obj){ var fn = funcion(){} fn.prototype = obj reurturn new fn() }终极继承解决方案现在既要继承私有属性,又要继承公有属性。 ...

May 23, 2019 · 2 min · jiezi

JS核心知识点梳理原型继承上

引言最近又攀登了一下JS三座大山中的第二座。登山过程很酸爽,一路发现了许多之前没曾注意到的美景。本着独乐乐不如众乐乐的原则,这里和大家分享一下。 JS的面试对象有些人认为 JavaScript 不是真正的面向对象的语言,比如它没有像许多面向对象的语言一样有用于创建class类的声明(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的)。JavaScript 用一种称为构建函数的特殊函数来定义对象和它们的特征。不像“经典”的面向对象的语言,从构建函数创建的新实例的特征并非全盘复制,而是通过一个叫做原形链的参考链链接过去的。同理,原型链也是实现继承的主要方式(ES6的extends只是语法糖)。 原型、原型链一直在犹豫,到底是先讲创建对象的方法还是先讲原型。为了后面保证讲创建对象方法的连贯性,这里还是先讲讲原型吧,这里为了权威,直接就摘抄MDN的定义了 JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。准确地说,这些属性和方法定义在Object的构造器函数(constructor functions)之上的prototype属性上,而非对象实例本身。 这个__proto__属性有什么用呢?在传统的 OOP 中,首先定义“类”,此后创建对象实例时,类中定义的所有属性和方法都被复制到实例中。在 JavaScript 中并不如此复制,而是在对象实例和它的构造器之间建立一个链接(它是__proto__属性,是从构造函数的prototype属性派生的),之后通过上溯原型链,在构造器中找到这些属性和方法。 简单的说,就是实例对象能通过自己的__proto__属性去访问“类”原型(prototype)上的方法和属性,类如果也是个实例,就会不断往上层类的原型去访问,直到找到 补充:1.“类”的原型有一个属性叫做constructor指向“类” 2.__proto__已被弃用,提倡使用Object.getPrototypeOf(obj) 举例: var arr = [1,2,3] //arr是一个实例对象(数组类Array的实例)arr.__proto__ === Array.prototype //true 实例上都有一个__proto__属性,指向“类”的原型Array.prototype.__proto__ === Object.prototype //true “类”的原型也是一个Object实例,那么就一定有一个__proto__属性,指向“类”object的原型这里补充一个知识点: 浏览器在在Array.prototype上内置了pop方法,在Object.prototype上内置了toString方法 上图是我画的一个原型链图 [1,2,3].pop() //3[1,2,3].toString() //'1,2,3'[1,2,3].constructor.name //"Array" [1,2,3].hehe() //[1,2,3].hehe is not a function当我们调用pop()的时候,在实例[1,2,3]上面没有找到该方法,则沿着原型链搜索"类"Array的原型,找到了pop方法并执行,同理调用toString方法的时候,在"类"Array没有找到则会继续沿原型链向上搜索"类"Object的原型,找到toString并执行。当执行hehe方法的时候,由于“类”Object的原型上并没有找到,搜索“类”Object的__proto__,由于执行null,停止搜索,报错。 注意,[1,2,3].constructor.name显示‘Array’不是说明实例上有constructor属性,而是正是因为实例上没有,所以搜索到类的原型上了,找到了constructor 类,创建对象的方法怎么创建对象,或者说怎么模拟类。这里我就不学高程一样,给大家介绍7种方法了,只讲我觉得必须掌握的。毕竟都es6 es7了,很多方法基本都用不到,有兴趣自己看高程。 利用构造函数 const Person = function (name) { this.name = name this.sayHi = function () { alert(this.name) } } const xm = new Person('小明') const zs = new Person('张三') zs.sayHi() //'张三' xm.sayHi() //'小明'缺点: 每次实例化都需要复制一遍函数到实例里面。但是不管是哪个实例,实际上sayHi都是相同的方法,没必要每次实例化的时候都复制一遍,增加额外开销。 ...

May 22, 2019 · 2 min · jiezi

JAVA面试题33

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 说一下数据库的事务隔离 事务是一系列操作,结果只有两种 操作完成操作异常,回滚造成全部操作被撤销特性 原子性。系统将事务作为一个整体。一致性。事务执行之前与执行之后系统的状态是不变的。隔离性。各事务所使用数据都是确定的值。持久性。事务操作结果被系统保存下来。隔离级别 read uncommited:读取事务未提交数据read commited:只能读取已提交数据repeatable read:允许读取同一条记录serializable:事务操作被顺序执行说一下 MySQL常用的引擎 Innodb(平常常用) 优点 提供事务支持提供行级锁和外键的约束缺点 启动较慢,占用资源较多不会保存表的行数插入偏慢MyIASM(MySQL默认) 优点 占用资源小批量插入速度快缺点 不支持外键不支持事务表可能意外损坏Memory 使用内存中内容创建表优点 访问速度快缺点 数据不持久化说一下 MySQL的行锁和表锁 行锁 对具体数据行进行锁定特点 开销大,加锁慢,会出现死锁锁定粒度最小,发生锁冲突概率最低,并发度最高表锁 对数据表进行锁定特点 开销小,加锁快,不会出现死锁锁定粒度大,发生锁冲突概率高,并发度低说一下乐观锁和悲观锁 参考地址:https://blog.csdn.net/qq_3433...乐观锁 假设别人拿到数据不会进行修改实现方法 版本号机制CAS算法缺点 ABA问题自循环开销大智能保证一个共享变量的原子操作悲观锁 假设别人拿到数据总是进行修改

May 22, 2019 · 1 min · jiezi

分享一波-RabbitMQ-面试题有答案

1、什么是rabbitmq2、为什么要使用rabbitmq3、使用rabbitmq的场景4、如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息?发送方确认模式 接收方确认机制 接收方消息确认机制 下面罗列几种特殊情况 5.如何避免消息重复投递或重复消费?6、消息基于什么传输?7、消息如何分发?8、消息怎么路由?常用的交换器主要分为一下三种 9、如何确保消息不丢失?10、使用RabbitMQ有什么好处?11、rabbitmq的集群镜像集群模式 12.mq的缺点系统可用性降低 系统复杂性提高 一致性问题 面试题答案关注微信公众号:【搜云库技术团队】 公众号微信ID:souyunku 回复关键字:MQ521 即可获取

May 21, 2019 · 1 min · jiezi

Python-后端开发面试记录

辛苦面试了好多家大小公司,在面试中也发现了自己的很多不足,也有很多的感悟,这里记录一下,为的是之后的学习与提高更有针对性。 关于刷题LeetCode 要刷,面试开始之前也知道要刷题,但是真到开始找工作了再来刷题,就有点晚了。稍微大一些的公司都会要求算法,而题目基本上跑不脱 LeetCode 的题目以及排序等各种基础排序算法。达观的面试中让手写一个 python list 实现的栈,说实话确实复习到了,开始写的时候甚至还有点窃喜。但是由于只写过一遍,所以临场紧张的情况下,就错误百出。最基础的迭代,循环以及判断。360 面试中的3、5、15、fizzbuzz 的题目就是准备不足的充分表现。刚刚查了一下这道题的写法,有两种比较好的思路,而我当时写出来的是比较丑陋的一种。虽然刷题之后写算法题,会有一种背答案的感觉,但是所有的面试者都是刷题的,刷题也是学习的一种。就像是乘法口诀表一样,当场推算虽然可以显得你很有逻辑,但是这些基础算法就应该是随手就能写的。关于面试聊天语速要慢,人一紧张就会语速加快,滔滔不绝地说就会说错,不经思考地说错。说完两句可以观察对方反应,多与对方互动。由于期待面试官给自己反馈,所以在刚开始面试的时候,会倾向于用不太确定的口气回答问题,期待对方的反馈。其实大部分面试官都不会给什么反馈,只是机械地听答案,记录评价。所以回答问题要斩钉截铁,要有自信,简单明了即可。关于职业规划很多面试,尤其是二面三面,都会聊到职业规划的问题,自己在这方面确实没有很多准备,也不知道他们希望听到什么样的答案,他们自己的职业规划是什么样的,我自己应该说自己有什么样的规划。网上面试题网上面试题目确实是应该刷一遍,并且应该把细节搞清楚,搞熟练。比如 URL 访问的全部流程,越详细越好。自己虽然知道这题怎么说,但是总感觉说的没有层次,也不够细致。应该把层次说好,把细节说的细致,这样超出面试官的预期,就没问题了。NGINX深入理解 nginx 这本书确实看了一遍,但是很多面试官并没有深入去看或者了解这一块的内容,造成的结果就是他们会避免深入问这一块,就无法展示自己准备的内容。redis rabbitmq 等内容,不需要彻底明白,只需要把基本原理搞明白,最好是能够熟练使用的基础上,更深入地了解多一些的细节和原理。毕竟时间有限,广度优先,那么单一技术就不可能问的太深入。而如果某个技术自己完全不会,就会马上留下不好的印象。

May 21, 2019 · 1 min · jiezi

ES6面试常见ES6问题集锦14

通过对ES6系列文章的学习,相信大家对ES6已结有一定程度的了解。 所以本节的目的在于通过测试,便于让大家了解在学习中的知识掌握情况,查缺补漏,一步一个脚印。 1、选择题 1.1 下面不属于关键字let的特点的是:( ) A、只在 let 命令所在的代码块内有效 B、会产生变量提升现象 C、同一个作用域,不能重复声明同一个变量 D、不能在函数内部重新声明参数 答案:B 解析:使用var关键字才会产生变量提升的现象。关键字let不会产生变量提升现象,所以必须先声明定义后使用,否则程序抛出异常。 1.2 关于定义常量的关键字const,定义一个Object对象{“name”:”Jack”},再对属性name 的值进行修改,如:obj.name = “John”。下列说法正确的:() A、修改常量,程序跑出异常 B、程序不抛出异常,修改无效 C、修改成功,name的值为John D、程序不抛出异常,name的值为undefined 答案:C 解析:用const来声明一个对象类型的常量,就是传址赋值。而不可修改的是对象在内存中的地址,而不是对象本身。所以修改name并不是修改对象的内存地址,所以可以成功修改。 1.3 在对象的解构赋值中,var {a,b,c} = { “c”:10, ”b”:9, ”a”:8 } 结果中,a、b、c的值分别是:() A、10 9 8 B、8 9 10 C、undefined 9 undefined D、null 9 null 答案:B 解析:对象的解构赋值不会受到属性的排列次序影响。 1.4 关于模板字符串,下列说法不正确的是:() A、使用反引号标识 B、插入变量的时候使用${ } C、所有的空格和缩进都会被保留在输出中 D、${ }中的表达式不能是函数的调用 答案:D 解析:${ }中可以放任意的JavaScript表达式,包括运算表达式、对象属性、函数调用等。 1.5 关于字符串扩展的新函数,下面描述错误的是:() A、includes函数用于判断字符串中是否含有指定的子字符串 B、repeat函数将目标字符串重复N次,目标字符串被修改 C、startsWidth函数判断指定的子字符串是否出现在目标字符串头部位置 D、endWidth函数判断指定的子字符串是否出现在目标字符串尾部位置 答案:B 解析:repeat函数将目标字符串重复N次,会返回一个新的字符串,不影响目标字符串。 1.6 数组扩展的fill( )函数,[1,2,3].fill(4)的结果是:() ...

May 18, 2019 · 2 min · jiezi

JAVA面试题30

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Mybatis 有哪些执行器(Executor)? SimpleExecutor 只允许执行update或select语句每执行一次Statement对象都销毁该对象ReuseExecutor 执行update或select语句Statement对象复用,存储在Map内BatchExecutor 执行update语句批处理update语句选择默认Executor 在config文件中通过defaultExecutorType参数指定创建SqlSession传递ExecutorType参数Mybatis 分页插件的实现原理是什么? 暂未了解Mybatis 如何编写一个自定义插件? 暂未了解数据库的三范式是什么? 一范式 列的原子性应用:主键二范式 所有非主键完全依赖主键,不能产生部分依赖应用:外键三范式 非主键字段与主键字段不能产生传递依赖

May 18, 2019 · 1 min · jiezi

JS核心知识点梳理上下文作用域闭包this上

引言满满的干货,面试必bei系列,参考大量资料,并集合自己的理解以及相关的面试题,对JS核心知识点中的作用域、闭包、this、上下文进行了梳理。由于篇幅有限,这里只对我认为最重要的知识做了介绍,一些常识性的东西大家可以参考高程。 上下文(execution context)又叫执行环境,环境。 执行环境定义了变量或者环境有权访问的其他数据,据定了它们的各自行为 --高程一个函数执行的时候,会产生一个属于自己的执行环境。环境里面有一个变量对象variable object(VO),OA里面存放着环境中定义的所有变量和函数,作用域链(scope chain),this。函数执行,环境产生被推入环境栈,函数执行完,环境出栈并被销毁(闭包例外),把控制权返回给之前的执行环境。 作用域js中的作用域是静态作用域,静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。--wiki作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。--你不知道的javascript作用域就是执行的时候,给环境变量赋值的一种规则,这种规则在函数定义的时候就已经确定了,和运行无关。js只有全局作用域和函数作用域,没有块作用域。 变量提升我们把定一个变量的行为分为两个过程,声明和定义 var a = 1//实际执行的是下面两步var a a = 1var的变量声明会提升,没有var就是全局变量,let没,const有变量提升var的函数声明和赋值都提升 a //undefined 因为a的声明已经提升到最上面了var a = 1f() //alert 1function f () { alert (1)}有几个特殊的地方虽然平时不会这么写,但是面试题会遇到: 函数体中,return后面的代码不进行变量提升,但是return下面的代码要进行变量提升不管条件是否成立,都要进行变量提升;匿名函数不进行 变量提升;如果变量名字发生重复,那么不再重复声明,但是要重新定义;执行环境和作用域的关系很多人都分不清楚执行环境和作用域的关系。其实很简单,作用域和上下文完全是两个不相干的东西。作用域是一种规格,声明函数的时候就已经确定了。执行环境是函数执行的时候产生的,函数在执行环境中执行。大家看下面例子 alert(a) //a is not defined执行的时候VO里面没有a,因为根据VO作用域链【windows】,按照规则找不到a。 var a = 1alert(a) // alert 1执行的时候,根据规则,从VO作用域链【windows】头部window作用域开始找a,找到a了,a为1,则vo中a设置为1,所以alert 1 var a = 1function foo() { var a = 100 alert(a) }foo() // alert 100执行的时候,根据规则,从VO作用域链【windows-foo】头部foo作用域开始找a,找到a了,a为100,则vo中a设置为100,所以alert 100 var a = 1function foo() { alert(a) }foo() // alert 100执行的时候,根据规则,从VO作用域链【windows-foo】头部foo作用域开始找,没找到a。根据规则,沿上层作用域(也就是window)开始找,找到a了,aw为1。则vo中a设置为1,所以alert 1 ...

May 18, 2019 · 1 min · jiezi

JAVA面试题29

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Mybatis 逻辑分页和物理分页的区别是什么? 分页是为了节省网络传输的数据量逻辑分页是将数据全部加载到内存,再通过后端逻辑控制分页显示到前端物理分页是在数据库层面分部分获取数据,通常情况下对内存的压力较逻辑分页少Mybatis 是否支持延迟加载?延迟加载的原理是什么? Mybatis支持延迟加载打开方式 在config文件中打开延迟加载的开关(<setting name="lazyLoadingEnabled" value="true"/>)将积极加载改为延迟加载(<setting name="aggressiveLazyLoading" value="false"/>)延迟加载原理 多表关联查询只查询当前表的数据当需要查询关联表的数据时才二次查询关联表的数据说一下 Mybatis 的一级缓存和二级缓存? 一级缓存是在SqlSession上实现的(默认) 一次查询时,SqlSession查询数据库,并将数据缓存二次查询时,SqlSession查询缓存当使用该SqlSession执行DML操作时,缓存失效二级缓存是在Mapper上实现的 一次查询时,数据缓存在Mapper上使用相同/不同SqlSession查询时,返回Mapper层面的缓存同样,当出现DML语句时,缓存失效Mybatis 和 Hibernate 的区别有哪些? 参考地址:https://blog.csdn.net/wangpen...Hibernate全自动,MyBatis半自动 Hibernate通过对象关系模型实现对数据库操作,自动生成sqlMyBatis只有基本的字段映射,需要手写sqlHibernate移植性比MyBatis好 Hibernate通过对象关系模型生成sql,因此能根据数据库不同生成相应的sqlMyBatis手写sql,所以会出现sql语法不支持的情况Hibernate日志系统比MyBatis完善MyBatis比Hibernate需要关注更多细节 MyBatis需要自定义的东西比Hibernate多,因此需要关心更多细节MyBatis在优化sql上比Hibernate方便 MyBatis需要手写sql,所以优化sql语句比较方便Hibernate通过对象关系模型生成sql,所以直接优化sql比较麻烦Hibernate的二级缓存机制比MyBatis完善

May 18, 2019 · 1 min · jiezi

JAVA面试题27

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 为什么要用 Spring Boot? Spring Boot是对Spring以及Sping MVC进一步封装的轻量级框架Spring Boot是快速启动Spring项目的一个工具,能被任意项目的构建系统使用使用注解以及配置文件取代传统使用xml文件的开发框架Spring Boot 核心配置文件是什么? application.yml若需要分为生产环境跟开发环境等等,可以拆分资源文件并在application.yml中使用属性spring.profiles.active指定Spring Boot 配置文件有哪几种类型?它们有什么区别? 分类 ymlproperties区别 yml文件中key的各部分可以复用,以缩进表示层级关系Spring Boot 有哪些方式可以实现热部署? Spring Loaded 启动方式 添加maven依赖添加启动参数不能使用情况 注解的修改配置文件的改变log4j配置文件的改变spring-boot-devtools 启动方式 添加maven依赖JRebel插件

May 16, 2019 · 1 min · jiezi

JAVA面试题26

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Spring MVC 有哪些组件? HandlerMapping 决定使用哪个Handler处理请求HandlerAdapter 将Handler灵活交给Servlet处理HandlerExceptionResolver 处理请求发生的异常情况ViewResolver 将String类型的视图名和Locale解析成View类型的视图RequestToViewNameTranslator 设置request到ViewName的映射规则LocaleResolver 从request解析成LocaleThemeResolver 解析主题MultipartResolver 处理上传请求FlashMapManager 管理FlashMap@RequestMapping 的作用是什么? 处理请求地址映射响应请求接收request参数@Autowired 的作用是什么? 将对象注入到变量中属性 no:不采用AutowiredbyName:通过指定name注入beanbyType:通过类型注入bean,若该接口有多个实现类需指定首选类,否则会出现异常constructor:通过构造函数参数注入beandefault:采用父类(default-autowire)配置什么是 Spring Boot? 是对Spring以及Sping MVC进一步封装的轻量级框架是快速启动Spring项目的一个工具,能被任意项目的构建系统使用使用注解以及配置文件取代传统使用xml文件的开发框架

May 15, 2019 · 1 min · jiezi

面试必背系列正则上

正则引言正则是一个前端必须掌握的知识。但是由于用的少,忘了记,记了忘,导致面试经常坐蜡。这里上篇先介绍正则的规则,下篇结合一些具体题目,带大家重新学习巩固一下正则,争取面试给自己加分。 简介介绍:用来处理字符串的一个规则正则:判断一个字符串是否符合我们的规则-> reg.test(str)捕获:把字符串中符合我们规矩的子字符捕获到 ->reg.exec(str) 规则生成正则的两种方式实例创建和使用字面量,但是要注意使用实例创建正式是可以使用变量进行拼接的 正则表达式由两种基本字符类型组成,原义文本字符和元字符 元字符:在正则表达式中具有特殊意义的字符,原义字符变元字符加''元字符分类边界类^ 开头 $ 结尾 b 单词边界 B非单词边界/\bengineer$/.test('I am an engineer') //true量词类*: 零次到多次 +:1次到多次?: 0次或者1次{n} 出现n次{n,m} 出现n次到m次 let reg = /1\d{10}$/ //验证手机号,第一位是1范围类[a-z] a-z之间的任何一个字符[a-zA-Z] a-z以及A-Z之间的任何一个字符'a1b2C3C4'.replace(/[a-z]/g,'Q') //"Q1Q2C3C4"字符类x|y :x或y中的一个[xyz]: x或者y或者z中的一个[^a-z] 除了a-z以外的任何一个字符[^xyz] 除了xyz以外的任何一个字符预定义类// . 除了回车和换行的所有字符 [^\r\n]// \d 数字 [0-9]// \s 空白字符 [\t\n\x0B\f\r]// \w 单词 字符[A-Za-z0-9_] //注意,.的范围要比\W范围大,因为它还包括制表符之类的`注意只是一个字符而不是一个单词`'hello'.replace(/\w{2}$/g,'x') //helx修饰符以及正则对象属性修饰符: i 忽略大小写g 全局匹配m 多行匹配注意这里设置了,在正则对象里的相应属性会改变var a = /\d/ga.global //truevar b = /\d/b.global //false正则对象属性: global ignore case multiline lastIndex sourse注意,lastindex在全局匹配里面会匹配一次改变一个,超出匹配范围会被清零var reg1 = /\w/var reg2 = /\w/greg1.test('a') //true //reg1.lastIndex //0reg1.test('a') //true //reg1.lastIndex //0reg1.test('a') //true //reg1.lastIndex //0reg2.test('a') //true //reg2.lastIndex //1reg2.test('a') //false //reg2.lastIndex //0reg2.test('a') //true //reg2.lastIndex //1reg2.test('a') //false //reg2.lastIndex //0贪婪模式和非贪婪模式正则默认是贪婪模式,会按尽可能多的匹配,在量词后面加?可以取消贪婪性 ...

May 14, 2019 · 1 min · jiezi

面试必背系列正则下

正则引言正则是一个前端必须掌握的知识。但是由于用的少,忘了记,记了忘,导致面试经常坐蜡。这里上篇先介绍正则的规则,下篇结合一些具体题目,带大家重新学习巩固一下正则,争取面试给自己加分。 面试题实战1. 匹配汉字let regx = /^[\u4e00-\u9fa5]{0,}$/2. 中国真实姓名 let reg = /^[\u4e00-\u9fa5]{2,4}$/3. 字符串去重把aaabbbccc变成abc思路1,转换成数组,利用set去重,再join思路2,正则(有局限性,必须是重复元素挨一起的,且不是这种镶嵌的'abac') let a = 'aabbbccc'let b = a.replace(/(\S)\1+/g,function (res) { //这里\1指的是第一个分组 return res[0]})console.log(b) //'abc'4.转驼峰var s1 = "get-element-by-id"; 给定这样一个连字符串,写一个function转换为驼峰命名法形式的字符串 getElementById let a = 'get-element-by-id' // 这个题目如果想分割单词是比较麻烦的 let f = function(s) { return s.replace(/-\w/g, function(x) { return x.slice(1).toUpperCase(); }) } console.log(f(a)) //getElementById5. 日期格式化2017-05-11转换成5/11/2017 let a = '2017-05-11'let reg = /(\d{4})-(\d{2})-(\d{2})/gb=a.replace(reg,function (res, g1, g2, g3) { return `${g2.slice(1)}/${g3}/${g1}`})console.log(b) //5/11/20176. JS实现千位分隔符 var a = '1234567' var reg = /\d{1,3}(?=(\d{3})+$)/g var b = a.replace(reg,function (res,group,index) { //如果有?的话分组指的是最后一个 console.log(res,group,index) //所以group永远是4,5,6 return res + ',' }) console.log(b) //1,234,5677. 获取 url 中的参数let url = 'www.baidu.com?age=11&name=fyy'let reg = /([^?&=]+)=([^?&=]+)/gvar obj = {}url.replace(reg,function(){ obj[arguments[1]] = obj[arguments[2]]})console.log(obj)8. 验证身份证号身份证号码可能为15位或18位,15位为全数字,18位中前17位为数字,最后一位为数字或者X ...

May 14, 2019 · 2 min · jiezi

SpringSpring相关面试题总结

Spring是什么 Spring是一个一站式轻量级的开源框架Spring Bean的三种配置方式:xml、注解和Java @Configurationpublic class BeanConfig { @Bean public BeanFactory beanFactory(){ return new BeanFactoryImpl(); }}Spring的核心: 控制反转(IoC)和面向切面(AOP)Spring中AOP动态代理的两种实现方式: JDK动态代理和CGLIB动态代理Spring的优点: Spring将对象之间的依赖关系交由框架处理,减低组件的耦合性;Spring对于主流的应用框架提供了非常方便的集成支持;Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付;Spring框架设计精妙,Spring源码是经典的学习范例Spring的七大组成模块: Spring Core:核心类库,提供IOC服务;Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);Spring AOP:AOP服务;Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;Spring ORM:对现有的ORM框架的支持;Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;Spring MVC:提供面向Web应用的Model-View-Controller实现Spring事务的实现方式和实现原理: Spring事务的本质其实就是数据库对事务的支持没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。

May 14, 2019 · 1 min · jiezi

JAVA面试题25

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Spring 自动装配 Bean 有哪些方式? no:不使用自动装配byName:通过属性名称name自动装配byType:通过属性类型装配constructor:与byType类似,但会使用构造参数autodetect:首先使用constructor,无效后使用byType本人偏向使用java自带注释@Resource,在重构代码会比较方便Spring 事务实现方式有哪些? 编程式事务管理。通过手动控制事务的开启与关闭实现。使用AOP配置事务基于TransactionProxyFactoryBean的声明式事务管理基于 @Transactional的声明式事务管理(推荐)说一下 Spring 的事务隔离? 事务是一系列操作,结果只有两种 操作完成操作异常,回滚造成全部操作被撤销特性 原子性。系统将事务作为一个整体。一致性。事务执行之前与执行之后系统的状态是不变的。隔离性。各事务所使用数据都是确定的值。持久性。事务操作结果被系统保存下来。隔离级别 read uncommited:读取事务未提交数据read commited:只能读取已提交数据repeatable read:允许读取同一条记录serializable:事务操作被顺序执行说一下 Spring MVC 运行流程? 网络请求首先到达DispatcherServlet,由DispatcherServlet分发到Controller在分发到Controller前,可能存在Filter过滤Controller根据url响应分发请求,并调用Service处理请求Service进行业务逻辑处理,并在需要数据库操作时调用Dao进行操作Service得到Dao返回结果,进行处理后返回到ControllerController将Service返回结果进行处理,并将结果包装成视图返回到DispatcherServletDispatcherServlet将视图传递到视图渲染器渲染视图渲染器渲染视图,返回页面到前台

May 13, 2019 · 1 min · jiezi

JAVA面试题22

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Get和 Post 请求有哪些区别? Get方法不改变数据库状态,POST会改变数据库状态回退页面/刷新时,Get不会再提交数据,Post会再次提交数据Get能被客户端缓存或保存,Post不能Get的数据长度受url限制,Post数据放在requestBody上,不受url限制如何实现跨域? 参考博客:https://blog.csdn.net/ligang2...图片ping或script标签跨域JSONP跨域CORSwindow.name+iframewindow.postMessage()修改document.domain跨子域WebSocket代理说一下 JSONP 实现原理? 尚未接触说一下你熟悉的设计模式? 代理模式。程序调用子模块通过代理实现观察者模式(观察者角度) 主动式 观察者持有主题的引用主题发布更新,并通知观察者观察者调用主题成员方法获取更新被动式 主题持有观察者列表主题发布更新,并循环列表向观察者发布更新内容单件模式 当前类在系统中只有一个对象利用volatile以及synchronized保证多线程下的安全策略模式 将实体属性与行为分开行为通过接口注入的形式注入到实体中

May 12, 2019 · 1 min · jiezi

JAVA面试题23

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 简单工厂和抽象工厂有什么区别? 简单工厂面向具体实体,抽象工厂面向多个实体简单工厂通过继承抽象工厂,重写相应方法生成产品为什么要使用 Spring? Spring提供了良好的IOC以及AOP支持Spring管理bean的生命周期Spring提供一个接入其他框架的容器,能自由配置使用其他框架Spring所需的资源开销很小Spring中对象不依赖于具体实体类解释一下什么是 AOP? AOP为面向切面编程,能通过AOP对程序执行流程进行控制解释一下什么是 IOC? IOC为控制反转机制/依赖倒置机制的简称核心思想:工厂模式,面向接口编程通过对象工厂生成对应对象,并可以将属性值植入到对象中高层对象不再依赖于低层对象的实现

May 12, 2019 · 1 min · jiezi

JAVA面试题24

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Spring 有哪些主要模块? Spring Core Spring核心库主要实现IOCAOP 提供拦截器功能供用户控制程序流程ORM 提供对常用的ORM框架的支持,如Hibernate,MyBatis对ORM框架进行封装和管理DAO 提供对JDBC的支持WEB 提供对常见WEB框架的支持,如Strtus,JSFContext 提供访问Bean的接口MVC 提供对程序分层的支持Spring 常用的注入方式有哪些? @AutoWired,自动装配构造器注入setter注入静态工厂注入实例工厂注入Spring 中的 Bean 是线程安全的吗? 不一定,视乎对象作用域Spring 支持几种 Bean 的作用域? singleton:唯一实例prototype:每次申请返回新的实例request:当前request有效session:当前session有效globalSession

May 12, 2019 · 1 min · jiezi

JAVA面试题18

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 如果客户端禁止 Cookie 能实现 Session 还能用吗? 可以用,通过url重写添加后缀的方法进行Cookie的传输Spring MVC 和 Struts 的区别是什么? SpringMVC执行过程 请求通过DispatcherServlet分发到各ControllerController调用下层模块完成请求逻辑后将数据加载到视图中返回到DispatcherServlet,由DispatcherServlet通过视图解析器返回视图到客户端Strtus执行过程(暂无接触,感兴趣可以自行百度)区别 Strtus采用Servlet/JSP技术,利用MVC的设计模式构建网站Spring MVC采用多层分解结构,利用DispatcherServlet分发请求实现请求的响应,其前端支持多种技术。Strtus为类级拦截,Spring为方法级拦截Strtus有自己的拦截机制,Spring则采用AOP实现拦截Spring开发效率比Strtus高如何避免 SQL 注入? 前台过滤含可能造成SQL注入的字符的字符串后台再次过滤字符串,并对字符串的特征进行匹配(正则表达式)数据库操作执行采用PreparedStatement(根本措施)什么是 XSS 攻击,如何避免? 参考博客:https://blog.csdn.net/lamp_ya...XSS为跨站脚本攻击,原理是通过插入恶意脚本到WEB页面达到恶意攻击用户的目的避免 前台对输入信息进行过滤前台过滤后台传回的视图数据

May 12, 2019 · 1 min · jiezi

JAVA面试题19

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 什么是 CSRF 攻击,如何避免? 参考博客:https://blog.csdn.net/lamp_ya...CSRF为跨站请求伪造,利用非法获取系统信任用户Cookie进行跨站攻击避免 验证HTTP Refer字段在请求地址添加Token并验证在HTTP头自定义属性并验证throw 和 throws 的区别? throw为语句级抛出异常,throws为方法级抛出异常throw不可以单独使用,throws可以final、finally、finalize 有什么区别? final为不可变修饰词,用于声明属性,方法或类不可变finally为异常捕获机制一部分,总是会被执行。若try或catch有return语句,finally早于此return语句执行finalize为Object方法,调用此方法可以实现资源的回收,但是回收时间由JVM决定try-catch-finally 中哪个部分可以省略? catch和finally可以省略,但不能同时省略在java 7新增了一个语法try(){},该书写可以实现自动的资源的初始化以及回收

May 12, 2019 · 1 min · jiezi

JAVA面试题20

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? finally会早于return语句执行,假如finally含有return语句,则会执行finally语句的return,catch中的return会被忽略常见的异常类有哪些? 参考博客:http://www.cnblogs.com/ITtang...JAVA异常类都处于java.lang包中NullPointerException:空指针异常(相信很多人都经历过),调用未初始化或不存在对象时抛出ClassNotFoundException:指定类不存在,程序试图引用不存在类时抛出NumberFormatException:字符串转换数字异常,当试图将不符合数字类型的字符串转换成数字时抛出IndexOutOfBoundsException:数组越界,访问索引超出数组长度时抛出IllegalArgumentException:参数传递错误IllegalAccessException:权限没有达到系统要求ArithmeticException:算术运算异常ClassCastException:对象转换异常,多出现于向下转型FileNotFoundException:未找到文件异常ArrayStoreException:数组存储异常NoSuchMethodException:方法不存在NoSuchFieldException:域不存在EOFException:文件或流终止异常InstantiationException:实例化异常InterruptedException:线程被终止异常CloneNotSupportedException:不允许克隆OutOfMemoryException:内存不足NoClassDefFoundException:类定义不存在IOException:IO异常SQLException:数据库操作异常HTTP 响应码 301 和 302 代表的是什么?有什么区别? 参考:菜鸟教程301:永久移动。请求资源被永久移动到新url302:临时移动。请求资源暂时被移动,客户端保持原有url区别 url不一致。301为新url,302为原url资源是否永远被移动。301为永远被移动,302为暂时被移动Forward 和 Redirect 的区别? Forward为转发到新页面,由客户端决定,url不变Redirect为重定向新页面,由服务器端决定,url改变

May 12, 2019 · 1 min · jiezi

JAVA面试题21

    本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... 简述 TCP 和 UDP 的区别? 参考博客:https://blog.51cto.com/feinib...TCP面向连接,UDP面向非连接TCP传输可靠,经过三次握手进行确定,主要传输状态信息;UDP传输不可靠,主要传输大数据TCP传输数据中含有段标号等信息,UDP没有TCP传输较UDP慢TCP 为什么要三次握手,两次不行吗?为什么? TCP三次握手目的是为了连接服务器指定端口,建立TCP连接,同步双方序列号和确定号,交换TCP窗口大小信息两次握手只能让发送方确定已与接收方建立连接,而接收方不能确定是否与发送方连接正常说一下 TCP 粘包是怎么产生的? TCP通过流传输数据包,数据包间隔时间可能很短,造成前包尾部与后包头部粘合发送方等待缓冲区满才发送数据,接收方没有及时接收数据包解决措施 通过编程解决。当一次数据包完成后,立即通过TCP的push指令发出通过优化程序设计,使接收方及时接收数据将数据包按数据字段,人为控制多此接收然后合并OSI 的七层模型都有哪些? 参考博客:https://blog.csdn.net/yaopeng...物理层数据链路层网络层传输层会话层表示层应用层

May 12, 2019 · 1 min · jiezi

吐血整理-Java开发-大厂面试

这是我今年从三月份开始,主要的大厂面试经过,有些企业面试的还没来得及整理,可能有些没有带答案就发出来了,还请各位先思考如果是你怎么回答面试官?这篇文章会持续更新,请各位持续关注,希望对你有所帮助! 平安产险面试(电话面试) 深圳先通过邮件发了一份线上测评(EQ+IQ), 做完达到要求后才能有后续的面试机会,没有通过两年之内不能进平安任何一家公司。 一面自我介绍看我工作时间不长,问我为什么频繁跳槽(间接问离职原因)关注过平安哪些架构?我就说了军哥的pass平台 解释下什么是用户态和内核态?两者有什么区别?内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。其他的都属于用户态。 用户程序运行在用户态,操作系统运行在内核态(操作系统内核运行在内核态,而服务器运行在用户态)。用户态不能干扰内核态.所以CPU指令就有两种,特权指令和非特权指令.不同的状态对应不同的指令。特权指令:只能由操作系统内核部分使用,不允许用户直接使用的指令。 如:I/O指令、置终端屏蔽指令、清内存、建存储保护、设置时钟指令(这几种记好,属于内核态)。非特权指令:所有程序均可直接使用。 所以: 系统态(核心态、特态、管态):执行全部指令。 用户态(常态、目态):执行非特权指令。 用户态和内核态的理解和区别 用过Spring boot哪些版本?新版本相对于旧版本有哪些改变?https://github.com/spring-projects/spring-boot/wiki web.xml中DispatcherServlet的作用?Spring MVC中的DispatcherServlet作用 DispatcherServlet过程详解 讲下web.xml中Filter类(过滤器)web.xml中的配置,servlet,filter,listener的作用和原理 使用Spring boot以后,与之前系统的配置方式区别方面?(Spring boot 和 Spring MVC 使用和配置上的区别?)SpringBoot - 注册Servlet、Filter和Listener(代码和注解两种方式) spring boot与spring mvc的区别是什么? 好像还有个reactivity什么的,当时记不清了。你们如果面试碰到了相关经典题目。欢迎补充! 二面整理中 飞猪面试(电话面试) 杭州首先这个面试机会是来自于内推,当然内推的人和我一面的面试官都是同一个人,所以 嘿嘿嘿 你懂得... 一面自我介绍介绍一下你这边最熟悉的项目?在开发过程中印象最深刻地方?Springboot 2.0.0和Springboot 1.5.6的区别?https://github.com/spring-projects/spring-boot/wiki 有没有看过Springboot的源码?(很尴尬,没有研究过)https://github.com/spring-projects/spring-boot Springboot中遇到的一些坑及解决方法?Springboot与shiro整合遇到的坑 有没有看过Spring的源码?(很尴尬,了解过)https://github.com/spring/spring 你现在对Dubbo了解得怎么样?(作为这个项目的贡献者,没有深入阅读源码和实践真的是汗颜)https://github.com/apache/incubator-dubbo 30 道 Dubbo 面试题及答案 JDK 1.9 的新特性?(我说:没有用过1.9,感觉1.9不是很稳定,只用过1.8)那说一下 1.8 有哪些新特性?jdk8, jdk8u, jdk9, jdk10的侧重和区别是什么? JDK 9新特性汇总 JDK1.8新特性(持续更新) JDK有哪些实现代理方法?JDK动态代理和CGlib动态代理有什么区别?深入理解静态代理与JDK动态代理 JDK动态代理与CGLib动态代理相关问题 介绍下OOM?开发过程中遇到过哪些OOM,怎样解决的?OutOfMemoryError,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严重到不足以被应用处理)。 JVM 发生 OOM 的 8 种原因、及解决办法 ...

May 12, 2019 · 2 min · jiezi

Leetcode120三角形最小路径和

题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。 题解这道题目和之前A过的杨辉三角差不多,一看就是动态规划。动态规划最主要的是确定状态表达式。而要求在o(n)的空间复杂度来解决这个问题,最主要的是要想清楚,更新状态的时候,不破坏下一次计算需要用到的状态。我们采用"bottom-up"的动态规划方法来解本题。 状态表达式为:dp[j] = min(dp[j], dp[j+1]) + triangle[j]; class Solution { public int minimumTotal(List<List<Integer>> triangle) { int row = triangle.size(); List<Integer> res = new LinkedList<>(triangle.get(row - 1)); for (int i = row - 2; i >= 0; i--) { List<Integer> currentRow = triangle.get(i); for (int j = 0; j < currentRow.size(); j++) { res.set(j, Math.min(res.get(j), res.get(j + 1)) + currentRow.get(j)); } } return res.get(0); }}热门阅读百度社招面试题——Redis实现分布式锁【Leetcode】114. 二叉树展开为链表社招面试总结——算法题篇Redis中的集合类型是怎么实现的? ...

May 12, 2019 · 1 min · jiezi

JAVA面试题16

为什么要使用克隆? 克隆对象可能包括已经修改过的属性,new出来的对象属性都还是初始化的值。若直接利用指针指向原有对象,改变原对象的属性值时,指针所指对象的值也会改变clone复制的对象与原对象是相互独立存在如何实现对象克隆? 克隆主要分为浅克隆和深克隆步骤 被复制类需实现Clonenable接口重写clone方法,访问修饰符设为public,方法中调用调用super.clone获取复制对象深拷贝和浅拷贝区别是什么? 两者都能生成与原对象独立的克隆对象若类中含有引用对象,浅拷贝不能生成独立存在的引用变量,深拷贝可以深拷贝不能从根本上解决链式克隆的问题。类中若含有较多引用变量,则应该通过序列化和反序列化实现对象的真正克隆JSP 和 Servlet 有什么区别? JSP是前端页面,带有后端接口引用;Servlet是运行在后端的小程序JSP通常作为View层负责用户交互,Servlet通常作为Controller负责前端与Java bean之间的交互以及页面的控制JSP侧重于视图,Servlet侧重于逻辑JSP是Servlet的扩展,JSP编译后实际上是Servlet

May 11, 2019 · 1 min · jiezi

JAVA面试题17

本文首发于cartoon的博客 JSP 有哪些内置对象?作用分别是什么? request:客户端请求,包括get/post的参数response:服务器端传回客户端的回应pageContext:管理网页属性session:存在于服务器端的客户端有关信息application:系统全局资源共享page:JSP本身config:存放JSP编译后初始数据exception:页面运行产生的异常和错误信息out:服务器端输出到客户端的结果说一下 JSP 的 4 种作用域? pageContext:当前页面requeContext:单次请求sessionContext:当前会话applicationContext:用户共享资源Session 和 Cookie 有什么区别? Session存在于服务器端,Cookie存在于客户端Cookie只能存放ASCII字符串,Session能够存放任何JAVA对象Cookie安全性较低,有可能被修改达到非法访问。Session则没有被修改的风险Cookie可以长期有效,Session关闭网站后会失效Cookie需要客户端支持Cookie可以跨域名访问,Session被限制在当前域名说一下 Session 的工作原理? Session依赖于名为JSESSIONID的CookieSession利用近似散列表结构存储在服务器上创建Session时,系统检索请求是否带有名为SESSION ID的Cookie,若带有则直接查找内存中对应Session,若不存在则服务器生成Session,并返回与该Session相关的SESSION ID使用Session时,服务器检索内存与SESSION ID相关的Session;若浏览器Cookie被禁止,则通过URL重写传输SESSION ID

May 11, 2019 · 1 min · jiezi

前端刷题笔记02字节跳动2019面试题

1、TCP的三次握手和四次挥手1.1 三次握手:客户端请求 -> 服务器响应 -> 客户端确认收到响应,建立连接(保证网络正常) 1.2 四次挥手客户端请求 -> 服务器响应该请求 -> 服务器确认数据传送完毕, 发送关闭连接的响应 -> 客户端发送响应,在2MSL内未收到回复则视为服务器端已收到该响应并关闭连接接口,客户端关闭连接。 1.3 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。 2、TCP和UDP的区别、比较 UDPTCP是否连接无连接面向连接是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信传输方式面向报文面向字节流首部开销首部开销小,仅8字节首部最小20字节,最大60字节适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输3、链表反转链表反转有两种方法: 就地反转法//就地反转法interface ListNode { value: string; next: ListNode;}function reverseList1(head:ListNode) { if (head == null) return head; let dummy = null; dummy.next = head; let prev = dummy.next; let pCur = prev.next; while (pCur != null) { prev.next = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = prev.next; } return dummy.next;}头节点插入法interface ListNode { value: string; next: ListNode;}function reverseList2(head: ListNode) { let dummy = null; let pCur = head; while (pCur != null) { ListNode pNex = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = pNex; } return dummy.next;}参考连接 ...

May 10, 2019 · 1 min · jiezi

前端面试题及答案-性能优化篇

这篇文章并不是最全的前端面试题(没有最全,只有更全),只是针对自己面试过程中遇到的一些难题、容易忽略的题做一个简单的笔记,方便后面有面试需要的小伙伴们借鉴,后续内容会不定时更新,有错误之处希望大家不吝指出。1、如何对网站的文件和资源进行优化? 清理HTML文档 CSS文件尽量放在<head></head>之间JS文件尽量放在文档底部减少外部http请求 不必要的图片没用的js代码过多的CSS多余的插件压缩CSS、JS和HTML使用预先获取 可以在网站HTML中的链接属性上增加rel="prefetch",rel="dns-prefetch",或者rel="prerender" 标记。使用CDN和缓存前端面试题及答案 - 浏览器篇前端面试题及答案 - HTML篇前端面试题及答案 - CSS篇前端面试题及答案 - JS篇

May 10, 2019 · 1 min · jiezi

前端面试题及答案-浏览器篇

这篇文章并不是最全的前端面试题(没有最全,只有更全),只是针对自己面试过程中遇到的一些难题、容易忽略的题做一个简单的笔记,方便后面有面试需要的小伙伴们借鉴,后续内容会不定时更新,有错误之处希望大家不吝指出。1. 谈谈Cookie的优劣Cookie不同之处: IE6或更低版本最多20个cookieIE7和之后的版本最后可以有50个cookie。Firefox最多50个cookiechrome和Safari没有做硬性限制优点:极高的扩展性和可用性 通过良好的编程,控制保存在cookie中的session对象的大小。通过加密和安全传输技术(SSL),减少cookie被破解的可能性。只在cookie中存放不敏感数据,即使被盗也不会有重大损失。控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。缺点: Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。例子JavaScript 中,创建 cookie 如下所示: document.cookie="username=John Doe";还可以为 cookie 添加一个过期时间(以 UTC 或 GMT 时间)。默认情况下,cookie 在浏览器关闭时删除: document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";可以使用 path 参数告诉浏览器 cookie 的路径。默认情况下,cookie 属于当前页面。 document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";2、浏览器本地存储 - cookie、localStorage、sessionStorage区别相同:在本地(浏览器端)存储数据不同: localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。localStorage是永久存储,除非手动删除。sessionStorage当会话结束(当前页面关闭的时候,自动销毁)cookie的数据会在每一次发送http请求的时候,同时发送给服务器而localStorage、sessionStorage不会。了解更多 前端面试题及答案 - HTML篇前端面试题及答案 - CSS篇前端面试题及答案 - JS篇

May 10, 2019 · 1 min · jiezi

最全面试问题及答案记录

浏览器1、谈谈Cookie的优劣Cookie不同之处: IE6或更低版本最多20个cookieIE7和之后的版本最后可以有50个cookie。Firefox最多50个cookiechrome和Safari没有做硬性限制优点:极高的扩展性和可用性 通过良好的编程,控制保存在cookie中的session对象的大小。通过加密和安全传输技术(SSL),减少cookie被破解的可能性。只在cookie中存放不敏感数据,即使被盗也不会有重大损失。控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。缺点: Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。例子JavaScript 中,创建 cookie 如下所示: document.cookie="username=John Doe";还可以为 cookie 添加一个过期时间(以 UTC 或 GMT 时间)。默认情况下,cookie 在浏览器关闭时删除: document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";可以使用 path 参数告诉浏览器 cookie 的路径。默认情况下,cookie 属于当前页面。 document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

May 10, 2019 · 1 min · jiezi

JAVA面试题15

本文首发于cartoon的博客 什么是反射? 主要指程序可以访问、检测和修改它本身状态或行为的一种能力JAVA反射机制提供: 在运行时判断任意一个对象所属的类在运行时任意构造任意类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时调用任意一个对象的方法什么是 Java 序列化?什么情况下需要序列化? 序列化是一种用来处理对象流的机制序列化就是将实现序列化的JAVA对象写入到IO流中序列化允许JAVA都西昂脱离程序单独存在传递或保存对象时保证对象完整性和传递性需要序列化动态代理是什么?有哪些应用? 动态代理指在运行中动态初始化并加载类,并生成对象的过程动态代理目的为其他对象提供一个代理以控制某个对象的访问应用:Spring的AOP、IOC怎么实现动态代理? 提供业务接口实现该业务接口实现InvocationHandler接口,重写invoke方法,在对象生成的前后插入自身逻辑调用Method的成员方法invoke生成Object类对象调用方法使用泛型指定生成Object类的类型,得到invoke方法返回的具体对象

May 9, 2019 · 1 min · jiezi

前端面试网络

2.TCP 三次握手2.1 为什么要进行三次握手在第一次通信过程中,A向B发送信息之后,B收到信息后可以确认自己的收信能力和A的发信能力没有问题。在第二次通信中,B向A发送信息之后,A可以确认自己的发信能力和B的收信能力没有问题,但是B不知道自己的发信能力到底如何,所以就需要第三次通信。在第三次通信中,A向B发送信息之后,B就可以确认自己的发信能力没有问题。 2.2 第一次握手client发送一个SYN(J)包给server,然后等待server的ACK回复,进入SYN-SENT状态(syn已发送状态)。p.s: SYN为synchronize的缩写,理解为序列号,其实就是一个随机数,ACK为acknowledgment的缩写,理解为确认号。 2.3 第二次握手server接收到SYN(seq=J)包后就返回一个ACK(J+1),随机数+1,包以及一个自己的SYN(K)包,然后等待client的ACK回复,server进入SYN-RECIVED状态(syn已接收状态)。 2.4 第三次握手client接收到server发回的ACK(J+1)包后,进入ESTABLISHED状态(建立连接状态)。然后根据server发来的SYN(K)包,返回给等待中的server一个ACK(K+1)包。等待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED。到此TCP三次握手完成,client与server可以正常进行通信了。

May 8, 2019 · 1 min · jiezi

前端面试浏览器

1. 从输入 url 到页面展示的过程1.1 流程跳转是否有缓存DNS查找,域名解析ip创建TCP链接,之后才有HTTP三次握手(HTTP寻在TCP之上)发送请求(Request)接收响应(Response),返回请求的文件 (html)浏览器渲染(1,2并行,后面是串行) 解析HTML --> DOM ree 标记化算法,进行元素状态的标记生成DOM解析CSS --> CSS tree 生成CSSOM结合 --> Render tree 结合DOM与CSSOM,生成渲染树(Render tree)layout: 布局(布局渲染树)painting: 绘制(绘制渲染树) 1.2 参考https://juejin.im/post/5c64d1...https://juejin.im/book/5b9365...

May 8, 2019 · 1 min · jiezi

面试Java面试题总结

最近辞职在家复习准备面试,顺便整理一份发出来分享给大家 01. 你对面向对象思想的理解? 面向对象编程简称OOP,是开发程序的一种方法、思想。面向过程编程中常常会导致所有的代码都在一起,难以阅读和维护,牵一动百。而OOP,使用许多代码模块,每个模块都只提供特定的功能,彼此独立,可以增加代码重用几率,更加有利于软件的开发、维护和升级。另外OOP的三大核心特性:继承、封装、多态 的特性,使得程序员能够设计出高内聚、低耦合的系统结构,使得系统更灵活、易扩展,成本较低 02. 很多程序员都知道多态,但大都知其然不知其所以然,说说你对多态的理解一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,在编程时并不确定,而是在程序运行期间才确定。因为在程序运行时才确定具体的类,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性多态的优点:解耦、灵活、可扩展性强 多态存在的三个必要条件:继承、重写、父类引用指向子类对象 03. Collection集合有什么子类List1.可以允许重复的对象。2.可以插入多个null元素。3.有序,保持元素的插入顺序4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。 Set1.不允许重复对象2.无序3.只允许一个 null 元素4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口。 Map1.Map不是collection的子接口或者实现类。Map是一个接口。2.Map 可能会持有相同的值对象但键对象必须是唯一的。3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用) 04. list,set,map的使用场景1.如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。2.如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。3.如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。4.如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。 ...

May 6, 2019 · 2 min · jiezi

面试数据库相关

1.有如下数据,怎么查询显示结果为 张三, 北京 河北, 12:00 name address arrive_time 张三 北京 10:00 张三 河北 12:00 SELECT name, GROUP_CONCAT(DISTINCT address SEPARATOR ' ') AS address, max(arrive_time) AS arrive_timeFROM mytableGROUP BY name;2.如何查询重复数据? SELECT * FROM student GROUP BY name HAVING count(name ) > 13.查询结果如何去重? distinct关键字或者group by4.Oracle数据库分页查询 select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;5.delete、truncate、drop都是删除语句,他们的区别是什么 在速度上,一般来说,drop> truncate > deletedelete用于删除部分数据truncate 删除整个表然后重新创建这个表(相当于清空了表数据)drop 摧毁整个表6.数据库主键和外键作用7.where和having的区别8.union和union all的区别9.数据库事务正确执行的四个基本要素是什么10.有如下数据,查询出每门课都大于80分的学生姓名 name class score蔡徐坤 语文 80蔡徐坤 英语 55吴亦凡 语文 100吴亦凡 英语 90邓紫棋 英语 85邓紫棋 数学 70邓紫棋 语文 95select name from table group by name having min(score)>8011.数据库优化策略 ...

May 6, 2019 · 1 min · jiezi

前端刷题笔记01-字节跳动2019春招面试题

1、sleep函数该如何实现的sleep函数,将程序执行挂起一段时间,阻塞程序的运行ES6方案: function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms));}async function test() { console.log("Hello"); await sleep(1000); console.log("World");}test();ES5死循环阻塞: function sleep(ms) { ms += new Date().getTime(); while (new Date().getTime() < ms) {}}function test2() { console.log("Hello"); sleep(1000); console.log("World");}test2();2、HTTP状态码302和304的区别1** 信息状态码 100 继续101 切换协议2** 成功状态码 200 OK 请求成功201 已创建202 已接受203 非授权信息204 无内容205 重置内容206 部分内容3** 重定向 300 多种选择301 Moved Permanently 永久重定向302 Found 临时重定向303 查看其它地址304 Not Modified 未修改305 使用代理4** 客户端错误 400 Bad Request 请求的语法错误401 Unauthorized 要求身份验证403 Forbidden 服务器拒绝执行该请求404 Not Found 未找到资源5** 服务器错误 ...

May 4, 2019 · 1 min · jiezi

HTTP状态码

状态码状态码是来告诉客户端,发生了什么事情。状态码为客户端提供了一种理解事务处理结果的便捷方式。状态码位于响应的起始行中 比如,在行 HTTP/1.0 200 OK 中,状态码就是200客户端向一个 HTTP 服务器发送请求报文时,会遇到很多意想不到的情况,请求不一定能够成功完成。服务器可能会告诉你无法找到所请求的资源,你没有访问资源的权限,或者资源被移到了其他地方 状态码是在每条响应报文的起始行中返回的。会返回一个数字状态和一个可读的状态。数字码便于程序进行差错处理,而原因短语则便于人们理解 原因短语原因短语是响应起始行中的最后一个组件。它为状态码提供了文本形式的解释 比如,在行 HTTP/1.0 200 OK 中,OK 就是原因短语原因短语和状态码是成对出现的。原因短语是状态码的可读版本,应用程序开发者将其传送给用户,用于说明在请求间发生了什么情况。HTTP 规范并没有提供任何硬性规定,要求原因短语以何种形式出现 《PHP面试问答》 https://github.com/colinlet/P...结合实际 PHP 面试,系统的汇总面试中的各种各样的问题,尝试提供简洁准确的答案。如果你在 PHP 面试中遇到问题,欢迎提 Issues 交流。包含网络协议、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备问题等部分 如果觉得不错欢迎 star 关注,正在不断持续更新中~~状态码分类五大类可以通过三位数字代码对不同状态码进行分类 200 到 299 之间的状态码表示成功300 到 399 之间的代码表示资源已经被移走了400 到 499 之间的代码表示客户端的请求出错了500 到 599 之间的代码表示服务器出错了状态码整体范围已定义范围分类1XX100~199100~101信息提示2XX200~299200~206成功3XX300~399300~305重定向4XX400~499400~415客户端错误5XX500~599500~505服务器错误当前的 HTTP 版本只为每类状态定义了几个代码。随着协议的发展,HTTP 规范中会正式地定义更多的状态码。若收到了不认识的状态码,可能是有人将其作为当前协议的扩展定义的。可以根据其所处的范围,将它作为那个类别中一个普通的成员来处理 例如,若收到了状态码 515(在 5XX 代码的已定义范围之外),就应该认为这条响应指出了服务器的错误,这是 5XX 报文的通用类别100 ~ 199,信息状态码HTTP/1.1 向协议中引入了信息性状态码。这些状态码相对较新,关于其复杂性和感知价值存在一些争论,而受到限制 状态码原因短语含义100Continue说明收到了请求的初始部分,请客户端继续。发送了这个状态码之后,服务器在收到请求之后必须进行响应101Switching Protocols说明服务器正在根据客户端的指定,将协议切换成 Update 首部所列的协议100 Continue 状态码的目的是对这样的情况进行优化:HTTP 客户端应用程序有一个实体的主体部分要发送给服务器,但希望在发送之前查看一下服务器是否会接受这个实体。客户端应用程序只有在避免向服务器发送一个服务器无法处理或使用的大实体,才应该使用 100 Continue 200 ~ 299,成功状态码客户端发起请求时,这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求 状态码原因短语含义200OK请求没问题,实体的主体部分包含了所请求的资源201Created用于创建服务器对象的请求(比如:PUT)。响应的实体主体部分中应该包含引用了已创建的资源的URL,Location首部包含的则是最具体的引擎。服务器必须在发送这个状态码之前创建好对象202Accepted请求已被接受,服务器还未对其执行任何动作。不能保证服务器会完成这个请求;接受请求时,它看起来是有效的。服务器应在实体的主体部分包含对请求状态的描述,或附加请求预计处理时间、信息获取指针203Non-Authoritative Information实体首部包含的信息不是来自于源端服务器,而是来自资源的副本。如果中间节点上有一份副本,但无法或没有对元数据进行验证,就会出现这种情况204No Content响应报文中包含若干首部和一个状态行,但没有实体的主体部分。主要用于在浏览器不转为显示新文档的情况下,对其进行更新(比如刷新一个表单页面)205Reset Content另一个主要用于浏览器的代码。负责告知浏览器清除当前页面中的所有 HTML 表单元素206Partial Content成功执行了一个部分或 Range(范围)请求。客户端可以通过一些特殊的首部来获取部分或某个范围内的文档300 ~ 399,重定向状态码重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已被移动,可发送一个重定向状态码和一个可选的 Location 首部来告知客户端资源已被移走,以及现在可以在哪里找到它。这样,浏览器就可以在不打扰使用者的情况下,透明地转入新的位置了 ...

May 4, 2019 · 2 min · jiezi

搞定计算机网络面试看这篇就够了

点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 文章目录结构:  一 OSI与TCP/IP各层的结构与功能,都有哪些协议 运输层主要使用以下两种协议:UDP的主要特点:TCP的主要特点:域名系统(Domain Name System缩写DNS,Domain Name被译为域名)HTTP协议五层协议的体系结构1 应用层(application layer)2 运输层(transport layer)3 网络层(network layer)4 数据链路层(data link layer)5 物理层(physical layer)二 TCP三次握手和四次挥手(面试常客) 为什么要三次握手?为什么要传回SYN(发起一个新链接)?传了SYN,为啥还要传ACK(确认序号有效)?为什么要四次挥手?三 TCP、UDP协议的区别四 TCP协议如何保证可靠传输 超时重传停止等待协议滑动窗口流量控制拥塞控制五 在浏览器中输入url地址 ->> 显示主页的过程(面试常客)六 状态码七 各种协议与HTTP协议之间的关系八 HTTP长连接、短连接写在最后 计算机网络常见问题回顾建议一 OSI与TCP/IP各层的结构与功能,都有哪些协议五层协议的体系结构 学习计算机网络时我们一般采用折中的办法,也就是中和OSI和TCP/IP的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。 结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。 1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为报文。 域名系统 域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(百度百科)例如:一个公司的Web网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM公司的域名是www.ibm.com、Oracle公司的域名是www.oracle.com、Cisco公司的域名是www.cisco.com等。HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。(百度百科)2 运输层运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。 运输层主要使用以下两种协议 传输控制协议TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。用户数据协议UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。UDP的主要特点 UDP是无连接的;UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);UDP支持一对一、一对多、多对一和多对多的交互通信;UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。TCP的主要特点 TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;面向字节流。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。3 网络层网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。 这里要注意:不要把运输层的“用户数据报UDP”和网络层的“IP数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。 网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机。 这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称. 互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。 4 数据链路层数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 ...

May 4, 2019 · 1 min · jiezi

搞定操作系统面试看这篇就够了

<section data-role="outer" label="Powered by 135editor.com"> <section data-role="outer" label="Powered by 135editor.com"> 点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:CyC2018 链接:https://github.com/CyC2018/CS... <section> 一、概述基本特征1. 并发并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。 并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 操作系统通过引入进程和线程,使得程序能够并发运行。 2. 共享共享是指系统中的资源可以被多个并发进程共同使用。 有两种共享方式:互斥共享和同时共享。 互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。 3. 虚拟虚拟技术把一个物理实体转换为多个逻辑实体。 主要有两种虚拟技术:时分复用技术和空分复用技术。 多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。 虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。 4. 异步异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。 基本功能1. 进程管理进程控制、进程同步、进程通信、死锁处理、处理机调度等。 2. 内存管理内存分配、地址映射、内存保护与共享、虚拟内存等。 3. 文件管理文件存储空间的管理、目录管理、文件读写管理和保护等。 4. 设备管理完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。 主要包括缓冲管理、设备分配、设备处理、虛拟设备等。 系统调用如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。 <figure></figure> Linux 的系统调用主要有以下这些: TaskCommands进程控制fork(); exit(); wait();进程通信pipe(); shmget(); mmap();文件操作open(); read(); write();设备操作ioctl(); read(); write();信息维护getpid(); alarm(); sleep();安全chmod(); umask(); chown();大内核和微内核1. 大内核大内核是将操作系统功能作为一个紧密结合的整体放到内核。 由于各模块共享信息,因此有很高的性能。 2. 微内核由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。 在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。 因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。 <figure></figure> 中断分类1. 外中断由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。 2. 异常由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。 3. 陷入在用户程序中使用系统调用。 ...

May 4, 2019 · 3 min · jiezi

TCP-粘包拆包

粘包问题在 TCP 这种字节流协议上做应用层分包是网络编程的基本需求。分包指的是在发生一个消息(message)或一帧(frame)数据时,通过一定的处理,让接收方能从字节流中识别并截取(还原)出一个个消息。因此,“粘包问题”是个伪命题 短连接分包对于短连接的 TCP 服务,分包不是一个问题,只要发送方主动关闭连接,就表示一个消息发送完毕,接收方 read() 返回0,从而知道消息的结尾 TCP 发送机制为了提高 TCP 的传输效率,TCP 有一套自己的发送机制 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作发送方的一个计时器期限到了,这时把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去长连接分包对于长连接的 TCP 服务,分包有四种方法 消息长度固定使用特殊的字符或字符串作为消息的边界,例如 HTTP 协议的 headers 以“rn”为字段的分隔符在每条消息的头部加一个长度字段,这恐怕是最常见的做法利用消息本身的格式来分包,例如 XML 格式的消息中 <root>...</root> 的配对,或者 JSON 格式中的 { ... } 的配对。解析这种消息格式通常会用到状态机(state machine)复杂的分包假如消息格式非常简单,“消息”本身是一个字符串,每条消息有一个4字节的头部,以网络序存放字符串的长度。消息直接没有间隙,字符串也不要求以 '0' 结尾 发送两条消息“hello”和“smartboy”,打包后的字节流共有21字节 0x00, 0x00, 0x00, 0x05, 'h', 'e', 'l', 'l', 'o',0x00, 0x00, 0x00, 0x08, 's', 'm', 'a', 'r', 't', 'b', 'o', 'y'假设数据最终都全部到达,数据解析逻辑至少能正确处理以下各种数据到达的次序 一个字节一个字节到达数据分两次到达,第一次收到2个字节,不足消息的长度字段数据分两次到达,第一次收到4个字节,刚好够长度字段,但是没有 body数据分两次到达,第一次收到8个字节,长度完整,但 body 不完整数据分两次到达,第一次收到9个字节,长度完整,但 body 也完整数据分两次到达,第一次收到10个字节,第一条消息的长度完整、body 也完整,第二条消息长度不完整请自行移动和增加分割点,一共有超过 100 万种可能(221-1)数据一次就全部到达《TCP粘包拆包》 原文链接:https://blog.maplemark.cn/2019/04/tcp粘包拆包.html?utm=sf ...

May 1, 2019 · 1 min · jiezi

TCP协议详解

传输控制协议 TCP 概述TCP 最主要的特点TCP 是面向连接的运输层协议。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一)TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据面向字节流。TCP 中的“流”指的是流入到进程或从进程流出的字节序列面向字节流“面向字节流”的含义是:虽然应用程序和 TCP 的交互式一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP 并不知道所传送的字节流的含义 TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系 例如,发送方应用程序交给发送方的 TCP 共10个数据块,但接收方的 TCP 可能只用了4个数据块就把收到的字节流交付上层的应用程序接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据 TCP 和 UDP 在发送报文时采用的方式完全不同。TCP 并不关心应用进程一次把多长的报文发送到 TCP 的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。如果应用进程传送到 TCP 缓存的数据块太长,TCP 就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去 《PHP面试问答》 https://github.com/colinlet/P...结合实际 PHP 面试,系统的汇总面试中的各种各样的问题,尝试提供简洁准确的答案。如果你在 PHP 面试中遇到问题,欢迎提 Issues 交流。包含网络协议、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备问题等部分 如果觉得不错欢迎 star 关注,正在不断持续更新中~~TCP 的连接TCP 把连接作为最基本的抽象。TCP 的许多特性都与 TCP 是面向连接的这个基本特性有关 TCP 连接的端点叫做套接字(socket)或插口,根据 RFC 793 的定义:端口号拼接到(concatenated with) IP 地址即构成了套接字 ...

May 1, 2019 · 5 min · jiezi

当我谈前端进阶时我谈些什么

当我谈前端进阶时我谈些什么日本后现代主义作家村上春树写过一本富有哲理的书——《当我谈跑步时我谈些什么》。 书中,他谈到,跑步跟写作一样:都需要坚毅隐忍,追逐超越;都需要心无杂念,持之以恒。全书落笔之处,没有浮华旖旎,而是娓娓道来迷惘、失败和挣扎。 这本书名义上是在谈跑步,却是在个人创作低潮时期对突破的不断思考。仔细想来,这样的思考对于一位工程师也至关重要。 前端领域,入门相对简单,可是想要“更上一层楼”却难上加难,也就是我们常说的“职业天花板较低”,君不见——市场上高级/资深前端工程师凤毛麟角。其实,这当然未必完全是坏事,一旦突破瓶颈,在技能上脱颖而出,便是更广阔的空间。 那么,如何从夯实基础到突破瓶颈? 接下来就让我们一起来讨论下:当我谈前端进阶时我谈些什么。 直面自我——前端工程师的焦虑和迷茫说到进阶,我想先谈谈我们每个人内心的焦虑和迷茫,正视这种情绪是学习的第一步。对于每一个追求进步的人来说,瓶颈期总会在各个阶段“如约而至”。早在公元前某年,庄子就说过: 吾生也有涯,而知也无涯。以有涯随无涯,殆已!已而为知者,殆而已矣!而现如今,信息爆炸时代,信息量呈几何级数增长,知识似乎唾手可得。那么:“该学什么?”,“到底该怎么学?”,“学完之后又该做什么?”,大部分人都会在知识面前焦虑、迷茫。 同样地,对于有一定工作经验的工程师来说: “我该如何避免相似的工作做三年,而不是具备了三年的工作经验?”“我该如何从繁杂而千篇一律的业务需求中,提炼技术点并总结提高?”“我该如何为团队带来更大的价值,体现经验能力?”能够正视并解决这几个问题,将是更进一步的关键。可是这些困扰对前端工程师来说貌似来得更加猛烈:前端技术发展备受瞩目,前端工程师变得越发重要的背后是相关技术的不断扩张和更新换代。因此,我们比以往任何时候都更需要主动学习。但据我观察,目前网络上的学习资料往往存在以下两个问题: 过于碎片化,这类知识某种程度上只能成为缓解焦虑的精神鸦片追求短平快,大牛经验、快速搞定“面经题目”,渐渐演变成为跳槽加薪的兴奋剂坦白来说,我也是这些“学习资料”的搜集者,如果没有系统针对性地学习和反复的刻意练习,那么结果就是以为收藏的是知识,其实收藏的是“知道”。以为掌握了知识,其实只是囤积了一堆“知道”。 前端的大航海时代,有旧工具淘汰,更有新力量崛起记得我刚接触前端编程时,jQuery 风靡一时,其清新优雅的 DOM 操作、稳如磐石的兼容性处理、灵活高效的封装和链式调用,让人如沐春风。 彼时,我幼稚地以为“这就是颠覆”,事实却是“这只是开始”——随着三大框架的崛起,技术更迭就像“暴风雨前的宁静”,jQuery 突然就被其他“先进的生产力”抛在背后了。于是我们看见各大平台技术进行“改朝换代”,引领开发潮流。 这还只是一个类库在前端浪潮中的兴衰。再想想 ES 语言规范的演进速度,HTML5 的扩张幅度,跨端从 Ionic 到 React Native 再到 Flutter,CSS 从基本布局模型到弹性盒模型再到原生 Grid 方案,构建工具从 Grunt 到 Gulp 再到 webpack/Rollup...... 前端开发有着与生俱来的混乱,需要我们披荆斩棘,在实践中勇往直前前端三大方向 JavaScript、CSS、 HTML 的背后是无尽的碎片化场景。前端是最贴近用户的“战线”,它基因里就需要处理“大象万千”。同时,不管是跨平台还是语言特性,它都会让开发者感到迷茫: “我们该使用哪些 HTML 标签以达到最佳的语义化?”“我们该如何面对不同终端的诡异问题,并保证体验一致性?”“我们如何写 JavaScript 做到 bug free?”“this 乱七八糟,它到底指向谁?”......前端开发工程师有广阔的未来,但“打铁还需自身硬”目前我们正在经历所谓的“资本寒冬”,不管是大厂、二线公司还是创业团队,“优化人员结构(裁员)”的新闻层出不穷。但是据我观察,“高级前端工程师”的招聘需求却“逆流而上”,具备高水平和经验的开发者无论在任何时候都备受追捧。因此,磨练技能、积累项目经验将是所有前端工程师的核心诉求。 作为从业者,我也在思考如何让前端知识更有价值,如何突破瓶颈,进而实现进阶。 **好了,到现在就到了软文时间。受于平台所托,有了这篇文章。在此之前的部分,是我对于现代前端的一些感想,之后部分是我做的一门课程《前端开发核心知识进阶》的介绍。如果不想浪费时间的读者可以直接关掉页面,感兴趣的朋友不妨继续阅读。** 基础和进阶,理论和实践当 GitChat 联系我想要打造一门系统而全面的前端进阶课程时,我欣然接受。不光是因为想把自己在海外和 BAT 服务多年积累的经验分享给大家,也是想把长时间以来收藏的“干货”梳理一遍,系统性整理输出,和大家一起总结提高。最终,就是呈现在大家面前的这门《前端开发核心知识进阶》。 希望这门课程不仅详述“知识”,更能体现编程“智慧”,能让所有订阅的朋友们一起思考,一起进步。 说到课程特色,我想结合上面提到的一些关键点来介绍。 对于前端发展的瞬息万变,我希望这门课程,在重视“亘古不变”的语言基础上,力求为大家介绍更先进的开发技术。比如服务端渲染,比如 HTTP 3.0,比如使用 Lerna、yarn workspaces 构建 monorepo 项目,比如框架演进和虚拟 DOM,等等。 ...

April 30, 2019 · 1 min · jiezi

Celery实际使用与内存泄漏问题面试

1.实际使用 监控task的执行结果:任务id,结果,traceback,children,任务状态 配置 backend='redis://127.0.0.1:6379/5'给Celery的app对象,直接在redis中查看 还可以 健壮celery:celery -A proj worker -l info ☁ proj tree├── __init__.py ├── celery.py | app=Clery('proj',include=['proj.tasks']) app.config_from_object('proj.config') if __name__==__main__: app.start()├── config.py | CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/6' BROKER_URL = 'redis://127.0.0.1:6379/5' └── tasks.py | @app.task # 注意这个文件名必须是tasks.py def add(x, y): return x + y tasks可以有多个在celery.py中添加一行代码加载任务函数 app.autodiscover_tasks(['proj.sms', 'proj.email']) Scheduler计划定时任务:celery -A proj worker -B -l info #config.pyCELERY_TIMEZONE = 'Asia/Shanghai' # 指定时区from datetime import timedeltaCELERYBEAT_SCHEDULE = { 'add-every-30-seconds': { 'task': 'proj.tasks.add', # 指定要执行的函数任务 'schedule': timedelta(seconds=30), # 指定计划时间间隔30s执行一次task 'args': (16, 16) },} celery.schedules import crontab定时周期任务:(比如每周一执行一次 ) ...

April 29, 2019 · 1 min · jiezi

2018MySQL面试知识点整理

mysql 查询子句: group by 多个字段,group by 前可使用聚合函数,having: 对查询后结果的筛选 和where后面的语法类似字段别名 表别名 as子查询 子查询结果作为父查询的表 select xxx from (子查询) as 子查询结果命名子查询作为字段使用: select xxx from table where id in(select id ...)子查询可以跨多个表隔离级别: 未提交读(Read uncommitted),可能产生:脏读,不可重复读,幻读读已提交(Read committed),可能产生:不可重复读,幻读可重复读(Repeatable read):可能产生:幻读串行化(Serializable):可能产生:无mysql默认级别:可重复读 1. select @@global.tx_isolation;2. select @@session.tx_isolation;3. set global transaction isolation level read committed; //全局的4. set session transaction isolation level read committed; //当前会话mvcc(Multi Version Concurrency Control):为了实现快照读(读写不冲突) redo log: mysql将事务操作过程中产生redo log,事务提交时flush到硬盘(顺序的) 1. 当主机崩溃重启,可以从redo log获取日志恢复undo log: 事务操作过程中,记录修改的回滚操作,事务回滚可以用上 1. mysql根据 undo log 可以回溯到某个版本,实现mvccinnodb是以聚集索引组织数据的。数据行中包含rowid(主键id),还包括: ...

April 28, 2019 · 2 min · jiezi

2019前端最全面试题

项目地址HTML问题HTML5语义化什么是语义化?就是用合理、正确的标签来展示内容,比如h1~h6定义标题。 好处易于用户阅读,样式丢失的时候能让页面呈现清晰的结构。有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。方便其他设备解析,如盲人阅读器根据语义渲染网页有利于开发和维护,语义化更具可读性,代码更好维护,与CSS3关系更和谐。http://www.daqianduan.com/654... 为什么最好把 CSS 的<link>标签放在<head></head>之间?为什么最好把 JS 的<script>标签恰好放在</body>之前,有例外情况吗?把<link>放在<head>中 把<link>标签放在<head></head>之间是规范要求的内容。此外,这种做法可以让页面逐步呈现,提高了用户体验。将样式表放在文档底部附近,会使许多浏览器(包括 Internet Explorer)不能逐步呈现页面。一些浏览器会阻止渲染,以避免在页面样式发生变化时,重新绘制页面中的元素。这种做法可以防止呈现给用户空白的页面或没有样式的内容。 把<script>标签恰好放在</body>之前 脚本在下载和执行期间会阻止 HTML 解析。把<script>标签放在底部,保证 HTML 首先完成解析,将页面尽早呈现给用户。 例外情况是当你的脚本里包含document.write()时。但是现在,document.write()不推荐使用。同时,将<script>标签放在底部,意味着浏览器不能开始下载脚本,直到整个文档(document)被解析。也许,对此比较好的做法是,<script>使用defer属性,放在<head>中。 什么是渐进式渲染(progressive rendering)?渐进式渲染是用于提高网页性能(尤其是提高用户感知的加载速度),以尽快呈现页面的技术。 在以前互联网带宽较小的时期,这种技术更为普遍。如今,移动终端的盛行,而移动网络往往不稳定,渐进式渲染在现代前端开发中仍然有用武之地。 一些举例: 图片懒加载——页面上的图片不会一次性全部加载。当用户滚动页面到图片部分时,JavaScript 将加载并显示图像。确定显示内容的优先级(分层次渲染)——为了尽快将页面呈现给用户,页面只包含基本的最少量的 CSS、脚本和内容,然后可以使用延迟加载脚本或监听DOMContentLoaded/load事件加载其他资源和内容。异步加载 HTML 片段——当页面通过后台渲染时,把 HTML 拆分,通过异步请求,分块发送给浏览器。更多相关细节可以在这里找到。viewportViewport :字面意思为视图窗口,在移动web开发中使用。表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动web站点跨设备显示效果基本一致。移动版的 Safari 浏览器最新引进了 viewport 这个 meta tag,让网页开发者来控制 viewport 的大小和缩放,其他手机浏览器也基本支持。 在移动端浏览器当中,存在着两种视口,一种是可见视口(也就是我们说的设备大小),另一种是视窗视口(网页的宽度是多少)。举个例子:如果我们的屏幕是320像素 * 480像素的大小(iPhone4),假设在浏览器中,320像素的屏幕宽度能够展示980像素宽度的内容。那么320像素的宽度就是可见视口的宽度,而能够显示的980像素的宽度就是视窗视口的宽度。 为了显示更多的内容,大多数的浏览器会把自己的视窗视口扩大,简易的理解,就是让原本320像素的屏幕宽度能够容下980像素甚至更宽的内容(将网页等比例缩小)。 Viewport属性值width 设置layout viewport 的宽度,为一个正整数,或字符串"width-device"initial-scale 设置页面的初始缩放值,为一个数字,可以带小数minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许这些属性可以同时使用,也可以单独使用或混合使用,多个属性同时使用时用逗号隔开就行了。Reflow和RepaintReflow当涉及到DOM节点的布局属性发生变化时,就会重新计算该属性,浏览器会重新描绘相应的元素,此过程叫Reflow(回流或重排)。 Repaint当影响DOM元素可见性的属性发生变化 (如 color) 时, 浏览器会重新描绘相应的元素, 此过程称为Repaint(重绘)。因此重排必然会引起重绘。 引起Repaint和Reflow的一些操作调整窗口大小字体大小样式表变动元素内容变化,尤其是输入控件CSS伪类激活,在用户交互过程中发生DOM操作,DOM元素增删、修改width, clientWidth, scrollTop等布局宽高的计算Repaint和Reflow是不可避免的,只能说对性能的影响减到最小,给出下面几条建议:避免逐条更改样式。建议集中修改样式,例如操作className。避免频繁操作DOM。创建一个documentFragment或div,在它上面应用所有DOM操作,最后添加到文档里。设置display:none的元素上操作,最后显示出来。避免频繁读取元素几何属性(例如scrollTop)。绝对定位具有复杂动画的元素。绝对定位使它脱离文档流,避免引起父元素及后续元素大量的回流https://harttle.land/2015/08/...http://www.blueidea.com/tech/... img中的alt和元素的title属性作用img的alt属性如果无法显示图像,浏览器将显示alt指定的内容 元素title属性在鼠标移到元素上时显示title的内容 href和src区别href href标识超文本引用,用在link和a等元素上,href是引用和页面关联,是在当前元素和引用资源之间建立联系若在文档中添加href ,浏览器会识别该文档为 CSS 文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用 link 方式加载 CSS,而不是使用 @import 方式。 ...

April 27, 2019 · 10 min · jiezi

下篇中高级前端大厂面试秘籍寒冬中为您保驾护航直通大厂

引言本篇文章会继续沿着前面两篇的脚步,继续梳理前端领域一些比较主流的进阶知识点,力求能让大家在横向层面有个全面的概念。能在面试时有限的时间里,能够快速抓住重点与面试官交流。这些知识点属于加分项,如果能在面试时从容侃侃而谈,想必面试官会记忆深刻,为你折服的~???? 另外有许多童鞋提到: 面试造火箭,实践全不会,对这种应试策略表达一些担忧。其实我是觉得面试或者这些知识点,也仅仅是个初级的 开始。能帮助在初期的快速成长,但这种策略并没办法让你达到更高的水平,只有后续不断地真正实践和深入研究,才能突破自己的瓶颈,继续成长。面试,不也只是一个开始而已嘛。~???? 建议各位小伙从基础入手,先看 (上篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂(中篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂小菜鸡博客求赞 ???? blog进阶知识Hybrid随着 Web技术 和 移动设备 的快速发展,在各家大厂中,Hybrid 技术已经成为一种最主流最不可取代的架构方案之一。一套好的 Hybrid 架构方案能让 App 既能拥有 极致的体验和性能,同时也能拥有 Web技术 灵活的开发模式、跨平台能力以及热更新机制。因此,相关的 Hybrid 领域人才也是十分的吃香,精通Hybrid 技术和相关的实战经验,也是面试中一项大大的加分项。 1. 混合方案简析Hybrid App,俗称 混合应用,即混合了 Native技术 与 Web技术 进行开发的移动应用。现在比较流行的混合方案主要有三种,主要是在UI渲染机制上的不同: Webview UI: 通过 JSBridge 完成 H5 与 Native 的双向通讯,并 基于 Webview 进行页面的渲染;优势: 简单易用,架构门槛/成本较低,适用性与灵活性极强;劣势: Webview 性能局限,在复杂页面中,表现远不如原生页面;Native UI: 通过 JSBridge 赋予 H5 原生能力,并进一步将 JS 生成的虚拟节点树(Virtual DOM)传递至 Native 层,并使用 原生系统渲染。优势: 用户体验基本接近原生,且能发挥 Web技术 开发灵活与易更新的特性;劣势: 上手/改造门槛较高,最好需要掌握一定程度的客户端技术。相比于常规 Web开发,需要更高的开发调试、问题排查成本;小程序 通过更加定制化的 JSBridge,赋予了 Web 更大的权限,并使用双 WebView 双线程的模式隔离了 JS逻辑 与 UI渲染,形成了特殊的开发模式,加强了 H5 与 Native 混合程度,属于第一种方案的优化版本;优势: 用户体验好于常规 Webview 方案,且通常依托的平台也能提供更为友好的开发调试体验以及功能;劣势: 需要依托于特定的平台的规范限定2. WebvievWebview 是 Native App 中内置的一款基于 Webkit内核 的浏览器,主要由两部分组成: ...

April 26, 2019 · 7 min · jiezi

Google面试问题指南使用Python删除重复出现的字符

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:5min 当下,谷歌的面试时常被程序员提及。有时,面试能让我们发挥最好的一面,从而获得我们想要的职位。本文我们将讨论一个可能出现在Google面试中的经典问题。 愿码提示:如果您是编码老手,您可能已经知道如何解决这个问题!如果你经验较浅,那么你一定会从本文中受益。问题给定一个字符串作为输入,删除任何重复出现的字符,并返回新字符串。 正如我们从上面的例子中看到的那样,输出是“abc”,因为我们删除了第二个'a','b'和'c'。首先,让我们在Python 2.7中设置我们的功能。 def deleteReoccurringCharacters(string):为了解决这个问题,我们将使用一个名为HashSet的特定数据结构。 您可以将集合视为与数组类似,但有两个主要例外。 这是完全无序的它不能包含重复项因为它是无序的,我们还需要一个空字符串来存储我们按顺序添加到集合中的字符。这将是我们返回的字符串。我们来设置一下 def deleteReoccurringCharacters(string): seenCharacters = set() outputString = ''现在我们已经建立了我们需要的数据结构,让我们再来谈谈我们的算法。由于集合在内存中的工作方式,它的查找时间复杂度为0(1)。这意味着我们可以用它来检查我们是否已经访问过一个角色! 我们的算法遍历初始字符串中的所有字符并执行以下操作:第1步:检查角色是否已经在我们的设置中第2歩:如果它不在集合中,则将其添加到集合中并将其附加到字符串让我们看看代码中的内容 for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char我们不必担心“else”情况,因为我们不需要处理重复出现的字符本身。现在剩下要做的就是返回outputString。这是完成的代码的样子: def deleteReoccurringCharacters(string): seenCharacters = set() outputString = '' for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char return outputString如果这是一次面试,招聘人员会问你时间和空间的复杂性。我们来分析一下。 ...

April 25, 2019 · 1 min · jiezi

阿拉伯数字转大写中文

代码如下function getChinese(n){ // 判断参数是否为 0 或 0以上的 一个数字 if (!/^(0|[1-9]\d*)$/.test(n)) return "这不是一个正确的数字"; // 参数转字符串 n += "" // unit 数字的单位 num数字的大写汉字 str 存放处理后的字符串 var unit = "个拾佰仟万拾佰仟亿拾佰仟",num="零壹贰叁肆伍陆柒捌玖",str = ""; // 判断数字位数不能超出 unit 的长度 if(n.length>unit.length) return `不能超过${unit.length}位` // n[i]数字的每一项 num的下标对应数字0-9 所以num[n[i]]可以取到数字对应的大写汉字 // 因为数字n是从右到左依次为 个位、十位... 而 unit 顺序正好相反 所以用unit[n.length-1-i]取到对应的单位。 for (var i=0;i<n.length;i++) str += num[n[i]] + unit[n.length-1-i]; // $1,$2... 表示 匹配结果中对应分组匹配的结果 // 如果 n 存在 0 那么str会出现 零(千|百|拾|个) 这种情况。所以用下面的方法替换。 // replace(/零(千|百|拾|个)/g,"零") // 如果 n 存在多个 0 咱们只需要一个 0 所以用下面方法替换 // replace(/(零)+/g,"零") // 如果 存在 零(万|亿),即万位、亿位为0,我们只需要 (万|亿) // replace(/零(万|亿)/g, "$1") // 如果 n 包含 10 我们只需要 拾 // replace(/壹(拾)/g, "$1$2") // 结尾去掉 零|个 // replace(/(零|个)$/g,"") return str.replace(/零(仟|佰|拾|个)/g,"零").replace(/(零)+/g,"零").replace(/零(万|亿)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/(零|个)$/g,"");}

April 25, 2019 · 1 min · jiezi

Leetcode116-填充同一层的兄弟节点2

题目给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 示例: 输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。题解方法一: 层序遍历使用层序遍历,遍历的时候把同层的节点连接起来; class Solution { public Node connect(Node root) { if (root == null) return null; Queue<Node> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { int size = queue.size(); Node current = null; while (size > 0) { Node node = queue.poll(); if (node.right != null) queue.add(node.right); if (node.left != null) queue.add(node.left); node.next = current; current = node; size--; } } return root; }}方法二:递归递归的时候我们通常就分解为递归子问题和递归结束条件。 ...

April 24, 2019 · 2 min · jiezi

百度面试两板斧:手写算法问基础

阅读本文大概需要 4 分钟。 17年7月份,我参加了百度的实习生面试,随后在百度开始了半年的实习生活,18年7月份,我参加了百度的校招提前批面试,由于可以同时参加百度多个部门的提前批面试,结果我前前后后面试了10多次,也算是一段比较奇葩的经历了。 当然,实习生面试是这里面最简单的一次了,三轮面试,前两轮都是在问基础,问的也不深入,第三轮面试则直接谈人生谈理想。其实百度的日常实习生面试难度确实比校招要来的容易,因为百度一年四季都在招实习生,反观阿里和腾讯,只有在春招期间招收实习生。 既然上面的面试难度不太具有代表性,那么我还是来说说秋招的百度面试经历吧。 大家都知道,阿里内部用Java居多,腾讯内部用C++居多,而百度内部的语言则是五花八门,Java、C++、Python、PHP,都有一定数量的人在用,所以百度的面试题也会比较杂,什么都有可能考,但亦不会考的特别难。 手写算法是百度秋招必考的一个环节,我那时候都是电话面试,所以直接是用在线写代码的网站来做题的(面试官可以实时看到你的代码情况)手写算法一般是压轴环节,也就是面试官问完基础题,就会开始让你写算法题。 题目的难度也不尽相同,有的面试官让我写过二叉树相关的简单题,也有面试官让我写DFS、BFS的题目,当然,多数题目还是剑指offer上的题目,以及基础题:字符串问题、快排、二分查找、二分查找变式等。 值得一提的是,面试官会允许你在本地IDE进行调试,这样一来可以节省你的时间。 在开始写代码前,面试官一般会先问你的思路,假如他没有问,那你也要主动告诉他,要知道,考察算法题的时候,和面试官的有效沟通也是一个很重要的考察点,否则你可能会漏掉关键信息,以至于无法完成后续答题。 当然,打铁还需自身硬,最关键的一点是,你需要花大量时间刷题,积累经验,保持做题手感,剑指offer上的题目基本要掌握,LeetCode的经典题型必须重视,刷题是一件你需要不断坚持的事情,就和考研前需要不断做数学题一样,都是一个道理。 讲了这么多关于手写算法方面的内容,可能你已经萌生退意了,那我们还是把话题移回到简单粗暴的基础问题吧,计算机网络、操作系统、数据结构这三门课程,百度一样喜欢考,不过难度适中,一般只会考比较基础的问题,比如TCP/IP三次握手、四次挥手,线程和进程的区别,内存管理方式等等。 最后要说的是,百度最喜欢考察的一类题目,叫做海量数据问题,虽然现在越来越多公司都喜欢考这个,但是百度可以说是这类题目的创始人。 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 如果大家对这块内容感兴趣,那么我推荐一个大牛的博客,对这方面内容做了很全面的整理,可能很多人已经看过: https://blog.csdn.net/v_july_... 关于百度面试的内容,我就总结这么多了,当然,大部分是针对校招同学的面试题,至于社招的朋友,则更多地会和部门需求匹配,考察的重点也不再是上述这些基础知识和算法题了。 如果仍有疑问,也可以留言参与互动噢。 一介码农,尚能写作,我是黄小斜,不是黄老邪噢 推荐阅读: 记一次面试腾讯的奇葩经历 你点的每个好看,我都认真当成了喜欢

April 21, 2019 · 1 min · jiezi

记一次 Booking 线上面试中遇到的小问题

从事 Android 开发工作要满 5 年了,虽然明白自己技术很一般,但是也总是期望能够有机会进入更好的平台发展。这不,因为机缘巧合有了一次 Booking 的面试邀请(是在 hackerrank 上),然后开始临时抱佛脚 (leetcode 走起),最终选择了一个周末去完成线上测试,结果我完全没预料到。本以为会被某道题的逻辑绕昏,结果哪知道被标准输入这个东西卡得死死的,现在就记录一下这次非常糟糕的体验,给自己提个醒。 一共四道题,其中一道是 Android 相关的。我一看,嘿嘿,简单得很,就是一个递归查找,10分钟搞定。然后其他三道是 Java 题,我看了下一道题目(题目具体是什么我就不能说了),略微思考后,有了思路,接着就开始在本地 IDE 里写实现,然后就是噩梦的开始了。。。 // 对的,简单的一个 Main 函数// 输入类似格式如下// 1 1 1 1// 2 3 4 5// 1 1 3 4public class Booking { public static void main(String[] args) throws IOException { }}输入参数具体意义是题目给定的,你要做的就只是取到它们然后就可以开始实现你自己的解题步骤了。因为一般在 leetcode 上做题,你要做的就只是实现函数逻辑,输入已经给你处理好了,所以看到这个题一下就没反应过来,“这不是 Java 的标准输入吗?我不知道怎么处理啊。。。赶紧谷歌一下吧。我艹,还是不对啊,我取不到输入值啊,是要 do{}while()来着吧?还是不行啊,敲完回车后怎么还在等待输入啊。这个输入是粘贴进去的还是行输入的啊。”。 过了十来分钟,还是没有起色,人一下就慌了。巨大的焦虑笼罩在头顶,哪还有心思解题啊,我非得把这个搞出来,然后。。。就没有然后了。 结果今天早上收到邮件,唉,肯定凉了呗。在今天上班写了一早上的业务后,决定还是要把这个问题善始善终掉,于是重新整理了思路,记录一下正确的写法。 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); String[] aItems = bufferedReader.readLine().replaceAll("\\s+$", "").split(" "); List<Integer> a = new ArrayList<>(); for (int i = 0; i < 3; i++) { int aItem = Integer.parseInt(aItems[i]); a.add(aItem); } String[] bItems = bufferedReader.readLine().replaceAll("\\s+$", "").split(" "); List<Integer> b = new ArrayList<>(); for (int i = 0; i < bItems.length; i++) { int bItem = Integer.parseInt(bItems[i]); b.add(bItem); } List<Integer> result = doSomething(a, b); for (int i = 0; i < result.size(); i++) { bufferedWriter.write(String.valueOf(result.get(i))); if (i != result.size() - 1) { bufferedWriter.write(" "); } } bufferedWriter.newLine(); bufferedReader.close(); bufferedWriter.close();函数doSomething就是你需要完成的函数体了。 ...

April 21, 2019 · 1 min · jiezi