自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rhwayfun专栏

在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛!公众号:技术视点

  • 博客(45)
  • 收藏
  • 关注

原创 数据结构基础

在Java研发工程师招聘中,数据结构与算法是必考的题目,不久看到一篇文章《为什么面试总喜欢考算法题》提到:面试考算法是一个基准点,因为算法是计算机学科中最基础的学科。本着不死也脱层皮的想法就买了本算法书开始啃,虽然其中很多题目我就是想破脑汁也想出来,可我居然能沉浸在这样的状态中自得其乐。“算法虐我千百遍,我仍待它如初恋”。 顺序存储结构顺序存储结构数据存在内存地址连续的一块区域,数组便是这种存储结

2016-03-29 09:48:02 1154

原创 MySQL系列之一:数据库设计

前言这里将以前不怎么熟悉的数据库设计知识重新拾起,做一个简单的知识梳理。之前一直认为数据库设计无非就是创建数据库、建表、添加字段、确定字段类型(这点随意性很大),诸如此类。当系统地对数据库知识重新学习的时候才发现数据库设计也有一套类似软件开发流程的规范,并且每一个步骤都是有不同的侧重点的。 数据库设计的概念简单来说,数据库设计就是对需求进行分析、逻辑设计、物理设计以及维护和优化的过程。可以看到,数

2016-03-29 09:43:06 6533

转载 深入探索Java 8 Lambda表达式

作者 Richard Warburton, Raoul Urma, Mario Fusco 译者 段建华 2014年3月,Java 8发布,Lambda表达式作为一项重要的特性随之而来。或许现在你已经在使用Lambda表达式来书写简洁灵活的代码。比如,你可以使用Lambda表达式和新增的流相关的API,完成如下的大量数据的查询处理: int total = invoices.stream()

2016-03-29 09:37:08 999 2

转载 网络协议系列之十二:互联网协议入门(二)

(接上文)七、一个小结先对前面的内容,做一个小结。我们已经知道,网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:发送这个包,需要知道两个地址:  * 对方的MAC地址  * 对方的IP地址有了这两个地址,数据包才能准确送到接收者手中。但是,前面说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知

2016-03-29 09:33:55 1054

转载 网络协议系列之十一:互联网协议入门(一)

前言我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理

2016-03-29 09:18:10 1127

原创 网络协议系列之十:TCP连接的建立与释放

TCP连接的建立(三次握手)1> 客户端发送(主动)一个SYN给服务端(相当于告诉服务端,我要打开连接了,你注意一下)。客户端的状态变化:CLOSED–> SYN_SENT,服务端状态变化:CLOSED–>LISTEN; 2> 服务端收到SYN报文,发送SYN+ACK两个报文给客户端,其中ACK报文是对客户端发来的SYN报文的确认(相当于告诉客户端,我收到你的连接请求了)。而这里的SYN报

2016-03-28 15:52:22 909 2

原创 网络协议系列之九:TCP计时器

在TCP中有四种计时器:重传计时器、持续计时器、保活计时器和TIME-WAIT计时器重传计时器在拥塞控制中有提到RTO——重传计时器。重传计时器是对发送出去的数据进行重传计时,如果在计时器超时后没有收到返回的ACK确认,发送端就会重新发送队列中重传报文。一般俩讲,使用RTO重传计时器有如下规则: 当TCP发送了位于发送队列最前端的报文段后就启动这个RTO计时器如果队列为空则停止计时器,否则重启计时

2016-03-28 15:48:54 1558

原创 网络协议系列之八:TCP差错控制

