<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>知识 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E7%9F%A5%E8%AF%86/</link><description>Recent content in 知识 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 05 Nov 2017 19:29:18 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E7%9F%A5%E8%AF%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Web前端知识体系精简</title><link>https://pangyd.com/post/155-web/</link><pubDate>Sun, 05 Nov 2017 19:28:29 +0800</pubDate><guid>https://pangyd.com/post/155-web/</guid><description>&lt;p>&lt;span>Web前端技术由html、CSS和JavaScript三大部分构成，是一个庞大而复杂的技术体系，其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入，然后不断地接触和学习新的知识点，因此对于初学者很难理清楚整个体系的脉络结构。&lt;span>本文将对Web前端知识体系进行简单的梳理&lt;/span>，对应的每个知识点点到为止，不作详细介绍。目的是帮助大家审查自己的知识结构是否完善，如有遗漏或不正确的地方，希望共勉。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="640|360">&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;h3>&lt;span>&lt;span>JAVASCRIPT 篇&lt;/span>&lt;/span>&lt;/h3>&lt;h3>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/h3>&lt;h3>&lt;span>&lt;span>0、基础语法&lt;/span>&lt;/span>&lt;/h3>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>Javascript基础语法包括：变量定义、数据类型、循环、选择、内置对象等。&lt;/span>&lt;/p>&lt;p>&lt;span>数据类型有string,number,boolean,null,undefined,object等。其中，string,number和boolean是基础类型,null和undefined是JS中的两个特殊类型,object是引用类型。 &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;span>Javascript可以通过typeof来判断基础数据类型，但不能够准确判断引用类型, 因此需要用到另外一个方法，那就是Object的toString,&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>JS常用的内置对象有Date、Array、JSON,RegExp等。 一般来讲，Date和Array用的最频繁，JSON可以对对象和数组进行序列化和反序列化，还有一个作用就是实现对象的深拷贝。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>RegExp即正则表达式，是处理字符串的利器。&amp;nbsp;&lt;/span>&lt;/p>&lt;h4>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/h4>&lt;h4>&lt;span>&lt;span>1、函数原型链&lt;/span>&lt;/span>&lt;/h4>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>Javascript虽然没有继承概念，但Javascript在函数Function对象中建立了原型对象prototype，并以Function对象为主线，从上至下，在内部构建了一条原型链。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>简单来说就是建立了变量查找机制，当访问一个对象的属性时，先查找对象本身是否存在，如果不存在就去该对象所在的原型连上去找，直到Object对象为止，如果都没有找到该属性才会返回undefined。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>因此我们经常会利用函数的原型机制来实现JS继承。&lt;/span>&lt;/p>&lt;p>&lt;br data-filtered="filtered">&lt;/p>&lt;h4>&lt;span>&lt;span>2、函数作用域&lt;/span>&lt;/span>&lt;/h4>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>函数作用域就是变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。在JS中没有会块级作用域，只有函数作用域，因此JS中还存在着另外一种怪异现象，那就是变量提升。&lt;/span>&lt;/p>&lt;p>&lt;br data-filtered="filtered">&lt;/p>&lt;h4>&lt;span>&lt;span>3、函数指针 this&lt;/span>&lt;/span>&lt;/h4>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>this 存在于函数中，它指向的是该函数在运行时被调用的那个对象。在实际项目中，遇到this的坑比较多，因此需要对this作深入的理解。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>Function对象还提供了call、apply和bind等方法来改变函数的this指向，其中call和apply主动执行函数，bind一般在事件回调中使用，而call和apply的区别只是参数的传&lt;/span>&lt;/p>&lt;p>&lt;span>递方式不同。&lt;/span>&lt;/p>&lt;h4>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/h4>&lt;h4>&lt;span>&lt;span>4、构造函数 new&lt;/span>&lt;/span>&lt;/h4>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>JS中的函数即可以是构造函数又可以当作普通函数来调用，当使用new来创建对象时，对应的函数就是构造函数，通过对象来调用时就是普通函数。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>普通函数的创建有：显式声明、匿名定义、new Function() 等三种方式。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p>&lt;p>&lt;span>当通过new来创建一个新对象时，JS底层将新对象的原型链指向了构造函数的原型对象，于是就在新对象和函数对象之间建立了一条原型链，通过新对象可以访问到函数对象原型prototype中的方法和属性。&lt;/span>&lt;/p>&lt;p>&lt;br data-filtered="filtered">&lt;/p>&lt;h4>&lt;span>&lt;span>5、闭包&lt;/span>&lt;/span>&lt;/h4>&lt;p>&lt;span>&lt;br data-filtered="filtered">&lt;/span>&lt;/p></description></item><item><title>Java数据结构与算法</title><link>https://pangyd.com/post/146-java/</link><pubDate>Thu, 26 Oct 2017 22:56:35 +0800</pubDate><guid>https://pangyd.com/post/146-java/</guid><description>&lt;p>&lt;span>刚学习数据结构与算法时，就被告知&lt;span>&amp;nbsp;“程序=算法+数据结构”&lt;/span>，而这段话来自于对点计算机科学家Niklaus Wirth在1976年出版的一本书的书名，后来这句话也成为计算机工作者之间流传的一句名言，小编也用惨痛的经历告诉大家这也是一个很重要的知识点。&lt;/span>&lt;/p>&lt;p>&lt;span>&amp;nbsp;&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img data-s="300,640" data-type="jpeg" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpg" data-copyright="0" class="" data-ratio="1.0909090909090908" data-w="110" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>那么到底什么是数据结构和算法，数据结构算法又有什么用呢？&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>首先来说说什么是数据结构，直接上图&lt;/span>&lt;/p>&lt;p>&lt;span>&amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img data-s="300,640" data-type="jpeg" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpg" data-copyright="0" class="" data-ratio="0.59613196814562" data-w="879" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>从图中我们可以很直观的看出数据结构涵盖的内容。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>算法的介绍就相对抽象了，百度百科给出的解释是&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>算法是对特定问题求解步骤的一种描述，它是指令的有限序列，其中每一条指令表示一个或者多个操作。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>但是我们从他的特性来理解就会简单多了。&lt;span>算法主要有五个特性&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>· 有穷性：指令序列是有限的&lt;/span>&lt;/p>&lt;p>&lt;span>· 确定性：每条语句的含义明确，无二义性&lt;/span>&lt;/p>&lt;p>&lt;span>· 可行性：每条语句都应在有限的时间内完成&lt;/span>&lt;/p>&lt;p>&lt;span>· 输入：零个或者多个输入&lt;/span>&lt;/p>&lt;p>&lt;span>· 输出：一个或者多个输出&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img data-s="300,640" data-type="jpeg" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpg" data-copyright="0" class="" data-ratio="0.8" data-w="1280" width="328px" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>说到数据结构算法的用处，当你用着java容器类很爽的时候，你有没有想过，怎么ArrayList像一个无限扩充的数组，也好像一个链表。好用吗？当然好用这就是数据结构的用处，只不过你在不知不觉中使用了。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>用于现实世界的存储，我们使用的工具和建模。每种数据结构有自己的优点和缺点，想想如果Google的数据用的是数组的存储，我们还能方便地查询到所需要的数据吗。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p></description></item><item><title>转载自【Java编程精选】Java Web架构知识整理——记一次阿里面试经历</title><link>https://pangyd.com/post/49-javajava-web/</link><pubDate>Thu, 10 Aug 2017 20:47:53 +0800</pubDate><guid>https://pangyd.com/post/49-javajava-web/</guid><description>&lt;p>&lt;br>&lt;/p>&lt;p>“你学习一门技术的最佳时机是三年前，其次是现在。”这话从来很灵验。经过这次面试，觉得需要整理下Java Web相关的资料，以便自己提高或者更快适应可能面临的新的工作。&lt;/p>&lt;p>首先谈谈Java Web需要掌握哪些东西。这里是一些知识点的搜集，暂不做详细说明，欢迎各位博友补充指正。&lt;/p>&lt;h2>&lt;strong>1.底层&lt;/strong>&lt;/h2>&lt;p>&lt;strong>&lt;br>&lt;/strong>&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>&lt;span>Java语言相关的就不说了，首先是JVM的结构和工作原理。比较重要的是Java内存模型，各种GC算法，Classloader的加载原理等。个人对底层的一些东西还算比较了解，所以不过多纠结，实际上程序编译链接过程以及二进制文件的处理还是很值得研究的。&lt;/span>&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;span>JVM监控及调优。作为一个开发人员并不一定需要非常熟悉JVM调优的方法，但如果具备JVM监控及调优的能力，将让你对程序运行状况了如指掌，对于问题定位也会敏感得多。&lt;/span>&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;span>Java多线程。对于线程安全的理解，以及如何在自己的程序中避免多线程造成的不一致问题等。&lt;/span>&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;span>I/O。Java中常常提到的是BIO/NIO，即阻塞型I/O与非阻塞型I/O，其实并不难理解，结合Linux中的同步I/O和异步I/O的实现原理，基本都是相通的，每种I/O方式解决的问题，又存在什么问题，为什么使用epoll。&lt;/span>&lt;/p>&lt;/li>&lt;/ul>&lt;h2>&lt;strong>&lt;br>&lt;/strong>&lt;/h2>&lt;h2>&lt;strong>2.Servlet&lt;/strong>&lt;/h2>&lt;p>&lt;br>&lt;/p>&lt;p>Servlet是运行于服务端的java程序，一般实现自己的Java服务端应用都从HttpServlet类继承，然后实现自己的init | doGet | doPost | service方法。Servlet的生命周期从其加载开始，首先执行一次初始化，调用init方法，之后便可运行自身的服务，当生命周期结束时，调用destroy方法回收资源，结束服务。&lt;/p>&lt;p>仅了解原理当然是不够的，还要实战能力，在IDE中写写简单的代码谁都会，然而真正让一个程序能够运行起来也还需要点其他的东西，这里我指的是Servlet的容器。servlet的容器有很多，常用的以Tomcat为例，安装好Tomcat后，在开发时必须包含进Tomcat的lib。IDE确实惯坏了好多人，目录如何组织，程序如何编译、如何部署这些问题都被IDE屏蔽掉了，如果要对整体有比较透彻的了解，建议一切从命令行动手。&lt;/p>&lt;p>具体可参考：《Servlet与JSP核心编程》。&lt;/p>&lt;h2>&lt;strong>3.框架&lt;/strong>&lt;/h2>&lt;p>&lt;br>&lt;/p>&lt;p>Java Web开发的用到的框架之多简直令人发指，而且因为版本的更新换代导致的问题也是层出不穷。然而这也是Web技术不断演化的结果，要么选择接受，要么引领节奏。&lt;/p>&lt;h3>Spring&lt;/h3>&lt;p>Spring是一个强大而又“轻量级”的Java开发框架，之所以打引号是因为感觉并不是那么轻量。Spring的主要目的在于简化Java应用开发，以配置方式代替硬编码方式的编程，模块解耦，其架构如下图所示。包括了数据访问、远程通信、AOP、核心容器等部分。&lt;/p>&lt;p>&lt;img class="" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" width="740" height="540" data-ratio="0.7297297297297297" data-w="740" data-type="png" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;strong>&amp;nbsp;Figure 1 Spring体系架构&lt;/strong>&lt;/p>&lt;p>Spring的核心主要有三点：&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>&lt;em>&lt;strong>IoC&lt;/strong>&lt;/em>：反转控制。&lt;/p>&lt;/li>&lt;/ul>&lt;p>反转控制就是指将控制权由类内部抽离到容器，由容器类的实例化及动作进行配置管理。&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>&lt;strong>&lt;em>Dependency-injection&lt;/em>&lt;/strong>：依赖注入&lt;/p>&lt;/li>&lt;/ul>&lt;p>对象的依赖关系由负责协调系统中各个对象的第三方组件在创建对象时设定。对象不自行创建或管理它们的依赖关系，依赖关系被自动注入到需要它们的对象中。通过参数和配置能够体会出“注入”这个词在这里有多形象。依赖注入的最大好处就是松耦合。不需要再类内部去和特定的类进行绑定，而是将一些依赖关系以参数的形式注入到类内部。&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>&lt;em>&lt;strong>Aspect Oriented Programming&lt;/strong>&lt;/em>：面向切向编程&lt;/p>&lt;/li>&lt;/ul>&lt;p>在软件开发中，分布于应用中多处的功能被称为横切关注点。这些横切关注点往往和业务逻辑是相分离的，将这些横切关注点与业务逻辑相分离正式AOP要解决的。AOP编程能够让遍布在应用各处的功能分离出来形成可重用的组件。是高内聚低耦合的又一个体现，将通用实现模块与核心业务模块相分离。&lt;/p>&lt;p>具体参考：《Spring In Action》&lt;/p>&lt;h2>&lt;strong>Hibernate&lt;/strong>&lt;/h2>&lt;p>&lt;br>&lt;/p>&lt;p>数据持久化框架其实也有很多，需要掌握的不仅是Hibernate，只是因为Hibernate在以前的企业级应用中用的比较多而已，另外MyBatis也占有相当重要的份额。Hibernate是一个全自动的持久化框架，并不是那么方便，所以很多开发者更倾向于使用MyBatis，淘宝就是这样。&lt;/p>&lt;p>Hibernate的工作流程：首先通过configuration对象读取配置文件；解析映射信息，创建StandardSessionFactory；调用openSession打开session；创建事务transaction，之后进行持久化操作；完成后提交事务，关闭session，关闭sessionFactory。&lt;/p>&lt;p>&lt;img class="" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" width="571" height="601" data-ratio="1.052539404553415" data-w="571" data-type="png" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;strong>&amp;nbsp;Figuer 2 Hibernate工作流程&lt;/strong>&lt;/p>&lt;p>要理解ORM的理念：ORM意为对象关系映射。是一种为了解决程序的面向对象模型与数据库关系模型互不匹配问题的技术。&lt;/p>&lt;p>hibernate中比较重要的是对象的4种状态转换及条件。分别是transient瞬时态、persistent持久态、detached游离态和移除态，状态转换如下：&lt;/p>&lt;p>&lt;img class="" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" width="860" height="514" data-ratio="0.5976744186046512" data-w="860" data-type="png" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;strong>&amp;nbsp;Figure 3 Hibernate对象状态转换图&lt;/strong>&lt;/p>&lt;h2>&lt;strong>Struts 2&lt;/strong>&lt;/h2>&lt;p>&lt;br>&lt;/p></description></item></channel></rss>