sifanchao的博客

什么都有比什么都没有更可怕!只有肯用心、持之以恒,就走在成功的路上。
私信 关注
sifanchao
码龄3年
  • 198,135
    被访问量
  • 210
    原创文章
  • 23,416
    作者排名
  • 100
    粉丝数量
  • 于 2018-03-18 加入CSDN
获得成就
  • 获得210次点赞
  • 内容获得26次评论
  • 获得657次收藏
荣誉勋章
兴趣领域
  • #前端
    #JavaScript#CSS#WebPack#HTTPS#Node.js#Flutter#React.js#ECMAScript 6#XHTML#面试#TypeScript#前端框架#Vue.js#小程序
TA的专栏
  • 前端
    14篇
  • leetcode
    8篇
  • 自传
    1篇
  • c编程习题
    43篇
  • c项目
    4篇
  • c基础总结
    19篇
  • 数据结构
    18篇
  • 剑指offer
    23篇
  • Linux
    17篇
  • c++
    22篇
  • 每日一题
    14篇
  • 网络
    2篇
  • Java
    38篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

浏览器

浏览器是如何渲染UI的浏览器获取HTML文件,然后对文件进行解析,形成DOM Tree与此同时,进行CSS解析,生成Style Rules接着将DOM Tree与Style Rules合成为 Render Tree接着进入布局(Layout)阶段,也就是为每个节点分配一个应出现在屏幕上的确切坐标随后调用GPU进行绘制(Paint),遍历Render Tree的节点,并将元素呈现出来浏览器重绘与重排的区别重排: 部分渲染树(或者整个渲染树)需要重新分析,并且节点尺寸需要重新计算,表现为重
原创
138阅读
0评论
0点赞
发布博客于 9 月前

ajax

AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:创建XMLHttp
原创
121阅读
0评论
0点赞
发布博客于 9 月前

前端网络安全

有哪些可能引起前端安全的的问题跨站脚本 (Cross-Site Scripting, XSS): 一种代码注入方式, 为了与 CSS 区分所以被称作 XSS. 早期常见于网络论坛, 起因是网站没有对用户的输入进行严格的限制, 使得攻击者可以将脚本上传到帖子让其他人浏览到有恶意脚本的页面, 其注入方式很简单包括但不限于 JavaScript / VBScript / CSS / Flash 等iframe的滥用: iframe中的内容是由第三方来提供的,默认情况下他们不受我们的控制,他们可以在ifram
原创
361阅读
0评论
0点赞
发布博客于 9 月前

Webpack

webpack与grunt、gulp的不同Grunt、Gulp是基于任务运行的工具它们会自动执行指定的任务,就像流水线,把资源放上去然后通过不同插件进行加工,它们包含活跃的社区,丰富的插件,能方便的打造各种工作流。Webpack是基于模块化打包的工具自动化处理模块,webpack把一切当成模块,当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。webpack
原创
127阅读
0评论
0点赞
发布博客于 9 月前

js模块化解决方案规范

AMD是由RequireJS推动一个异步加载模块的规范,通过define定义模块,require去引用模块推崇依赖前置,在定义模块的时候就要声明其依赖的模块,提前执行CMD是由SeaJS推动的模块化规范,推崇一个模块一个文件,通过define定义模块,seajs.use来加载模块推崇就近依赖,只有在用到某个模块的时候再去require,延迟执行CommenJS是一种同步加载模块的规范,被nodejs推广开,使用module.exports和require开发UMD是AM..
原创
141阅读
0评论
0点赞
发布博客于 9 月前

Vue中的key到底有什么用

key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确、更快速。diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行比对,然后找出差异。diff过程可以概括为:oldCh和newCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx>EndIdx表明oldC
原创
306阅读
0评论
0点赞
发布博客于 9 月前

虚拟DOM

为什么使用虚拟DOM因为真实dom的实现内容太多了,如果直接操作真实dom对象,对性能是巨大的浪费。虚拟dom就是一个简化后的dom对象,只存储了重要的参数。virtual dom很多时候都不是最优的操作,但它具有普适性,在效率、可维护性之间达平衡。虚拟dom类似于计算机中的缓存。包括几个步骤:用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异把2所记录
原创
94阅读
0评论
0点赞
发布博客于 9 月前

Vue是如何实现双向绑定的

vue的双向绑定指的是数据变化更新视图,视图变化更新数据。视图变化更新数据一般就采用事件监听的方式就可以了,数据变化更新视图就需要涉及响应式原理。vue2.x的响应式原理的基础是Object.defineProperty属性。利用Object.defineProperty劫持对象的访问器,在属性值发生变化时我们可以获取变化,然后根据变化进行后续响应,在vue3.0中通过Proxy代理对象进行类似的操作。Vue三要素双向绑定其实已经是一个老掉牙的问题了,只要涉及到MVVM框架就不得不谈的知识点,但它毕
原创
310阅读
0评论
0点赞
发布博客于 9 月前