TCP的差错控制主要使用校验和、确认、超时重传这三个工具进行差错控制。校验和主要用来检验数据报文是否受到损伤。如果校验和无效,报文就会在终点被丢弃。确认是接收端用来证实确实收到了报文,在TCP中,使用的是累计确认,接收端会告诉发送端其下一个希望接收的字节编号。超时重传是差错控制的核心。实际上当发送端发送一段字节的数据后,会把这个报文段保存在一个队列中,并启动一个计时器,这个计时器也叫RTO(重传计时

2016-03-28 15:45:14 1909

原创 网络协议系列之七:TCP拥塞控制

拥塞控制是TCP传输中很重要的一环,TCP拥塞控制使用一个拥塞窗口以及拥塞策略来进行拥塞控制。在前面的流量控制中提到发送端的发送窗口取决于接收窗口,实际上,发送方的窗口大小是接收窗口与拥塞窗口中的较小值。拥塞窗口的大小又取决于网络的拥塞状况。而具体确定拥塞窗口大小则需要拥塞策略来决定。拥塞策略包括慢开始、拥塞避免、拥塞检测。TCP的一般是从一个比较小的传输速率开始,然后迅速增大到阈值,到达阈值后以一

2016-03-28 15:38:26 1309

原创 网络协议系列之六:TCP流量控制

TCP的流量控制就是TCP接收端对发送端发送多少字节的数据进行控制,防止接收端处理不及而丢失数据。差错控制就是保证接收端接收的数据是完整未受损伤的,是可靠性的重要保证。这里以TCP连接的建立过程说明流量控制,则流量控制的过程如下:TCP发送端向接收端发送一个SYN=1、seqNo=100的连接请求。这里的SYN=1表示一个建立连接的标志位,seqNo表示发送端发送数据的起始字节的编号是100接收

2016-03-28 15:21:36 1084

原创 网络协议系列之五:TCP简介

这里只是对TCP协议做个简要的介绍。TCP协议是基于流的可靠的传输层协议,不同于UDP协议,UDP不保证信息传输的可靠性。这就意味着应用程序把数据流交付给TCP后,要依靠TCP保证数据流完整、一致以及按序到达接收方的应用程序上。TCP主要通过差错控制机制保证可靠性的传输。1、差错控制机制包括校验和、确认、超时重传这三个工具。校验和主要用来检验数据报文是否受到损伤。如果校验和无效,报文就会在终点被丢弃

2016-03-28 15:18:39 977

原创 网络协议系列之四:IGMP、ICMP和ARP

前言IGMP协议是一个组管理协议,它帮助多播路由器创建以及更新与每一个路由接口相连的忠实成员列表(就是与该路由接口连接频率较高)。ICMP协议实际上就是差错控制协议,弥补了IP协议没有差错纠正机制以及差错报告的缺憾。ARP是一个地址映射协议,可以把一个IP地址映射为MAC地址。 IGMP协议1、IGMP是管理组成员关系的协议 2、IGMP报文分为成员关系报告报文和成员关系查询报文。成员关系查询报

2016-03-28 14:42:47 17913

原创 网络协议系列之三:IP

前言这篇博客主要对IP协议中一些基础知识点加以总结,并将书中一些晦涩难懂的部分去除了。IP地址协议是网络层中最重要的协议,IP地址协议可以对因特网上的所有设备进行唯一标识,也正因为有了IP协议,我们的计算机才能实现与全球任意一台设备进行通信。 同时这也是网络层存在的意义,我将对部分的内容分为两个部分加以总结:一、首先对IP协议部分的知识加以总结;二、对网络层其他的协议加以总结,包括ICMP、IGMP

2016-03-28 14:41:06 4246

原创 网络协议系列之二:HTTP(2)

这篇文章继续对HTTP协议进行说明。一个http事务包括客户向HTTP服务器发送请求以及服务器向客户端发送响应两个过程。根据事务的特点,这两个过程具有原子性,任何一个过程失败都会进行回滚(恢复事务之前的状态)。从请求与响应的角度出发,http的知识点都是围绕这两个角度展开的。每次客户的请求都会向服务器发送一个请求报文,请求报文的结构包括请求行、首部行、空行和请求体,一个http响应包括响应行、首部行

2016-03-28 14:38:43 2508

原创 网络协议系列之一:HTTP(1)

HTTP协议是web开发必须掌握的协议之一,文章的内容并没有按照教科书式对协议本身进行说明。这里特意将一些web开发遇到的常见问题进行了总结。也方便以后自己开发进行迅速查阅。1、Http的报文结构 http的报文分为请求报文和响应报文,请求报文结构包括:请求行、请求头、请求体;响应报文结构包括响应行、响应头、响应体。下图简要表示了请求报文的结构: 下面是我输入www.baidu.com获取的

2016-03-28 14:36:37 2927

原创 深入Java集合系列之五:PriorityQueue

前言今天继续来分析一下PriorityQueue的源码实现,实际上在Java集合框架中,还有ArrayDeque(一种双端队列),这里就来分析一下PriorityQueue的源码。PriorityQueue也叫优先队列,所谓优先队列指的就是每次从优先队列中取出来的元素要么是最大值(最大堆),要么是最小值(最小堆)。我们知道,队列是一种先进先出的数据结构,每次从队头出队(移走一个元素),从队尾插入一个

2016-03-28 14:23:58 10066

转载 深入Java集合系列之四:ConcurrentHashMap

术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 hash table 根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。

2016-03-28 14:18:38 1005 2

原创 深入Java集合系列之三:HashMap

前言无意中发现有很多对Map尤其是HashMap的线程安全性的话题讨论,在我的理解中,对HashMap的理解中也就知道它是线程不安全的,以及HashMap的底层算法采用了链地址法来解决哈希冲突的知识,但是对其线程安全性的认知有限,故写这篇博客的目的就是让和我对这块内容不熟悉的小伙伴有一个对HashMap更深的认知,为了让你更好的查看你感兴趣的内容,你也可以直接点击右边的文章目录进行阅读。 写这篇

2016-03-28 14:02:51 906

原创 深入Java集合系列之二:LinkedList

前言LinkedList底层使用的双端链表,即每个节点既包含指向其后继的引用也包括指向其前驱的引用,LinkedList实现了List接口,继承了AbstractSequentialList类,在频繁进行插入以及删除的情况下效率较高。LinkedList使用较多的是add、get和remove,源码的分析也将对这三个方法进行分析。add方法先看add方法:public boolean add(E e

2016-03-28 13:58:21 820

原创 深入Java集合系列之一:ArrayList

前言ArrayList也叫数组列表,底层使用的数组实现的,严格来说是动态数组。为了简化,我将从以下几个方面对ArrayList进行分析 常用操作的源码分析 使用场景与小结ArrayList工作原理ArrayList工作原理其实很简单,底层是动态数组,每次创建一个ArrayList实例时会分配一个初始容量(如果指定了初始容量的话),以add方法为例,如果没有指定初始容量,当执行add方法,

2016-03-28 13:52:53 1000

转载 设计模式系列之五:代理模式

代理模式代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。代理模式的结构有些情况下,一个客户不想活着不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有:1、抽象对象角色声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象2、目标对象角色定义了代理对象所代表的目标对象3、代理对象角色代理对

2016-03-28 13:39:12 639

转载 设计模式系列之十二:单例模式

前言1.描述Singleton(单例)是设计模式的一种,为了保证一个类仅有一个实例,并提供一个访问它的全局访问点。2.主要特点1)单例类确保自己只有一个实例(构造函数私有:不被外部实例化,也不被继承)。2)单例类必须自己创建自己的实例。3)单例类必须为其他对象提供唯一的实例。3.单例模式的应用资源管理器,回收站,打印机资源,线程池,缓存,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类如

2016-03-28 13:18:37 589

原创 设计模式系列之十一:装饰者模式

前言装饰者模式属于结构型设计模式,它可以动态地为对象添加额外的只能,就这点来看,装饰者模式比生成子类更加灵活。既然是结构型设计模式,那么装饰者模式的结构优势体现在哪里呢?有一个组件类,有一个具体的组件类,这个具体的组件类就是要被装饰的对象,还有一个装饰者类,其继承了组件类,对于组件类来说不需要知道这个装饰者类对象的存在,因为装饰者对象真正发挥作用的对象是具体的组件类。要注意的是,组件类和装饰者类都是

2016-03-28 13:13:52 640

原创 设计模式系列之十:命令模式

前言命令模式属于行为型设计模式。所谓命令,肯定有命令的发送者以及命令的接收者,命令模式则是命令本身封装成一个对象,从而使得命令接收者可以根据接收到的命令让不同的命令执行者执行具体的命令,使用命令模式可以让命令请求者排队并记录命令日志。命令模式可以使你可用不同的请求对客户参数化。很显然,通过使用命令模式可以较容易地设计一个命令队列,最重要的是命令模式把命令请求的对象与具体执行命令的对象分隔开了,这样具

2016-03-28 13:12:24 627

原创 设计模式系列之九:职责链模式