computed和watch有什么区别

computedcomputed是计算属性,也就是计算值,它更多用于计算值的场景computed具有缓存性,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算computed适用于计算比较消耗性能的计算场景watch更多的是「观察」的作用,类似于某些数据的监听回调,用于观察props $emit或者本组件的值,当数据变化时来执行回调进行后续操作无缓存性,页面重新渲染时值不变化也会执行当需要
原创
388阅读
0评论
0点赞
发布博客于 9 月前

Vue组件如何通信

如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与E是堂兄关系(非直系亲属) 针对以上关系我们归类为:父子组件之间通信非父子组件之间通信(兄弟组件、隔代关系组件等)Vue组件通信的方法如下:props/$emit+v-on: 通过props将数据自上而下传递,而通过$emit和v-on来向上传递信息。prop 只可以从上一级组件传递到下一级组件(父子组件),即所谓的单向数据流。而且 prop 只读,不可被修改,所有修改.
原创
99阅读
0评论
0点赞
发布博客于 9 月前

Vue的生命周期

Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载等一系列过程,我们称这是Vue的生命周期。各个生命周期的作用生命周期描述beforeCreate组件实例被创建之初,组件的属性生效之前created组件实例已经完全创建,属性也绑定,但真实dom还没有生成,$el还不可用beforeMount在挂载开始之前被调用:相关的 render 函数首次被调用mountedel 被新创建的
原创
116阅读
0评论
0点赞
发布博客于 9 月前

Vue中的MVVM

MVVM 模式,顾名思义即 Model-View-ViewModel 模式。它萌芽于2005年微软推出的基于 Windows 的用户界面框架 WPF ,前端最早的 MVVM 框架 knockout 在2010年发布。Model 层:对应数据层的域模型,它主要做域模型的同步。通过 Ajax/fetch 等 API 完成客户端和服务端业务 Model 的同步。在层间关系里,它主要用于抽象出 ViewModel 中视图的 ModelView 层:作为视图模板存在,在 MVVM 里,整个 View 是一个动态
原创
65阅读
0评论
0点赞
发布博客于 9 月前

字符串转换整数 (atoi)

思路:去掉前导空格处理正负号识别数字,处理越界情况。/** * @param {string} str * @return {number} */var myAtoi = function(str) { var charArr = str.split("") var len = str.length var index = 0 // 去掉前导空格 while(index < len && charArr[index] == .
原创
65阅读
0评论
0点赞
发布博客于 9 月前

整数反转

class Solution {public: int reverse(int x) { long n = 0; while(x){ n = n * 10 + x % 10; x /= 10; } return (int)n == n ? (int)n : 0; }};
原创
71阅读
0评论
0点赞
发布博客于 9 月前

CSS基础

元素的宽度 = margin-left + border-left + padding-left + width + padding-right + border-right + margin-right
原创
103阅读
0评论
0点赞
发布博客于 9 月前

HTML基础

doctype的作用是什么(重要)DOCTYPE是 html5 标准网页声明,且必须声明在HTML文档的第一行。来告知浏览器的解析器用什么文档标准解析这个文档,不同的渲染模式会影响到浏览器对于 CSS 代码甚至 JavaScript 脚本的解析。文档解析类型有:BackCompat:怪异模式,浏览器使用自己的怪异模式解析渲染页面。(如果没有声明DOCTYPE,默认就是这个模式)CSS1Compat:标准模式,浏览器使用W3C的标准解析渲染页面。IE8还有一种介乎于上述两者之间的近乎标准的模式,但是
原创
138阅读
0评论
0点赞
发布博客于 9 月前

Z 字形变换

class Solution {public: string convert(string s, int numRows) { vector<string> temp(numRows); string res; if(s.empty() || numRows < 1) return res; if(numRows == 1) return s; for(int i = 0; i < s.siz.
原创
86阅读
0评论
0点赞
发布博客于 9 月前

最长回文子串

方案一:暴力依次遍历字符串,取出一组。然后将取出的子串进行反转。比较两个字符串是否相等。如果相等,则记录此时的长度。知道遍历完所有字符串的可能性。返回max最大长度即可/** * @param {string} s * @return {string} */var longestPalindrome = function(s) { if(s.length < 2){ return s } var max = s[0] for(var i =.
原创
56阅读
0评论
0点赞
发布博客于 9 月前

使用canvas绘制一个时钟

准备工作,设置基准设置表钟的表心位置坐标(x,y)和表钟大小(r)。创建canvas,使用getContext() 方法返回canvas对象。得到时分秒表针每走一步的度数,用来绘制扇形初始化起始位置时针因为一共12格,所以每走一步的度数为 30°分针一共60格,所以一步为 6°秒针6°为了修饰,当秒针走了10秒时,分钟多一度;同理分针走了2分钟时,时针多一度。绘制一个小刻度的扇形绘制白色表盘用白色表盘盖住上一个扇形圆,生成一个带有刻度的新扇形圆绘制大刻度绘制小白色表盘绘
原创
228阅读
0评论
0点赞
发布博客于 9 月前

寻找两个正序数组的中位数

方案一:暴力新建一个大小为(m+n)的数组,将两个数组的值插入到新的数组,然后进行排序,最后根据奇偶返回中位数。class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { vector<int> nums3; nums3.insert(nums3.end(),nums1.begi.
原创
542阅读
0评论
0点赞
发布博客于 9 月前

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

因为字符串是由每个字符组成,而字符一共只有128个。所以我们创建一个字符数组(new Array(128)),将字符串的字符一个一个先进行ASCII转化,如果当前字符所对应字符数组的值为0,那么说明该字符没有出现,此时将此位置置为1。依次进行比较,如果字符对应字符数组的对应位置值为1,那么说明该字符为重复的,此时返回遍历值i即可。/** * @param {string} s * @return {number} */var lengthOfLongestSubstring = function(
原创
147阅读
0评论
0点赞
发布博客于 9 月前

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的

思路:1.判断链表是否为空,如果是空,返回相反的链表就是结果2.依次取出两个链表的值进行相加,如果不用进位,就依次插入下一个节点(newList.next=函数(l1.next,l2.next)) ,递归地调用),然后返回链表即可。3.如果计算进位,先算这一位进位后的结果newList;再计算下一位要加多少carry;其次在考虑不进位的条件下,下一位的结果current;最后把carry 和 current 做加和,也就是下一位数插入下一个节点(newList.next=函数(carry, curre
原创
242阅读
0评论
0点赞
发布博客于 9 月前

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。方案一:暴力求解直接进行嵌套循环比较两数的和是否为目标值如果是,对应值的下标此时时间复杂度因为进行嵌套循环,复杂度为O(n^2)/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function(nums, target) { f
原创
237阅读
0评论
0点赞
发布博客于 9 月前
C语言操作符总结
发布Blink于 2 年前

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《7 个有用JavaScript技巧》, 一起来围观吧 https://blog.csdn.net/qq_43258252/article/details/94737380

 
发布Blink于 2 年前

Java类集

Java类集引出类集实际上就属于动态对象数组,在实际开发之中,数组的使用出现的几率并不高,因为数组本身有一个最大的缺陷:数组长度是固定的。由于此问题的存在,从JDK1.2开始,Java为了解决这种数组长度问题,提供了动态的对象数组实现框架–Java类集框架。Java集合类框架实际上就是java针对于数据结构的一种实现。实际上链表的实现就是参考Java集合类实现的。Collection在Ja...
原创
124阅读
0评论
0点赞
发布博客于 3 年前

Java类集

Java类集引出类集实际上就属于动态对象数组,在实际开发之中,数组的使用出现的几率并不高,因为数组本身有一个最大的缺陷:数组长度是固定的。由于此问题的存在,从JDK1.2开始,Java为了解决这种数组长度问题,提供了动态的对象数组实现框架–Java类集框架。Java集合类框架实际上就是java针对于数据结构的一种实现。实际上链表的实现就是参考Java集合类实现的。Collection在Ja...
原创
124阅读
0评论
0点赞
发布博客于 3 年前

序列化与反序列化

序列化基本概念定义:将内存中保存的对象变为二进制数据流的形式进行传输或保存在文本中。实现:Java中类若要被序列化输出,该类必须实现Serializable接口。该接口是一个标识接口,表示该类具有序列化的功能。public interface Serializable {}序列化与反序列化操作要想实现序列化与反序列化的对象操作,需要使用io包提供的两个类ObjectOutputStr...
原创
109阅读
0评论
0点赞
发布博客于 3 年前

内存操作流&打印流&输入流(Scanner)

内存操作流定义:除了文件之外,IO操作也可以发生在内存中,发生在内存中的操作流称为内存流。文件流的操作里面一定会产生一个文件数据(不管后这个文件数据是否被保留)。如果现在需求是:需要进行IO处理,但是又不希望产生文件,这种情况下就可以使用内存作为操作终端。内存流也分为两类:字节内存流:ByteArrayInputStream、ByteArrayOutputStream字符内存流:Ch...
原创
306阅读
0评论
0点赞
发布博客于 3 年前

文件拷贝

转换流现在为止已经知道了两种数据流:字节流和字符流。实际上这两种流是可以进行互相转换处理的。OutputStreamWriter:将字节输出流变为字符输出流(Writer对于文字的输出要比OutputStream方 便)InputStreamReader:将字节输入流变为字符输入流(InputStream读取的是字节,不方便中文的处理)要想知道这两个类的实际意义,我们首先来看这两个类的...
原创
108阅读
0评论
0点赞
发布博客于 3 年前

Java I/O

IO的核心组成就是五个类(File、 OutputStream、InputStream、Reader、Writer) 一个接口(Serializable)File文件操作类在Java.io包之中,File类是唯一一个与文件本身操作(创建、删除、取得信息…)有关,与文件内容无关的的程序类。File类即可以描述真实文件,也可以是个文件夹File类使用File类的两种实例化方式:publ...
原创
99阅读
0评论
0点赞
发布博客于 3 年前

ClassLoader类加载器

Class类描述的是整个类的信息,在Class类中提供的forName()方法,这个方法根据ClassPath配置的路径进行类的 加载,如果说现在你的类的加载路径可能是网络、文件,这个时候就必须实现类加载器,也就是ClassLoader类的 主要作用。认识ClassLoader首先通过Class类观察如下方法: /** * Returns the class loader f...
原创
140阅读
0评论
0点赞
发布博客于 3 年前

反射

认识发射反射指的是对象的反向处理操作,根据对象倒推类的组成。既然是反向处理,我们先来观察一下&quot;正&quot;的操作。在默认情况下,必须要先导入一个包,而后才能产生类的实例化对象范例:观察正常处理import java.util.Date;public class Test { public static void main(String[] args) throws Exception{...
原创
89阅读
0评论
0点赞
发布博客于 3 年前

线程池

概念Java中的线程池(juc包下)是运用场景多的并发框架,几乎所有需要异步或者并发执行任务的程序都可以使用线程池。使用线程池的有三个优点:降低资源的消耗:通过重复利用已创建的线程降低线程创建和销毁带来来的消耗提高响应速度:当新任务到达时,任务可以不需要等待线程创建就可以立即执行提高线程的可管理性:使用线程池可以统一进行线程分配、调度与监控线程池的实现原理当一个Runnabl...
原创
95阅读
0评论
2点赞
发布博客于 3 年前

Condition的await和signal等待/通知机制

Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如 wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制。同样的, 在 java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...
原创
146阅读
0评论
0点赞
发布博客于 3 年前

读写锁ReentranReadWriteLock

读写锁简介在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字 synchronized或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并不会影响数据正确性(出现脏读),而如果在这种业务场...
原创
344阅读
0评论
0点赞
发布博客于 3 年前

ReentrantLock

ReentrantLock介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。...
原创
82阅读
0评论
0点赞
发布博客于 3 年前

AQS详解

AQS简介在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义。AQS 则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些特性的实现,而这些实际上则是AQS提供出来的模板方法。同步队列当共享资源被...
原创
10429阅读
0评论
20点赞
发布博客于 3 年前

Lock体系

Lock简介锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在Lock接口出现之前,java程序主要是靠synchronized关键字实现锁功能的,而JDK5之后,并发包中增加了lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以...
原创
229阅读
0评论
0点赞
发布博客于 3 年前

synchronized优化

序言在JDK1.5中,synchronized是性能低效的。因为这是一个重量级操作,它对性能大的影响是阻塞的是实现,挂起 线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。相比之下使用Java 提供的Lock对象,性能更高一些。import java.util.concurrent.locks.Lock;import java.util.concurrent...
原创
2211阅读
0评论
2点赞
发布博客于 3 年前

synchronized 同步

同步问题的引出需求:多个线程同时卖票class MyThread implements Runnable { private int ticket = 10; @Override public void run() { while (this.ticket &amp;amp;amp;gt; 0) { try { ...
原创
545阅读
0评论
1点赞
发布博客于 3 年前

多线程常用操作

线程命名与取得多线程的运行状态是不确定的,所以对于多线程操作必须有一个明确标识出线程对象的信息,这个信息往往通过名称来描述。在Thread类中提供有如下的线程名称方法:class MyThread implements Runnable { @Override public void run() {}}public class TestThread { publi...
原创
169阅读
0评论
0点赞
发布博客于 3 年前

多线程的实现

继承Thread类实现多线程java.lang.Thread是一个线程操作的核心类。新建一个线程简单的方法就是直接继承Thread类,而后覆写该类中的 run()方法(就相当于主类中的main方法)package www.bit.java;class MyThread extends Thread { private int ticket = 100; @Override...
原创
99阅读
0评论
0点赞
发布博客于 3 年前

方法引用

从最初开始,只要是进行引用都是针对于引用类型完成的,也就是只有数组、类、接口具备引用操作。但是JDK1.8 开始追加了方法引用的概念。实际上引用的本质就是别名。所以方法的引用也是别名的使用。而方法引用的类型有四种形式:引用静态方法:类名称::static 方法名称@FunctionalInterfaceinterface IUtil&lt;R,N&gt; { R switchPara...
原创
469阅读
0评论
0点赞
发布博客于 3 年前

Lambda表达式和接口增强

Lambda表达式Lambda是JDK1.8推出的重要新特性。很多开发语言都开始支持函数式编程,其中最具备代表性的就是haskell。函数式编程和面向对象编程可以理解为两大开发阵营。很多人认为面向对象的概念过于完整,结构操作不明确。我们编写一个简单的加法程序为例当我们如果不仅使用x+y方法时,比如说想扩展x+y+10方法时,我们会发现,我们需要像函数重载一样编写多个函数。packag...
原创
80阅读
0评论
0点赞
发布博客于 3 年前

注解

@Override 准确覆写当子类覆写父类方法时,此注解检查覆写的方法是否正确声明,只有满足覆写方法要求才会编译通过,否则编译报错。class Person { @Override public String toString(){ return "hello world"; }}public class MyEnum { public st...
原创
70阅读
0评论
0点赞
发布博客于 3 年前

枚举

如果此时需要定义一个描述颜色基色的多例类。我们通过多例模式实现。多例设计模式特点:构造方法私有化,类内部需要提供若干个实例化对象,后面通过statica方法返回。package www.bit.java;class Color { private String title; public static final int RED_FLAG = 1 ; public ...
原创
56阅读
0评论
0点赞
发布博客于 3 年前

双向链表设计

interface ILink { /** * 链表增加节点操作 * @param data 节点内容 * @return */ boolean add(Object data); /** * 判断指定内容节点在链表中是否存在 * @param data 要判断的内容 * @return 返回找到的...
原创
211阅读
0评论
0点赞
发布博客于 3 年前

包装类

定义包装类就是将基本数据类型封装到类中,目的是为了让基本类型也能让Object来接收。class IntDemo { private int intValue; public IntDemo(int intValue) { this.intValue = intValue; } public int intValue() { re...
原创
966阅读
0评论
0点赞
发布博客于 3 年前

Object类

Object是java默认提供的类java除了Object类,所有的类都存在继承关系,默认会继承Object父类,所以所有类对象都可以通过Object类进行接收(向上转型)class A {}class B {}public class Test { public static void main(String[] args) throws Exception { ...
原创
71阅读
0评论
0点赞
发布博客于 3 年前

String类

String类的实例化方式直接赋值,在堆上分配空间传统方法,构造方法实例化public class Test { public static void main(String[] args) { // 直接复制,在堆上分配空间 String str = "hello"; // 通过构造方法实例...
原创
93阅读
0评论
0点赞
发布博客于 3 年前

代理模式

特点两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。import java.lang.reflect.Proxy;import java.util.Scanner;import java.util.concurrent.PriorityBlockingQueue;import javax.security.auth.Subject;in...
原创
51阅读
0评论
0点赞
发布博客于 3 年前

工厂模式

思考如下场景:有一天,刘同学准备去买笔记本,他到商城发现有两款电脑他特别喜欢, 一款是 Macbook Pro, 另一款是 Surface Pro。请同程序实现!简单工厂模式:用于没有产品族并且产品个数较少(Spring-BeanFactory)定义:专门定义一个类(第三方)用来创建其他类实例(解耦,将客户端创建对象的操作解耦到外部第三方类中),被创建的实例通常都具有共同的父类组成:一...
原创
99阅读
0评论
0点赞
发布博客于 3 年前

接口

接口的定义与使用接口优先原则:在一个操作既可以使用抽象类又可以使用接口的时候,优先考虑使用接口接口定义:接口就是一个抽象方法与全局常量的集合(纯粹版本的抽象类(JDK8前))接口使用:interface + 类名接口的命名规范:接口前加 I 来区分接口与类interface IMyinterface { public static final String MSG ...
原创
62阅读
0评论
0点赞
发布博客于 3 年前

模板设计模式

模板设计模式—基于抽象类的,核心是封装算法模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现模板(模板方法)模式(Servlet、AQS)在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的基础上,重新具体定义算法中的某些步骤讲模板设计模式之前,我们用代码来实现咖啡和茶制作的类:class Coffee {...
原创
6539阅读
4评论
31点赞
发布博客于 3 年前

抽象类

抽象类的使用与定义定义:抽象类只是在普通类的基础上扩充了一些抽象方法而已抽象方法:指的是只声明而未实现的方法(没有方法体)所有抽象方法要求使用abstract来定义,并且抽象方法所在的类也一定要使用abstract来定义,表示抽象类abstract class Person{ private String name ; // 属性 public ...
原创
63阅读
0评论
0点赞
发布博客于 3 年前

内部类

基本概念在类内部进行其他类结构嵌套操作class Outer{ private String msg = "Hello World" ; // ******************************** class Inner{ //定义一个内部类 public void print(){ //定义一个普通方...
原创
162阅读
0评论
0点赞
发布博客于 3 年前

多态

概念指的是类实例的相同方法在不同情形下有不同的表现形式多态机制使得具有不同内部结构的对象可以共享相同的外部接口(利用多态可以得到良好的设计)覆写(重写)定义子类定义了与父类方法名称、参数列表、返回值完全相同的方法 。被覆写的方法不能拥有比父类更为严格的访问控制权限重写规则参数列表必须完全与被重写方法的相同;返回类型必须完全与被重写方法的返回类型相同;访问权限不能比父类中被重...
原创
333阅读
0评论
0点赞
发布博客于 3 年前

继承

基本概念可以实现现有类的所有功能并且在无需重新编写原有类代码的情况下继承进行功能上的扩展(可重用)class 父类 {}class 子类 extends 父类 {}判断两个类之间能否使用继承:isaJava中类继承使用extends关键字子类派生类,父类称为超类/基类class Person{ private String name; p...
原创
87阅读
0评论
1点赞
发布博客于 3 年前

代码块

代码码块的定义与使用根据代码出现是位置以及关键字,分为以下四种代码块:普通代码块构造快静态块同步代码块普通代码跨块(定义在方法中的代码块)public class Test{ public static void main(String[] args) { { //直接使用{}定义,普通方法块 ...
原创
56阅读
0评论
0点赞
发布博客于 3 年前

static关键字

static关键字static变量–类属性(静态属性)static属性称为类属性,保存在全局数据区中(方法区:所有对象共享区域)通过类名调用,与对象实例化无关默认值为NULL描述共享属性使用static属性public staticclass Person{ static String Country = "中华民国"; String name; ...
原创
65阅读
0评论
0点赞
发布博客于 3 年前

类与对象

面向对象三大特征:封装性将客观事物封装成为抽象的类,每个类都有自己的属性与方法,并且类可以让自己的数据与方法只让可信的类或对象操作,对不可信的进行信息隐藏。内部操作对外而言不可见(强调保护性)继承性可以实现现有类的所有功能并且在无需重新编写原有类代码的情况下继承进行功能上的扩展(可重用)多态性指的是类实例的相同方法在不同情形下有不同的表现形式多态机制使...
原创
71阅读
0评论
0点赞
发布博客于 3 年前

Java运算符

Java 运算符计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符算术运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。表格中的实例假设整数变量A的值为10,变量B的值为20:...
原创
56阅读
0评论
0点赞
发布博客于 3 年前

Java数据类型

基本数据类型在程序开发之中,整数就用int,描述小数用double。long一般用于描述日期、时间、内存或文件大小(字节)如果要进行编码转换或者进行二进制流的操作,使用byte(-127~128)char一般在描述中文中会用到(基本忽略)整型在Java中,任何一个整型常量都为int型整型常量若要声明为long类型,需要在数字后加上“L”或者“l”在Java中小的数据类型与大...
原创
69阅读
0评论
0点赞
发布博客于 3 年前

Java基本语法

Java基本语法编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。源文件名:源文件...
原创
57阅读
0评论
0点赞
发布博客于 3 年前

Java初识

Java简介Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java分为三个体系:JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)JavaEE (J2EE)(Java 2 Platfor...
原创
69阅读
0评论
1点赞
发布博客于 3 年前

高性能服务器架构

本文将与你分享我多年来在服务器开发方面的一些经验。对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或者请求的服务程序,网络服务器更符合这种情况,但并非所有的网络程序都是严格意义上的服务器。使用“高性能请求处理程序”是一个很糟糕的标题,为了叙述起来简单,下面将简称为“服务器”。  本文不会涉及到多任务应用程序,在单个程序里同时处理多个任务现在已经很常见。比如你的浏览器可能就在做一些并...
转载
2533阅读
0评论
0点赞
发布博客于 3 年前

字符串的旋转

用 “[ ]”按特定位置访问逐字符拷贝class StringRotation {public: string rotateString(string A, int n, int p) { int i,j=0; string B; for(i=p+1;i&lt;n;i++){ B[j++]=A[i]; ...
原创
101阅读
0评论
0点赞
发布博客于 3 年前

解释型语言与编译型语言的区别

编译型语言,在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言)。...
原创
883阅读
0评论
3点赞
发布博客于 3 年前

智能指针

智能指针背后思想void remodel(std::string &amp; str){ std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return;}...
原创
70阅读
0评论
0点赞
发布博客于 3 年前

死锁

死锁概念死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁产生的条件1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该...
原创
97阅读
0评论
0点赞
发布博客于 3 年前

删除链表的节点

给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。//假设前提:要删除的节点的确在链表中//时间复杂度:[(n-1)*O(1)+O(N)]/n,结果还是O(1)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), nex...
原创
71阅读
0评论
0点赞
发布博客于 3 年前

打印从1到最大的n位数

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。void Print1ToMaxofNDigits(int n){ int number=1; while(n--) number*=10; for(int i=1;i&lt;number;++i) printf("%d\t"...
原创
910阅读
0评论
2点赞
发布博客于 3 年前

数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不能使用库函数,同时不需要考虑大数问题。class Solution {public: double Power(double base, int exponent) { double result=1.0; for(int i=1;i&l...
原创
58阅读
0评论
0点赞
发布博客于 3 年前

二进制中1的个数

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。例如,把9表示成二进制是1001,有2位为1。因此,如果输入9,则该函数输出2。class Solution {public: int NumberOf1(int n) { int count=0; while(n){ if(n&amp;1...
原创
78阅读
0评论
0点赞
发布博客于 3 年前

减绳子

给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n&gt;1并且m&gt;1)每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18。动态规划首先定义函数f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。在剪第一刀时,我们有n-...
原创
513阅读
1评论
0点赞
发布博客于 3 年前

动态规划与贪婪算法

一个问题是该用递推、贪心、搜索还是动态规划,完全是由这个问题本身阶段间状态的转移方式决定的!每个阶段只有一个状态-&gt;递推;每个阶段的最优状态都是由上一个阶段的最优状态得到的-&gt;贪心;每个阶段的最优状态是由之前所有阶段的状态的组合得到的-&gt;搜索;每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的-&gt;动态规划。每个阶段的最...
原创
747阅读
0评论
2点赞
发布博客于 3 年前

机器人的运动范围

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?首先,这个方格可以看成是一个m*n的矩阵。同样,在这...
原创
161阅读
0评论
0点赞
发布博客于 3 年前

矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 下面 这样的3 X 4 矩阵中包含一条字符串”bfce”的路径,但是矩阵中不包含”abfb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路...
原创
77阅读
0评论
0点赞
发布博客于 3 年前

旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。采用二分法解答这个问题,mid = low + (high - low)/2 需要考虑三种情况: (1)array[...
原创
46阅读
0评论
0点赞
发布博客于 3 年前

对一个公司所有员工的年龄排序,要求时间复杂度O(N)

void SortAges(int ages[], int size){ if (ages == NULL || size &lt;= 0) return; const int OldestAge = 99;//定义最大年龄为99岁 int timesOfAge[OldestAge + 1]; for (int i = 0; i &lt;= Ol...
原创
429阅读
0评论
0点赞
发布博客于 3 年前

青蛙跳台阶问题

一只青蛙一次可以跳1级台阶,也可以跳两级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法。思路:首先考虑n等于0、1、2时的特殊情况,f(0) = 0 f(1) = 1 f(2) = 2其次,当n=3时,青蛙的第一跳有两种情况:跳1级台阶或者跳两级台阶假如跳一级,那么 剩下的两级台阶就是f(2);假如跳两级,那么剩下的一级台阶就是f(1),因此f(3)=f(2)+f(1)...
原创
156阅读
0评论
0点赞
发布博客于 3 年前

斐波那契数列

方法1:直接递归long long Fibonacci(unsigned i){ if(i&lt;=0) return 0; if(i==1) return 1; return Fibonacci(i-1)+Fibonacci(i-2);}上述方法有很严重的效率问题。计算的节点数会随着i的增大而急剧增加,这意味着计算量会随...
原创
162阅读
0评论
0点赞
发布博客于 3 年前

用两个队列实现一个栈

思路: 创建两个队列q1、q2,放数据的时候只给当前空队列放数据。 拿出数据时,从当前有数据的队列不断往空队列里压数据,直到剩余一个元素时,这是弹出的数据就是所要数据,满足后进先出的原则。template &lt;typename T&gt;class CStack{public: CStack(void) {} ~CStack(void) {} ...
原创
78阅读
0评论
0点赞
发布博客于 3 年前

用两个栈实现一个队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路: 创建两个栈s1、s2,其中一个栈(s1)只管压栈数据,另一个栈(s2)出数据。所以问题就好解决了!需要考虑的就是什么时候从s2出栈。两种情况: 1.当s2为空栈时,需要将s1的数据全部倒过来,然后出栈s2。 2.当s2不为空栈时,直接从s2出栈。 最后从s2出的数据就是满足后进先出(队列...
原创
91阅读
0评论
0点赞
发布博客于 3 年前

二叉树的下一个节点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。如果节点存在右子树那么它的下一个节点就是它的右子树中的最左子节点。也就是说,从右子节点出发一直沿着指向左子节点的指针,就能找到它的下一个节点。如:节点d 下一个节点是h。节点没有右子树如果节点是它父节点的左子节点,那么它的下一个节点就是它...
原创
53阅读
0评论
0点赞
发布博客于 3 年前

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回分析熟悉二叉树前序&amp;中序遍历规则 前序遍历规则:遍历根节点—-&gt;遍历根节点的左子树—-&gt;遍历根节点的右子树 中序遍历规则:遍历...
原创
62阅读
0评论
0点赞
发布博客于 3 年前

从尾到头打印链表

思路:栈的思想。遍历链表时每经过一个节点,就把该节点放到栈中。当遍历完整个链表的时候,再从栈中逐个输出节点的值,此时的节点的顺序已经反转过来了。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x),...
原创
55阅读
0评论
0点赞
发布博客于 3 年前

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null

此问题包含两个步骤:(1)判断链表中是否有环(2)找出环一、选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,此时可返回其在环中的相遇点。二、1)当相遇的时候,设慢指针在环中走了k步,设环之外的部分长为x,环的长度为c,则快指针一共走了 x+m1*c+k步,(m1为快指针在环中走的圈数),慢指针一共走了x+m2*c+k(m2为快指...
原创
1299阅读
0评论
0点赞
发布博客于 3 年前

面试题:UDP&TCP的区别

相同点UDP协议和TCP协议都是传输层协议。TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP(User Data Protocol,用户数据报协议...
原创
64232阅读
8评论
77点赞
发布博客于 3 年前

面试题:进程&线程的区别

进程是操作系统资源分配的最小单位。他是程序执行的一次实例。线程是CPU**调度**的最小单位。他是进程的一个执行流。进程有自己独立的地址空间,每启动一个进程,系统就会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段。线程是共享进程的所有资源的,每个线程有自己的堆栈和局部变量(堆栈和上下文数据)。因此创建一个线程比进程开销小。多进程程序更健壮, 多线程程序只要有一个线程死掉,整个进程也...
原创
181阅读
0评论
0点赞
发布博客于 3 年前

高级IO

五种IO模型阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式.非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码.信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作IO多路转接: 虽然从流程图上看起来和阻塞IO类似. 实际上最核心在于IO多路转接能够同时等...
原创
77阅读
0评论
0点赞
发布博客于 3 年前

进程间关系和守护进程

进程组每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。 组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。...
原创
347阅读
0评论
0点赞
发布博客于 3 年前

排序

排序算法稳定性如果在元素序列中有两个元素R[i]和R[j],它们的排序码K[i] == k[j],且在排序之前,元素R[i]在R[j]的前面。如果在排序之后,元素R[i]仍在R[j] 之前,则称这个排序算法是稳定的,否则称这个排序算法是不稳定的。内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序...
原创
113阅读
0评论
0点赞
发布博客于 3 年前

海量数据问题

哈希切割top K问题给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP? (1)文件太大,100G,肯定不可能一次加载到内存进行处理,这里就必须将文件进行切割了,可是依据哪种方法进行切割呢?假设只是从前到后等份切割的话,将文件切割n份(切割的份数依据所给的内存大小),第一份中假设IP地址为...
原创
111阅读
0评论
0点赞
发布博客于 3 年前

STL

STLSTL(standard template libaray ):标准模板库,是C++程序设计语言的标准程序库, 是一个包罗算法与数据结构的软件框架STL的目的是标准化组件,所以在STL中使用了泛型编程的思想,对我们常用的数据结构:顺序表、链表、树、哈希以及常用的查找、排序等算法使用模板进行了封装,而且从运行效率以及内存使用上都基本达到了优。引入STL后,再也不需要我们重新造轮子,...
原创
172阅读
0评论
0点赞
发布博客于 3 年前

每日一题(11)

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度解析: 1 / \ 2 3 / / \ 4 5 6 二叉树的深度,即为二叉树的高度,...
原创
91阅读
0评论
0点赞
发布博客于 3 年前

每日一题(12)

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针分析: 1 1 / \ / 2 3 2 ...
原创
79阅读
0评论
0点赞
发布博客于 3 年前

每日一题(13)

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的思路: 1. 如果二叉树为空树,则是对称的 2. 从其子树开始检测,如果根的左右子树: a. 根的左右子树均为空,则是对称的 b. 根的左右子树一棵为空,一棵不为空,则不对称 c. 根...
原创
92阅读
0评论
0点赞
发布博客于 3 年前

每日一题(14)

设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如果二叉树的序列化是从根节点开始,那么对应的而反序列化也是从根节点开始的。因此可以使用二叉树的前序遍历来序列化二叉树,当前序遍历碰到null值是,使用“#”表示,每一个节点的数值之间用“,”隔开。/*public class TreeNode { ...
原创
82阅读
0评论
0点赞
发布博客于 3 年前