前言责任链模式属于行为型设计模式,所谓责任链,就是把责任处理对象连成一条链,这样当一个处理对象不能及时处理的时候就会交给下一个处理对象处理,直到被处理为止。就像我们找人签字盖章的时候,当一个对象不能处理的时候他会告诉你你应该下一个部门进行盖章,而如果下一个部门仍然不能处理就会继续告诉你下一个应该去的部门,直到把章盖好。这个例子不一定恰当,但是反映了责任传递这么一个过程。责任传递是责任链模式的核心,责

2016-03-28 13:11:02 634

原创 设计模式系列之八:适配器模式

前言适配器模式与外观模式一样,也属于结构型模式。适配器所谓适配就是定义了一个外界希望的接口,从而使得原来不能工作的那些对象可以一起工作。在软件开发中,如果希望复用一些类,但是需要复用的类与复用环境不符的时候,需要使用适配器模式。更具体的说就是当前系统的行为与数据都正确但是接口不符这样就需要使用适配器模式。从设计角度讲,适配器模式耐无奈之举。这么说也很好理解,因为当需要复用一些类的时候,如果不希望更改

2016-03-27 21:59:36 740

原创 设计模式系列之七:外观模式

前言外观模式属于设计模式中的结构型设计模式,所谓结构型,就是说外观模式更关注的系统的架构设计。使用外观模式使得子系统间的依赖达到最小,通过设置一个Facade外内外提供了了简单的屏障。外观模式为一组接口提供一个统一的界面,这个界面就是这组接口的高级接口,这个高级接口使得子系统更加易用。通常在软件设计中,尤其是OO,对实现细节的过多暴露是很不利于后期的扩展的。只有暴露的细节越少,进行功能的扩展才会更加

2016-03-27 21:58:14 708

原创 设计模式系列之六:策略模式

前言策略模式是设计模式中的行为型模式,所谓行为型就是其主要使用在方法有很大灵活性的情况。而之前的工厂模式主要是对创建对象的优化,减少程序中使用new对象的次数。策略模式在Java源码中也是很常见的,比如我们要比较两个对象的大小,既可以使用默认的Comparable接口,也可以实现自定义的比较规则,即实现Comparator接口。这两种比较比较方法都是不同比较规则的体现,属于不同的策略。策略模式从定义

2016-03-27 21:57:18 1042

原创 设计模式系列之四:观察者模式

前言观察者模式是属于设计模式中的行为型模式,所谓行为型就是指对象的动作发生改变,比如方法以及状态。那么观察者模式是一种什么模式呢?说白了,观察者模式解决的一对多的依赖关系,当一个对象的状态发生改变的时候,其他依赖此对象的对象会得到通知并且做出相应的改变。但从定义上还是很难理解。我们可以从一个简单的例子中更深地去体会观察者模式。 问题背景 某公司的两名职员在主管离开办公室后,一个在看股票,一个在

2016-03-27 21:56:06 1684 1

原创 设计模式系列之三:抽象工厂模式

前言在设计模式有三个模式是与工厂模式相关的,分别是:简单工厂模式、工厂方法模式以及抽象工厂模式。在前面的文章中已经谈到前面两种,这里就对抽象工厂模式介绍一下。抽象工厂模式就是提供一个创建一系列相关或者相互依赖的接口(也就是抽象类),而无需指定具体的类。简单来说,就是当我们需要创建一个具体的对象的时候,我们不必指定该具体的对象,只需要使用它的上层接口直接调用就行。好像还是很抽象哦,好吧,为了更清晰领悟

2016-03-27 21:54:31 906

原创 设计模式系列之二:工厂方法模式

前言前一篇博文中介绍了简单工厂模式,这里再介绍一下工厂方法模式。与简单工厂很像,那么两者的区别是什么呢?在这篇博文中,首先会简单介绍一下工厂方法的使用方法,并对工厂方法模式进行简单的小结。最后,将结合具体的例子对比简单工厂模式与工厂方法模式,并对两者的使用场景做一个小小的归纳。 问题背景背景: 某公司开发了一个A软件,数据库使用的是SQLServer。后由于客户要求需要使用Oracle数据库,原来

2016-03-27 21:52:46 803

原创 设计模式系列之一:简单工厂模式

前言设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码say goodbye!在所有的的设计模式中,简单工厂算是我们平时接触比较多的吧,多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式,简单工厂模式要解决的首要问题就是降低程序之间的耦合度,通过Java中的封装、继承与多态实现解耦。通过使用简单工厂模式,我们设计的代码更易于维护和复用 问题背景在进入正题之前我们先看一下

2016-03-27 21:50:54 1062

原创 深入理解JVM之一:Java内存区域

前言Java虚拟机运行时数据区分为以下几个部分: 方法区、虚拟机栈、本地方法栈、堆、程序计数器。如下图所示: 程序计数器程序计数器可以理解为当前线程执行的字节码的行号指示器,字节码解释器就是通哟改变这个值来获取需要执行的下一条需要执行的字节码指令。对于多线程来说,每条线程都有自己的程序计数器,这样各线程之间的计数器互不影响,这类内存区域也叫作“私有内存”(可以看到其实并不是私有的),之所以这么设

2016-03-27 21:41:00 1533

原创 深入理解JVM之二:垃圾收集器概述

前言我们知道Java的内存区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,而且其中的程序计数器、虚拟机栈和本地方法栈都是线程独立的,也就是说这三块内存区域的生命周期与线程是同生共死的。栈中帧栈在类结构确定的时候就已经知道该分配多少内存了,所以当线程结束的时候,内存也跟着一起回收了,从这个角度看,这三块的内存区域的内存分配和垃圾收集就比较固定了。反观Java堆和方法区,比如我们定义一个接

2016-03-27 21:40:17 1146

原创 深入理解JVM之四:详解垃圾收集器

前言前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.7版本的)。在Hotspot中,虚拟机的收集器主要有下:可以看到垃圾收集器是按对象的分代来划分的,可以用线条连接

2016-03-27 21:39:24 4319

原创 深入理解JVM之三:垃圾回收算法

前言垃圾收集算法是JVM中垃圾收集器的方法论,所以了解算法是必要的,在算法领域只做最简单的介绍,力求文章的简单易懂。垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。随着jdk版本的升级,垃圾收集器也在不断的升级,现在最新的垃圾收集器已经能够对Java堆中一部分进行回收,也能够对Java堆中另一部分进行回收,这

2016-03-27 21:38:40 1780

原创 深入理解Tomcat系列之七:详解URL请求

前言这里分析一个实际的请求是如何在Tomcat中被处理的,以及最后是怎么样找到要处理的Servlet的?当我们在浏览器中输入http://hostname:port/contextPath/servletPath,前面的hostname与port用于建立tcp连接,由于Http也是基于Tcp协议的,所以这里涉及TCP连接的三次握手。后面的contextPath与servletPath则是与服务器进行

2016-03-27 21:32:16 8467 2

原创 深入理解Tomcat系列之六:Servlet工作原理

前言Servlet是Web开发中的核心技术,作为一名合格的开发人员,就必须清楚Servlet的工作原理。本章没有对Servlet技术本身进行详细的说明,只是针对开发过程中一次Servlet的请求的处理过程进行分析的。Servlet实际上就是一个java类,只不过可以和浏览器进行一些数据的交换。有Servlet类就有管理Servlet的容器,种类有很多,这里主要针对Tomcat对Servlet的工作原

2016-03-27 21:31:23 10788

原创 深入理解Tomcat系列之五:Context容器和Wrapper容器

前言Context容器是一个Web项目的代表,主要管理Servlet实例,在Tomcat中Servlet实例是以Wrapper出现的,现在问题是如何才能通过Context容器找到具体的Servlet呢?在解决这个问题之前,Context容器需要先启动,启动的过程就是加载个类资源文件以及打开子容器以及Pipeline管道的过程。启动Context容器后,就可以处理具体的请求了,具体是通过Request

2016-03-27 21:30:22 6728

原创 深入理解Tomcat系列之四:Engine和Host容器

前言终于到Container容器了,上面说到Connector把封装了Request对象以及Response对象的Socket传递给了Container容器,那么在Contianer容器中又是怎么样的处理流程呢?在说Container容器之前,有必要对Container容器有一个简单的了解,Container容器是子容器的父接口,所有的子容器都必须实现这个接口,在Tomcat中Container容器

2016-03-27 21:29:23 11684 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除